如何检测混淆器?

逆向工程 混淆 开箱
2021-06-20 09:52:50

我猜测像 PeiD 这样的工具通过在打包的二进制文件中寻找签名和测量熵来检测打包程序。是否还有其他工作试图根据二进制文件的某些属性来确定二进制文件是否以某种方式被混淆?这是否能够像 olvm 那样检测控制流混淆?

2个回答

我不会说混淆检测与熵严格相关。当我检测到混淆的代码区域时,我通过对特定汇编命令出现的概率进行简单的统计比较来做到这一点。

例如,在带有控制流混淆的二进制文件中,跳转相关命令的数量将显着增加。在具有不透明谓词的二进制文件中,算术相关命令的数量将显着增加。当应用此类混淆时,某些特定代码序列的数量例如jmp $+5push addr; ret将显着更大。

这些启发式通常在未打包的代码上工作得很好(但是,打包代码可以通过熵测量和与众所周知的打包程序相关或含义未知的段的存在来检测)。

我认为,一般来说,可能很难将混淆代码与编译器生成的代码区分开来,要么非常糟糕,要么非常好。

  • 一个在代码生成/优化方面做得很糟糕的编译器会生成各种不必要的/死的指令。
  • 作为导致难以理解代码的高级优化示例,请考虑Massalin 在超级优化器上的工作,以及 GCC 使用 SSE2 指令和/或积极的指令调度,例如,在gcc -Ofast 下Switch 语句会导致各种有趣的代码生成可能性,这些可能性看起来很像混淆。

混淆的极端情况相对容易检测。但是试图隐身的混淆器并不容易被发现。