在 ASM 中进行静态代码分析时如何找出功能?

逆向工程 拆卸 二元分析 静态分析
2021-06-20 10:23:10

在对反汇编的应用程序进行静态代码分析时,我通常最终会看到许多对寄存器的调用(例如 CALL EAX),这些调用是在运行时构建的,这让我对如何决定/弄清楚代码在运行时执行的操作一无所知通话完成。

我想知道在动态分析可能不是一种选择的极端情况下,你们如何解决这个问题。

2个回答

去年,我为一个用 C++ 编写的大型复杂恶意软件发布了一个 IDB,它经常使用虚函数,产生间接调用指令的模式,就像你的问题所讨论的那样。我完全静态地进行了该分析,今年晚些时候我可能会发布更多类似的 IDB,这些 IDB 也是通过静态分析完成的。

对您的问题的简短回答是,您需要弄清楚间接调用将在运行时解决的位置。C++ VTables 使这个过程特别简单。如果您能找出在间接调用处使用的基类型,那么根据 C++ 类型系统的规则,从该基类型派生的任何类都可以在运行时合法地替换该基类型。换句话说:

  1. 为正在分析的程序重建继承层次结构。
  2. 对于每个具有 VTable 的类,确定其对应 VTable 的地址。
  3. 在分析程序时,确定程序中使用的类型的范围。
  4. 在任何给定间接调用的调用点,结合以上所有信息来确定可能使用的类型集、这些类型的 VTable 的地址,以及间接调用的目的地集。

10 年前在类似的情况下有一个不好的做法(这是一个混淆的恶意软件代码,我无法使用调试器进行分析),我尝试编写一个简单的 CPU 模拟器来运行该代码(因为那时我没有得到一个可用的开源代码或库,所以我决定了一个简单的)

现在我们有一些 CPU 模拟器引擎/框架(独角兽引擎,...),所以你可以用类似的更简单的方式尝试 :) 或者如果代码“简单”,你可以像调试 shellcode 一样转储并尝试调试它。