假设我正在寻找一个非常简单的模式。例如。下面的正则表达式

mov.*(eax|edx|ecx|esi|edi), \[(eax|edx|ecx|esi|edi)\+30h\]
指针。

问题是我正在查看与二进制文件匹配的数千个匹配项。就我所知,函数指针也可以向下X层传递给其他函数,然后在那儿调用。显然,这会造成相当大的复杂性。

是否有任何工具可以使用上述正则表达式来搜索匹配项,还可以查找(直到特定的调用深度和/或指令计数)匹配的指令)调用实际寄存器?

评论

您的意思是使用该第一个寄存器的直接下一条指令是调用...(目标寄存器)?

是的,对不起,如果听起来含糊。但不一定要立即执行下一条指令。

#1 楼

有时,呼叫可以在没有中间负载的情况下执行,例如

call dword ptr [esi+30h]


对于跟踪加载到寄存器中的值,这是一个数据流分析问题,仅使用模式匹配是无法解决的(琐碎情况除外) 。您应该研究数据流分析理论,例如涉及指令的中间表示(IR)。恐怕仅一个帖子就无法覆盖。

#2 楼

如果您经常发现自己做类似的事情,则可能需要阅读有关中间表示的信息。在逆向工程的上下文中,这些语言是从汇编中派生的,并用作易于编辑和搜索的抽象层。

很显然,您在正则表达式/搜索模式中错过了一些潜在的“复杂性”: 。
指令可以在不相关的指令之间插入指令以进行管道优化。
不相关的指令可以覆盖相关的寄存器,从而导致误报。
这是说您的问题看似无辜,但实际上您碰到了一个复杂而困难的话题。