背景
由于标题是不言自明的,因此我想将任何体系结构(例如x86,ARM,ARM Thumb)的二进制文件转换为中间语言,以便进行独立于拱的静态分析。
要确切地说,我的工作仅限于Android平台APK文件中提供的共享对象。我希望IL可以满足的基本要求如下(实际上,我的目标是从APK文件中提供的给定.so文件中提取信息流)。

二进制切片
PDG(CFG / DFG)
得到其维护者或其社区的大力支持

为此,我研究了下面列出的一些现有工具,但不幸的是,我不确定是否我可以使用它们来显示信息流与否。


OpenREIL:该项目的目的是将依赖于拱的二进制文件提升到REIL中。

Barf项目:一个多平台的开源二进制分析和逆向工程框架

顶点:一个反汇编框架。
史诗:该工具将任意拱的二进制文件转换为独立于拱的LLVM位代码。 (此项目不是公开的,所以我不能使用它。)

问题
那里是否有任何IL用于我静态分析与拱有关的.so文件(在APK档案中) )以提取信息流?基本上,我希望它提供切片和PDG等基本要求。

评论

此处的结果可能会有所帮助:google.com/…“

您还可以尝试github.com/zaddach/libqemu,尽管它处于早期阶段。

虽然不是任意的,但是bap似乎支持将arm和x86提升到bil。

#1 楼

我的建议是使用libVEX,因为它是我所知道的最健壮的中间代码库。它是Valgrind的一部分,支持大量架构。您可以在C / C ++程序中使用libVEX,或者使用称为PyVex的Python绑定。

在任何情况下:请考虑您要做的大多数事情必须从头开始实现。我会说,除了将汇编“方言”翻译成中间表示之外的所有内容。或者,也许您可​​以使用Angr Project的某些部分。我还没有亲自测试过。

祝你好运!

评论


VEX现在可以处理标志计算吗?他们忽略了语义信息,使其在某些静态分析用例中不可行

–诺德瓦尔德
16-09-28在7:19

是的,它确实执行标志计算并调用内部检查功能来确定是否应根据转换后的标志进行跳转。

– joxeankoret
16-10-3在7:39

可悲的是,vex仍然不能以自己的语法来表示所有标志计算,仍然是惰性的辅助函数。 :/除非您自己解析所有语义信息,否则您不会从中获得语义信息。

–诺德瓦尔德
16-10-4在5:11

啊,是的,这是真的。但是,我不明白为什么它会引起大问题。您能给我一个例子,其中VEX计算标志+手动计算可能会出现问题吗?还是仅仅是因为您必须重新发明轮子而令人讨厌?

– joxeankoret
16-10-4在10:28

它更多关于重新发明轮子。 VEX会在内部解决其助手功能。使用此信息的大多数项目(例如angr)最终都会重新实现所有帮助程序功能。

–诺德瓦尔德
16-10-4在11:26

#2 楼

Radare2可能就是您要寻找的东西:

https://github.com/radare/radare2

它们将所有内容提升为一种称为ESIL的中间语言,以便可以容易模仿。可以通过它们的库或C,Python等中的绑定以编程方式访问,分析和驱动此代码。它们具有比您甚至提到的更多的体系结构和文件格式。您也许可以用它来做您需要的一切。

#3 楼

我审查了我正在从事的项目的大约14个中间表示形式。似乎任何作者(甚至是博士学位和硕士论文)都发现所有其他现有的IR都缺乏并发明了自己的IR。后端。话虽这么说,它使用辅助功能来进行标志计算之类的事情,因此可能会省略语义信息。一些社区项目使这一概念得以实现,但引入了自己的REIL扩展。
由于静态分析在大部分繁重的工作中都需要SMT,因此我们将IR转换为逻辑公式,并将其用作一种中间表示。
例如:
pop eax


esp = esp -4
[esp-4] = eax


评论


嘿,诺德瓦尔德,请问您最终是否雇用了REIL?如果是这样,为了使其能够执行符号执行(需要提到SMT求解器),还需要执行多少额外的工作?谢谢!

– lllllllllllll
17年1月1日在16:19

一系列的REIL实现(例如BARF)已经包含对语句求解器的转换。只需在此处查看示例:github.com/programa-stic/barf-project/tree/master/examples/…

–诺德瓦尔德
17 Mar 1 '17 at 16:23

那很棒!非常感谢您提供资源。

– lllllllllllll
17年1月1日在20:22

顺便说一句:请问您建议使用什么“前端”?我有最新的IDA-Pro + Binnavi ...

– lllllllllllll
17年1月1日在20:23

嘿,我们在这里使用内部解决方案,因为适当的cfg对于数据流分析至关重要,但是使用IDA可能会很好。我建议您远离繁重的工作(例如制作一个导出插件)。

–诺德瓦尔德
17 Mar 2 '17 at 6:07

#4 楼

我想将BAP添加到您的列表。免责声明,我是作者之一。
我们刚刚发布了1.0.0版本。这是我们第十次公开发布(经过大约十年的内部开发)。尽管我们的目标受众是专业研究人员和政府机构,但我们仍然拥有相当不错的独立研究人员社区。我们还对gitter渠道以及我们的问题跟踪器做出了快速响应。

我们的中间表示形式具有正式指定的语义,并且我们的提升器已通过我们的验证框架进行了深入验证。如今,我们的升降机支持许多架构-x86,x86-64,mips32,mips64,powerpc32,powerpc64和armv7。

至少不提及Radare2和Angr的其他库是不公平的。

Radare2的中间表示形式称为ESIL。它不是人类可读的(除非您是Forth程序员),但是据信它是有效的。他们至少支持5种架构(ARM,x86,GameBoy和8051)。

Angr将VEX库(即GPL版)用于提升器,因此它们对5种架构(x86,arm,mips,ppc,s390)具有开箱即用的支持。 VEX语言也不可读(尽管它仍然比ESIL更好),并且失去了一些精度。我们在BAP的前身中使用了VEX,但很多年前转移到了我们自己的升降机上。

#5 楼

几个月前,我有一些相关研究。我对您的所有要求都不了解。但是,我认为您可以关注Jakstab。它支持分析Linux ELF文件并生成控制流图。通常,您需要修改Jakstab才能进行研究。