我有一个库DLL和一个使用该库的程序(静态;该DLL是单独的)。

我的目标是从程序的库中找到许多函数,但是不幸的是,它们看起来是用不同的编译器/非常不同的选项编译的,从而十六进制扫描不成功。我通过字符串/顺序发现的内容有所不同,因为该程序具有push / pop ebp shell,通常使用不同的寄存器,有时使用不同的操作码,但最终它们完成相同的操作。

是否有任何工具/技术可以帮助我找到其他一些功能?当然,在DLL中,函数在大多数情况下是彼此相邻的,但是在程序中它们是混合在一起的,因此很难找到任何不包含字符串的函数。

评论

您可以尝试github.com/joxeankoret/diaphora。

#1 楼

有几种工具可以实现此目的。首先,IDA具有识别编译器(和编译器属性)的机制。这不是主要功能,但可能会提供您所需的内容。
Options -> Compiler...将打开一个对话框,您可以手动设置与编译器相关的属性,并为某些广泛使用的编译器使用预配置的默认值。
如果IDA被识别正在使用的编译器,打开对话框时将相应地填充这些值。
以下是屏幕截图:

PEiD
PEiD是最广泛使用的打包程序之一检测工具。它具有多个插件和其他可下载的签名。它(与许多打包程序检测器一样)具有的功能之一就是编译器识别。

Detect It Easy
Detect It Easy(AKA DiE)是另一种非常高级的打包程序检测,具有很好的编译器检测功能。签名和算法。虽然PEiD感到有些被抛弃,但DiE仍然吸引了开发人员的注意。

语言2000
与这里提到的其他工具不同,语言2000是一种专门为编译器检测而构建的旧(但功能性)工具。我从未使用过它,但它应该是很好的。封隔器检测工具列表。

#2 楼

我认为Sibyl可以为您提供帮助。

这是一个功能划分工具。这个想法是要识别功能的副作用。这样,标识就独立于所使用的实现。