函数调用指令
条件跳转(分支)指令
二进制文件可以是任何CPU体系结构,例如x64,ARM,MIPS,摩托罗拉68K等。
最好使用反汇编工具提供中间表示/语言。
我发现有几种候选选项,例如IDA Pro,Binary Ninja,Radare2,Capstone,Angr和Bap。
最后感觉Radare2是实现该功能的好工具。
但是我在Internet上搜索,大多数教程都显示了如何研究特定功能(例如main)的特定代码。 br />如何在拆卸后直接获得整个IR(称为ESIL)?
或对完成此任务有何建议?
#1 楼
您还可以使用Ghidra脚本执行此操作:使用
InstructionIterator
遍历指令,使用
FlowType
获得指令的getFlowType()
使用Ghidra的
isCall()
和isConditional()
方法Ghidra是免费的开放源代码,这种方法适用于各种体系结构。
#2 楼
您可以使用angr
及其IL-vex
来完成此操作。 一般的逻辑是:
从二进制文件创建angr项目。
创建angr cfg。
在所有cfg节点上运行。
从cfg节点获取每个指令的vex表示。
在每个指令表示上,检查其
jumpkind
。例如,无论CPU架构如何,'Ijk_Call'
都是一个呼叫。
评论
您是说目标受到保护是什么意思?此外,是否有任何方法可以混淆动态值?
–我不知道
19-10-12在4:02
因此,您本质上想要的是用二进制代码构建代码的控制流图(CFG)。实际上只有两种方法可以做到这一点-静态或动态。使用静态方法(特别是使用反汇编程序库处理所有代码段,跳过代码中的数据等)是最快,最简单的实现方式。但是,如果目标受到保护(即混淆,虚拟化等),则静态分析通常会完全中断,因为有太多情况会破坏反汇编程序。
–Pickle Rick
19-10-13在0:37