Metasm是一个用 Ruby 编写的程序集操作套件。它确实提供了一个非常广泛的 API,用于从二进制程序中反汇编和提取 CFG 表示。
我想知道使用什么算法来提取CFG。这是通常的线性扫描还是递归遍历,还是另一种算法?
Metasm是一个用 Ruby 编写的程序集操作套件。它确实提供了一个非常广泛的 API,用于从二进制程序中反汇编和提取 CFG 表示。
我想知道使用什么算法来提取CFG。这是通常的线性扫描还是递归遍历,还是另一种算法?
Metasm 使用的策略在其网站上的同行评审文献中有所引用。看一下2008 年发表在 Journal of Computer Virology上的文章,第 3.1 节。引用他们的话,
标准拆卸。
开箱即用,Metasm 中的反汇编引擎是这样工作的:
- 在指令指针处反汇编二进制指令。
- 分析教学效果。
- 更新指令指针。
对我来说,这听起来更像是递归遍历,而不是线性扫描。引擎根据上一条指令的效果反汇编下一条指令,这将允许反汇编引擎遵循逻辑中的分支等。
此外,我还没有深入检查他们的代码,但metasm/disassemble.rb
看起来他们维护了某种自动分析队列,以便地址继续分析。寻找引用回溯的函数 - 这绝对看起来像是递归遍历。