获取多架构二进制文件的特定指令数

逆向工程 拆卸 雷达2 手臂 米普 愤怒
2021-06-12 05:48:21

我需要得到一个 ELF 二进制文件的总数

  1. 函数调用指令
  2. 条件跳转(分支)指令

二进制文件可以是任何 CPU 架构,如 x64、ARM、MIPS、摩托罗拉 68K 等。

如果反汇编工具可以提供中间表示/语言,那将是最好的。

我发现有几个候选选项,比如 IDA Pro、Binary Ninja、Radare2、Capstone、Angr、Bap。

最后觉得 Radare2 是实现这一点的好工具。但我在互联网上搜索,大多数教程都展示了如何研究特定函数(例如,main)的特定代码段。反汇编后如何直接得到整个IR(称为ESIL)?

或有关完成此任务的任何建议?

3个回答

您也可以使用 Ghidra 脚本执行此操作:

  • 使用指令遍历指令 InstructionIterator

  • 得到指令的FlowType使用getFlowType()

  • 使用 GhidraisCall()isConditional() 方法

Ghidra 是免费的、开源的,这种方法适用于各种架构。

您可以使用angr和他们的 IL -来做到这一点vex

一般的逻辑是:

  • 从二进制文件创建 angr 项目。
  • 创建 angr 配置文件。
  • 在所有 cfg 节点上运行。
  • 从 cfg 节点获取每条指令的 vex 表示。
  • 在每个指令表示中,检查其jumpkind. 比如'Ijk_Call'是一个调用,与CPU架构无关。

这实际上是一个非常有趣的问题,有多种选择,并且都有需要克服的问题。我对 ELF(这里主要是 Windows)不是很熟悉,但无论如何文件格式都不应该有任何区别。在许多情况下,静态分析抓取代码段(可以从文件格式中检索)并使用反汇编程序库(例如 DiStorm)就足够了。为此,您需要一些足够聪明的东西来跳过代码中的过去数据(即嵌入式跳转表)。符号执行是另一种选择,但是如果您根据某些动态值混淆了控制流分支,会发生什么?然后在将完整的垃圾扔到所有需要跳过的代码中的情况下,还有进一步的混淆。也可以使用运行时调试,当然有自己的缺陷,即限制只跟随已执行的分支、速度和逃避检测。我会说在大多数情况下,最简单的解决方案是编写自己的静态分析工具或利用 IDA 脚本之类的东西。假设您的大多数目标基本上都没有混淆,这应该是一个有效且几乎通用的工具(每个 CPU 实现)。如果您的目标受到保护,那么像 angr 这样的东西可能更适合您的需求。如果您正在处理虚拟化,那么这是一个完全不同的问题,值得自己回答。假设您的大多数目标基本上都没有混淆,这应该是一个有效且几乎通用的工具(每个 CPU 实现)。如果您的目标受到保护,那么像 angr 这样的东西可能更适合您的需求。如果您正在处理虚拟化,那么这是一个完全不同的问题,值得自己回答。假设您的大多数目标基本上都没有混淆,这应该是一个有效且几乎通用的工具(每个 CPU 实现)。如果您的目标受到保护,那么像 angr 这样的东西可能更适合您的需求。如果您正在处理虚拟化,那么这是一个完全不同的问题,值得自己回答。