使用模式匹配查找对 vtable 中偏移量的特定调用

逆向工程 二元分析 x86 工具 静态分析
2021-06-26 08:38:26

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

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

现在,我还在寻找对调用写入寄存器的 this 的引用,因为这表示特定函数指针的偏移量。

问题是我看到了与我正在查看的二进制文件有数千个匹配项。据我所知,函数指针也可以传递到 X 层的其他一些函数,然后在那里调用。这显然会造成显着的复杂性。

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

2个回答

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

call dword ptr [esi+30h]

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

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

显然,您错过了正则表达式/搜索模式中的一些潜在“并发症”:

  1. 可以在多个指令中添加偏移量(想想看lea eax, [ecx+20h] ; mov eax, [eax+10h])。
  2. 指令可以在不相关的指令之间交错以进行流水线优化。
  3. 不相关的指令可以覆盖相关的寄存器,导致误报。

还有其他一些并发症......

这是说您的问题可能看起来很无辜,但实际上您触及了一个复杂而困难的主题。