从机器代码构建控制流图

逆向工程 拆卸 部件 机器码
2021-06-27 15:44:54

我想自己写一个soft,可以反汇编代码,把它变成控制流图。现在我知道了图论的基础知识,但我不知道我应该从哪里开始,我是否需要基本上保持对所有call, jmp, ret,jxx指令的跟踪以检测单个指令块以将代码块制作成图节点?有人可以给我踢从哪里开始吗?

3个回答

这可能有多种方式,具体取决于您想使用第三方软件的方式。例如,您可以使用流反汇编器diStorm来实现线性反汇编。当您必须跟踪所有分支目标和进度时,从入口点开始一个接一个。

如果您想跨平台进行此操作,您甚至可以使用VEXREIL等中间语言

但请记住,找到要反汇编的下一个分支并不总是那么容易:您会遇到不透明谓词和间接分支的问题……此时您可以实施和评估数据流分析,但这会走得很远。

一些概念:

线性反汇编:从给定的偏移量开始并继续。你可以从之前的指令长度中得到下一个地址的开始。

递归反汇编:从入口点开始在每个分支目标处开始线性反汇编。

启发式反汇编:该术语通常描述递归反汇编的所有改进,例如通过检测跳转表、opque 谓词或代码段的推测反汇编以发现更多代码。

祝你好运

其他人已经描述的技术是众所周知的,但不幸的是在许多情况下是不正确的。当前最先进的反汇编技术正在使用我们所说的“符号执行”。

基本上,您将需要收集每个汇编指令的语义并探索程序可能执行的每个分支,当您遇到选择(if语句)时,您将询问从所有这些指令的堆叠中构建的公式是什么是获得 atrue和 a的条件false它将为您提供可行的路径和相关的输入,您需要用它来提供程序以到达该测试true分支或false分支。

这种技术设置起来非常痛苦,因为您需要获取您正在考虑的程序集的每条指令的完整语义。但是,事实证明,它在一般程序中非常值得信赖且非常有效。

这里有几个链接:

Norwald 的回答更好地解释了默认反汇编策略。但是,我想分享我关于一个变形病毒的已停产项目的经验,该病毒反汇编二进制代码并找到 ROP 链以在语义上制造相同的病毒。

您可以使用Capstone Framework进行反汇编和GraphViz进行可视化。

对于语义分析策略,您可以在反汇编所有 .text 部分后向后检查代码并找到分支指令。之后,您可以使用与分支指令关联的跟踪数据来跟踪分支。例如:

跟踪分支指令

我希望这个对你有用。