确定 .NET 程序集的控制流?

逆向工程 。网
2021-07-06 19:52:46

使用 DnSpy 很棒,但是确定可执行文件的控制流非常尴尬。有没有人能够就显示控制流图的免费有用应用程序提供建议?

IDA Home 不适用于 .NET 程序集,遗憾的是 Radare2 也不适用于。

希望有人能告诉他们他们在做什么?

1个回答

所以我认为这将是一个不错的宠物项目,所以我开始构建一个 PoC 工具,它可以为 .NET 程序集中的给定方法生成 CFG。

PoC 用于Mono.Cecil检查二进制文件并以 DOT 语言生成图形,然后可以使用dot工具将其转换为图片并在 IL 级别工作。

一点技术信息。

首先,它通过检查操作码和检查控制流类型来确定领导者——将成为基本块 (BB) 中第一条指令的指令:

  • 如果指令的控制流类型是类型Return- 下一个(如果存在)将是领导者。
  • 如果指令的控制流类型是 type Branch- 分支指令的目的地将是一个领导者
  • 如果指令的控制流类型是类型Cond_Branch- 分支和下一条指令的目的地将是领导者。

同样,我们可以在这些 BB 之间构造边,根据流的类型会有不同的输出边:

  • 如果指令的控制流类型为 type ,Return则不会有输出边缘
  • 如果指令的控制流类型是 type ,Branch那么从当前指令的 BB 到分支的目标 BB 将有一个传出边
  • 如果指令的控制流类型为 type Cond_Branch,则将从当前 BB 到 BB 的目的地Cond_Branch和到下一条指令的 BB 的传出边

我们需要做的唯一一件事就是在 DOT 语言中生成一个图形定义。

通过以下方式调用该工具

./cfg.exe Mono.Cecil.dll Mono.Cecil.MetadataBuilder.AddCustomDebugInformations | dot -Tpng -o cfg.png

将为我们生成一个“漂亮”的 CFG 方法AddCustomDebugInformations

对于一些奇怪的(或正常的)边缘情况,它可能会失败,当然还有很多需要改进的地方,但整体 CFG 是存在的;)

链接到 repo:https : //github.com/pawlos/cfg