假设库X是静态链接的,那么是否有一种方法可以以可接受的置信度知道在二进制文件中是否使用了它的函数?

将库函数从反汇编转换为抽象表示,以检索控制流结构,函数和系统调用,并按照它们出现的顺序将它们保存到数据结构中。
重复该过程二进制文件中的每个静态链接函数。
尝试找到我感兴趣的库函数的表示形式与二进制文件中的表示形式之间的相似性。

它可以工作,但可能可以做得更好,我担心我会丢失使用特定编译器设置和/或混淆的代码。例如,如果设置了一个优化标志,并且在同一块完整的代码段中连接了两个或多个函数,那么我的方法就会错过它。另外,它的时间效率也不高,这在我需要针对数百或数千个库分析大型二进制文件时成为一个问题。

我想为整个二进制文件而不是单个二进制文件生成AST函数,并将其部分与库函数的表示形式进行匹配。有没有通用的技术可以做到这一点,可能已经在公开可用的工具中实现了?有更好的主意吗?

我已经知道生成抽象表示的工具。我对匹配部分更感兴趣,或者理想情况下,对同时做这两个工具的工具更感兴趣。这些对混淆/优化有效吗?

编辑2:@HamZa提到了在某些情况下构建AST的困难,并提出了一种混合方法,例如不幸的是,符号执行无法很好地扩展。此外,他还向我指出了这一点和本文。

编辑3:这可能是一个选项,但不是封闭源二进制文件(即使涵盖了某些体系结构的汇编代码)。另外,它是作为Internet服务提供的,我不希望每秒对不同的库执行数千次检查。

评论

syssec.mistakenot.net/papers/eurosp-2017.pdf,github.com/uxmal/nucleus,binary.ninja/2017/11/06/…

您不断添加基本上是您问题的答案的编辑,所以我不确定您还期望其他什么答案...

编辑1是一个附加的(相关)问题。编辑2和3是可能的解决方案,但是我解释了为什么它们不符合我的需求,所以我添加了它们,因为它们对于其他有相同问题但有不同特定需求的人很有用。

#1 楼

只要可以找到类似版本的libc的静态库,就可以使用IDA Pro的FLIRT签名。通常不会混淆该代码,因为将使用系统的libc.a。可以从源代码编译libc并使用混淆,但这不是您通常会遇到的。
我有一个脚本(下面的链接),我可以用来生成“ .sig”文件,您可以放入IDA Pro的sig/pc(或sig/arm或最相关的东西)并通过File > Load File > FLIRT Signatures加载FLIRT签名。
在macOS上,该目录例如:/Applications/IDA Pro 7.5/ida.app/Contents/MacOS/sig/pc
一旦加载了FLIRT签名,您可以查看对于您对IDA感兴趣的任何符号。
[1]:https://gist.github.com/zachriggle/130e01cf4541615e2062ca66d1637a07