ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

智能合约自动化逆向反编译与大模型语义重构:从 EVM 字节码到高可读 Solidity

2026/9/20 14:53:34 拓冰建站 浏览量
智能合约自动化逆向反编译与大模型语义重构:从 EVM 字节码到高可读 Solidity 智能合约自动化逆向反编译与大模型语义重构从 EVM 字节码到高可读 Solidity在链上安全应急响应、未开源合约取证与 MEV 机器人逆向分析中安全工程师经常需要面对一串未在 Etherscan 开源验证的纯十六进制字节码Unverified Bytecode /0x6080604052...。传统的逆向工具如 Panoramix、Ghidra EVM、Dedaub反编译出来的代码充斥着大量晦涩难懂的中间伪代码变量名全部是v0,v1,v2存储槽位访问只有裸露的sstore(0x0, add(sload(0x0), v1))缺乏函数签名与业务上下文人类专家肉眼阅读极其吃力。“EVM 字节码符号反编译Panoramix / Heimdall 4-byte 函数选择器知识库 大语言模型LLM语义重构”创造了一套全自动逆向流水线能够将冰冷的底层操作码在 10 秒钟之内自动还原为变量名语义清晰、包含标准 NatSpec 注释、高度可读的现代 Solidity 源代码一、EVM 字节码逆向反编译与语义重构全景拓扑graph TD RawHex[链上未开源十六进制 Bytecode] -- Heimdall[Heimdall / Panoramix 符号反编译器: 提取 CFG 控制流与低级伪代码] Heimdall -- RawPseudo[粗糙低级伪代码 (含 v0, v1, sstore)] RawHex -- SelectorExtract[提取 4 字节函数选择器 (如 0xa9059cbb)] SelectorExtract -- FourByteDB[4-byte 官方签名知识库: 匹配为 transfer(address,uint256)] RawPseudo FourByteDB -- PromptEngine[语义重构 Prompt 组装引擎] PromptEngine -- LLM[大语言模型: 推导变量真实业务含义重构为标准 Solidity] LLM -- CleanSolidity[输出高可读、带注释、结构优雅的 CleanSolidity.sol]二、Heimdall 提取与 4-byte 数据库匹配脚本TypeScript 实现// decompiler/selectorResolver.ts import axios from axios; // 查询以太坊官方 4-byte 签名库 export async function resolveFunctionSelector(selectorHex: string): Promisestring | null { try { const formattedSelector selectorHex.startsWith(0x) ? selectorHex : 0x${selectorHex}; const res await axios.get( https://www.4byte.directory/api/v1/signatures/?hex_signature${formattedSelector} ); if (res.data.results res.data.results.length 0) { // 返回匹配到的标准函数签名 (如 transfer(address,uint256)) return res.data.results[0].text_signature; } } catch (err) { console.warn(Selector ${selectorHex} not found in 4byte directory.); } return null; }三、基于大模型的语义重构引擎实现// decompiler/semanticReconstructor.ts import Anthropic from anthropic-ai/sdk; import { resolveFunctionSelector } from ./selectorResolver; const anthropic new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY }); export async function reconstructBytecodeToSolidity(rawDecompiledPseudo: string, extractedSelectors: string[]) { // 1. 批量解析函数签名 const resolvedSignatures: Recordstring, string {}; for (const sel of extractedSelectors) { const sig await resolveFunctionSelector(sel); if (sig) resolvedSignatures[sel] sig; } console.log( [Selectors Resolved]:, resolvedSignatures); // 2. 构造重构 Prompt const prompt 你是一名世界顶级的 Solidity 逆向安全工程大师。 以下是从一段未开源 EVM 字节码中提取出的粗糙反编译伪代码以及匹配到的 4-byte 函数选择器 [已匹配的函数选择器]: ${JSON.stringify(resolvedSignatures, null, 2)} [底层反编译伪代码]: \\\text ${rawDecompiledPseudo} \\\ [重构任务要求]: 1. 将所有的 \v0, v1, var_a\ 等无意义变量名根据上下文逻辑推导为具备明确业务含义的英文变量名 (如 \recipient\, \depositAmount\, \userBalance\) 2. 将底层的 \sstore / sload\ 抽象为标准的 Solidity 状态变量与 \mapping\ 3. 输出符合 Solidity 0.8.20 语法的标准、高可读合约代码并附带核心业务逻辑说明。 ; const response await anthropic.messages.create({ model: claude-3-5-sonnet-20241022, max_tokens: 2048, messages: [{ role: user, content: prompt }], }); return response.content[0].text; }四、重构效果前后震撼对比1. 原始粗糙反编译伪代码难以阅读def unknown_a9059cbb(varg0, varg1): require msg.value 0 require 0x4 (msg.data.length - 0x4) 0x40 v0 sload(keccak256(msg.sender, 0x0)) require v0 varg1 sstore(keccak256(msg.sender, 0x0), v0 - varg1) v1 sload(keccak256(varg0, 0x0)) sstore(keccak256(varg0, 0x0), v1 varg1) return 12. 大模型自动化语义重构后的 Solidity 源码// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; /** * title Standard ERC-20 Token Transfer Function * notice 自动化逆向重构自链上字节码 (Selector: 0xa9059cbb) */ contract ReconstructedToken { // Slot 0 映射为标准 ERC-20 代币余额账本 mapping(address uint256) public balanceOf; event Transfer(address indexed from, address indexed to, uint256 value); error InsufficientBalance(uint256 available, uint256 required); function transfer(address recipient, uint256 amount) external returns (bool) { uint256 senderBalance balanceOf[msg.sender]; if (senderBalance amount) { revert InsufficientBalance(senderBalance, amount); } // 扣减发送方余额并增加接收方余额 balanceOf[msg.sender] senderBalance - amount; balanceOf[recipient] amount; emit Transfer(msg.sender, recipient, amount); return true; } }五、智能合约逆向三大极客要点利用 Etherscan 历史交互交易推导数据结构在重构时除了反编译伪代码同时拉取该合约在链上发生的真实 Transaction Calldata能让大模型百分之百还原结构体内部字段结合 Slither AST 校验重构准确性重构出的 Solidity 代码自动输入 Slither 进行二次静态编译确保逻辑语法完全闭环识别代理与实现分流Proxy Detection在逆向第一步检查是否存在0x360894a13ba1a321...ERC-1967 实现槽位读取如果是代理合约自动重定向反编译其背后的 Implementation 真实逻辑。将冰冷的二进制字节码转化为人类易读的架构代码这是全栈安全专家在黑暗森林中洞察一切的终极利器。