我想自己写一个soft,可以反汇编代码,把它变成控制流图。现在我知道了图论的基础知识,但我不知道我应该从哪里开始,我是否需要基本上保持对所有call, jmp, ret,jxx指令的跟踪以检测单个指令块以将代码块制作成图节点?有人可以给我踢从哪里开始吗?
从机器代码构建控制流图
逆向工程
拆卸
部件
机器码
2021-06-27 15:44:54
3个回答
这可能有多种方式,具体取决于您想使用第三方软件的方式。例如,您可以使用流反汇编器diStorm来实现线性反汇编。当您必须跟踪所有分支目标和进度时,从入口点开始一个接一个。
如果您想跨平台进行此操作,您甚至可以使用VEX或REIL等中间语言。
但请记住,找到要反汇编的下一个分支并不总是那么容易:您会遇到不透明谓词和间接分支的问题……此时您可以实施和评估数据流分析,但这会走得很远。
一些概念:
线性反汇编:从给定的偏移量开始并继续。你可以从之前的指令长度中得到下一个地址的开始。
递归反汇编:从入口点开始在每个分支目标处开始线性反汇编。
启发式反汇编:该术语通常描述递归反汇编的所有改进,例如通过检测跳转表、opque 谓词或代码段的推测反汇编以发现更多代码。
祝你好运
其他人已经描述的技术是众所周知的,但不幸的是在许多情况下是不正确的。当前最先进的反汇编技术正在使用我们所说的“符号执行”。
基本上,您将需要收集每个汇编指令的语义并探索程序可能执行的每个分支,当您遇到选择(if语句)时,您将询问从所有这些指令的堆叠中构建的公式是什么是获得 atrue和 a的条件false。它将为您提供可行的路径和相关的输入,您需要用它来提供程序以到达该测试的true分支或false分支。
这种技术设置起来非常痛苦,因为您需要获取您正在考虑的程序集的每条指令的完整语义。但是,事实证明,它在一般程序中非常值得信赖且非常有效。
这里有几个链接:
- Manticore 魔术;
- 符号执行技术综述;
- 用于查找错误的符号执行;
- Triton:动态二元分析;
- 愤怒;
- ... 好多其它的 ...
其它你可能感兴趣的问题
