
在过去几年中,针对以太坊区块链上已部署智能合约的攻击因编程错误导致大量资金被盗。由于智能合约一旦编译并部署后,修改和更新较为复杂,不同从业者建议在仅能获取以太坊虚拟机(EVM)字节码的区块链上审查其安全性。在这方面,通过反汇编和反编译进行逆向工程可能很有效。
ghidra-EVM 是一个用于智能合约逆向工程的 Ghidra 模块。它可用于从以太坊区块链下载以太坊虚拟机(EVM)字节码,并对智能合约进行反汇编和反编译。此外,它还能分析创建代码、查找合约方法并定位不安全的指令。
它包含一个处理器模块、自定义加载器以及插件,可对以太坊虚拟机(EVM)字节码进行反汇编,并生成智能合约的控制流图(CFG)。
最新版本使用 Ghidra 9.1.2 API。它依赖 crytic evm_cfg_builder 库(https://github.com/crytic/evm_cfg_builder)来协助 Ghidra 完成 CFG 生成过程。
Ghidra-evm 包含:
| 脚本 | 描述 |
|---|---|
| search_codecopy.py | 在分析智能合约的创建代码时,我们通常只能看到使用 CODECOPY 将运行时代码写入内存的 _dispatcher 函数。此脚本查找有用的 CODECOPY 指令,并找出隐藏在合约运行时部分中的智能合约方法。 |
| search_dangerous_instructions.py | CALL、CALLCODE、SELFDESTRUCT 和 DELEGATECALL 等指令有时会被滥用,以将资金转移到其他合约。此脚本会找到它们,并为每个出现的位置创建标签。 |
| load_external_contract.py | 从区块链下载智能合约字节码到 .evm_h 文件中,该文件可加载到 ghidra-evm 中。 |
ghidra-evm 目录中的内容可用于在 Eclipse 中创建一个包含处理器和加载器的 Ghidra 模块,以便扩展或调试 ghidra_evm。

Ghidra-evm 依据 AGPLv3 进行许可和分发。
| 教程 | 描述 |
|---|
| 使用 | 使用 test.evm 的简单使用说明 |
| 分析创建字节码 | 使用 search_codecopy.py 分析创建代码并查找隐藏方法 |
| 查找危险指令 | 使用 search_dangerous_instructions.py 分析 SELFDESTRUCT 出现情况 |
| 从区块链下载智能合约字节码到 Ghidra | 使用 load_external_contract.py 从区块链下载 EVM 字节码到 .evm_h 文件 |