EVM字节码分析技能 evm-analysis

EVM字节码分析技能是专门用于智能合约安全审计、Gas优化和逆向工程的专家级工具。提供深度EVM字节码分析、操作码解析、存储布局识别、代理模式检测和字节码反编译能力。关键词:EVM字节码分析、智能合约安全审计、Gas优化、逆向工程、区块链安全、Solidity反编译、存储布局分析、代理合约验证、操作码分析、字节码验证。

智能合约 0 次安装 0 次浏览 更新于 2/23/2026

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 - 外部资源