我将为AArch64交叉编译的参考精灵加载到IDA Pro IDB2pat中以生成.pat,然后通过sigmake处理。 )来处理商业图像,但是即使我知道要检查的二进制文件是基于我用来构建生成的参考精灵的参考源构建的,它也只能识别(数百个)一个或两个函数。 pat(然后是签名)。

商业精灵将所有调试/编译器信息剥离了……非常残酷,所以我不得不猜测它是用什么gcc编译的,然后交叉编译参考源使用此猜测的gcc版本。

我的问题是,构建elf生成签名时,编译器版本有多重要?如果我得到的版本不正确,我的所有签名都会根本无法匹配我正在使用的目标二进制文件吗?

#1 楼

是的,正确的编译器版本以及编译选项非常重要。不同版本的编译器可能具有截然不同的寄存器分配器或优化算法,这可能导致同一源的二进制文件非常不同。此外,idb2pat可能未针对AArch64进行调整,并且可能未正确标记可重定位的字节,从而导致限制模式过多。更好的选择是从带有.o的目标文件(.a)或静态库(pelf)生成模式,因为它可以使用重定位信息标记通配符字节。建议使用直接的人类直觉和函数/字符串文字之间的引用,手动将其与源代码进行匹配。这可能比找到正确的编译器版本和选项要快。 />如果需要大规模扩展,则需要收集许多编译器版本,并尝试各种会影响代码生成的选项(至少是优化级别,即-O0, -O1, -O2, -O3)。您还应该尝试使用其他编译器,例如llvm / clang(公共版本和ARM的定制版本)。一个编译器和一组选项,以匹配您在二进制文件中看到的代码。

评论


伊戈尔,是的,我正在使用Diaphora,但这并没有很大帮助,有点。我可以看到一些相似之处,谢谢您的出色建议。在没有成功的情况下,建立了许多工具链的参考。.您的建议非常有帮助,并将报告任何进度。

–嗨,罗
18-10-10在13:53