name: evm-analysis description: 用于智能合约安全审计、Gas优化和逆向工程的深度EVM字节码分析与反编译能力。提供分析操作码、存储布局、代理模式和字节码验证的工具。 allowed-tools: Read, Grep, Write, Bash, Edit, Glob, WebFetch
EVM/字节码分析技能
专家级EVM字节码分析与反编译,用于智能合约安全审计、Gas优化和逆向工程。
能力
- 字节码分析: 分析EVM字节码和操作码
- Gas成本计算: 计算每个操作的Gas成本
- 存储布局识别: 识别存储槽布局和打包
- 反编译: 将字节码反编译为伪Solidity代码
- 代理分析: 分析代理实现槽(EIP-1967)
- 模式检测: 检测字节码模式(CREATE2、selfdestruct)
- 字节码验证: 验证合约字节码与源代码的一致性
MCP服务器集成
此技能可利用以下MCP服务器:
| 服务器 | 用途 | 安装 |
|---|---|---|
| EVM MCP Tools | 智能合约审计、安全分析 | 0xGval/evm-mcp-tools |
| Solidity Contract Analyzer | 带元数据的合约代码分析 | Skywork |
操作码参考
常见EVM操作码和Gas成本:
| 类别 | 操作码 | 基础Gas |
|---|---|---|
| 算术运算 | ADD, SUB, MUL, DIV | 3-5 |
| 比较运算 | LT, GT, EQ, ISZERO | 3 |
| 位运算 | AND, OR, XOR, NOT, SHL, SHR | 3 |
| 内存操作 | MLOAD, MSTORE | 3 + 内存扩展 |
| 存储操作 | SLOAD | 100(热)/ 2100(冷) |
| 存储操作 | SSTORE | 100-20000(可变) |
| 控制流 | JUMP, JUMPI | 8-10 |
| 调用 | CALL, DELEGATECALL, STATICCALL | 100 + 内存 + 值 |
存储布局分析
标准槽模式
// 基本类型(槽0, 1, 2...)
uint256 public a; // 槽0
uint256 public b; // 槽1
// 打包存储
uint128 public c; // 槽2, 字节0-15
uint128 public d; // 槽2, 字节16-31
// 映射:keccak256(键 . 槽)
mapping(address => uint256) public balances; // 槽3
// balances[地址] 位于 keccak256(地址 . 3)
// 动态数组:长度在槽,数据在 keccak256(槽)
uint256[] public arr; // 长度在槽4, arr[i] 在 keccak256(4) + i
EIP-1967代理槽
实现地址: 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc
管理员: 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103
信标: 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50
字节码模式
合约创建
PUSH1 0x80 // 空闲内存指针
PUSH1 0x40
MSTORE
...
CODECOPY // 复制运行时代码
RETURN // 返回运行时代码
选择器分发
PUSH4 <选择器> // 4字节函数选择器
EQ // 与calldata[0:4]比较
PUSH2 <偏移量> // 跳转目标
JUMPI // 匹配则跳转
常见漏洞模式
// 重入攻击指示器:CALL在SSTORE之前
CALL
...
SSTORE
// 未检查返回值:CALL没有ISZERO检查
CALL
// 缺失:ISZERO, JUMPI用于错误处理
// 自毁(已弃用但可检测)
SELFDESTRUCT
工作流程
1. 获取合约字节码
# 使用cast(Foundry)
cast code <地址> --rpc-url <rpc>
# 使用curl
curl -X POST <rpc> \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_getCode","params":["<地址>","latest"],"id":1}'
2. 分析操作码
# 使用cast反汇编
cast disassemble <字节码>
# 或使用在线工具
# - evm.codes/playground
# - ethervm.io/decompile
3. 存储槽分析
# 读取特定存储槽
cast storage <地址> <槽> --rpc-url <rpc>
# 读取EIP-1967实现槽
cast storage <地址> 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc --rpc-url <rpc>
4. 字节码比较
# 获取部署的字节码
cast code <地址> --rpc-url <rpc> > deployed.bin
# 编译源代码并比较
forge build
diff deployed.bin out/Contract.sol/Contract.bin
流程集成
此技能与以下流程集成:
gas-optimization.js- 识别高Gas操作码smart-contract-security-audit.js- 字节码级漏洞检测smart-contract-upgrade.js- 代理槽验证formal-verification.js- 字节码正确性验证
工具参考
| 工具 | 用途 | URL |
|---|---|---|
| Foundry Cast | CLI字节码交互 | foundry-rs/foundry |
| evm.codes | 操作码参考 | evm.codes |
| Dedaub | 反编译器 | dedaub.com |
| Heimdall | 高级反编译器 | heimdall-rs |
| panoramix | Python反编译器 | eveem.org |
示例分析
// 分析代理合约
const analysis = {
type: 'proxy',
pattern: 'EIP-1967透明代理',
implementation: '0x...',
admin: '0x...',
// 存储布局
storageSlots: {
0: { name: '_initialized', type: 'uint8' },
1: { name: '_initializing', type: 'bool' },
// ...
},
// 函数选择器
selectors: {
'0xa9059cbb': 'transfer(address,uint256)',
'0x23b872dd': 'transferFrom(address,address,uint256)',
// ...
},
// Gas热点
gasHotspots: [
{ offset: 0x1a4, opcode: 'SSTORE', context: '余额更新' },
{ offset: 0x2f0, opcode: 'CALL', context: '外部调用' }
]
};
另请参阅
skills/gas-optimization/SKILL.md- Gas优化技术agents/solidity-auditor/AGENT.md- 安全审计代理references.md- 外部资源