Web3 Decoder 是一款 Burp Suite 扩展,用于分析区块链操作和智能合约交互。它处理针对以太坊及兼容网络(包括 Polygon、Arbitrum、BSC 等)的 JSON-RPC 调用。
大多数受支持的区块浏览器(如 etherscan.io)都要求提供 API 密钥,以允许每 5 秒超过 1 次请求。
要添加您的 API 密钥,您有 2 种选择:
该扩展会将从区块浏览器(如 etherscan)下载的 ABI 缓存到名为 .abi_caches 的文件夹中,格式为 JSON。您可以简单地在该文件夹中添加一个新文件,命名约定如下:
{chain_id}_{contract_address.lower()}.abi
例如:
# 以太坊主网(链 ID 1),合约 0xfbdca68601f835b27790d98bbb8ec7f05fdeaa9b
1_0xfbdca68601f835b27790d98bbb8ec7f05fdeaa9b.abi
# Polygon(链 ID 137),合约 0x447646e84498552e62ecf097cc305eabfff09308
137_0x447646e84498552e62ecf097cc305eabfff09308.abi
本文档适用于 Windows 和 Linux;macOS 用户可以使用 。
检查您系统上的 Git 和 Python。
以管理员身份启动终端会话。
此扩展需要 python3 库(如 web3.py),遗憾的是这些库不适用于 python 2.7,无法直接与 Jython 2.7 一起使用。作为一种“变通方法”,主要功能是用 python 3 库编写的,该库由扩展通过 python 虚拟环境执行(说起来有点脏...)
我已经为所使用的 python3 库创建了适用于 Linux、Windows 和 Mac OSX 的预编译二进制文件。如果扩展无法执行该库,它将使用这些二进制文件。为了获得更好的性能或进行开发,您可以创建一个虚拟环境,并按如下方式安装:
cd "web3-decoder"
virtualenv -p python3 venv
source venv/bin/activate
pip install web3 py-evm
扩展将使用创建的虚拟环境调用该库。
一旦虚拟环境创建完成,您可以通过在 Burp Suite 的 Extender 选项卡中选择 burp_web3_decoder.py 文件来添加 python 扩展。
eth_call JSON-RPC 调用eth_sendRawTransaction JSON-RPC 调用(及其内部函数)eth_call 的响应结果eth_call 函数eth_call 和 eth_sendRawTransaction 中的函数输入所有受支持的链都可以在 chains.json 文件中找到。这些链都有与 etherscan 具有相同 API 的区块浏览器。如果您想添加更多区块链浏览器,请将其添加到 chains.json 文件中,进行测试,然后发起拉取请求!
更多示例(包括代理和 multicall 调用),请参阅 EXAMPLES.md
eth_call:
原始:

已解码:

eth_sendRawTransaction(Uniswap v2 测试):
{
"method": "eth_sendRawTransaction",
"params": [
"0x02f9015b820539808459682f00850df8475800830493e0947a250d5630b4cf539739df2c5dacb4c659f2488d880de0b6b3a7640000b8e47ff36ab500000000000000000000000000000000000000000000009e0950598867d8000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000002105eaa660ff62b14a5e093fc348e13ab63af2e600000000000000000000000000000000000000000000000000000000623b16570000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0fc001a005cfdf9ff11dea2d3e8781cb6ba140ae6e86a0922bfa75938b6f2456f513e24ca057f02b3f7125edb59e22651d503bc296153860e3843f9d495ad21d898c8e20c3"
],
"id": 4700418092893,
"jsonrpc": "2.0"
}
已解码:
[
{
"chain_id": 1337,
"access_list": [],
"nonce": 0,
"r": 2628844986784880378434698689940765181553490914879903463877191830852582236748,
"s": 39775559607776431912363889945449043629789293388076288013264795388376358199491,
"max_priority_fee_per_gas": 1500000000,
"gas": 300000,
"max_fee_per_gas": 60000000000,
"from": "0x2105Eaa660ff62b14a5e093fc348e13ab63AF2E6",
"y_parity": 1,
"to": "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D",
"value": 1000000000000000000,
"data": "0x7ff36ab500000000000000000000000000000000000000000000009e0950598867d8000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000002105eaa660ff62b14a5e093fc348e13ab63af2e600000000000000000000000000000000000000000000000000000000623b16570000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f",
"decoded_function": {
"args": {
"amountOutMin": 2915256698432979992576,
"path": [
"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"0x6B175474E89094C44Da98b954EedeAC495271d0F"
],
"to": "0x2105Eaa660ff62b14a5e093fc348e13ab63AF2E6",
"deadline": 1648039511
},
"function": "swapExactETHForTokens(uint256,address[],address,uint256)",
"to": "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D",
"abi": {
"outputs": [
{
"internalType": "uint256[]",
"type": "uint256[]",
"name": "amounts"
}
],
"inputs": [
{
"internalType": "uint256",
"type": "uint256",
"name": "amountOutMin"
},
{
"internalType": "address[]",
"type": "address[]",
"name": "path"
},
{
"internalType": "address",
"type": "address",
"name": "to"
},
{
"internalType": "uint256",
"type": "uint256",
"name": "deadline"
}
],
"stateMutability": "payable",
"type": "function",
"name": "swapExactETHForTokens"
}
}
}
]
向正在使用的节点发送 eth_chainId JSON-RPC 请求,以检测我们正在处理哪条链,并根据该链,通过搜索 chains.json 文件来选择区块浏览器 API。
作为使用示例,要解码函数调用,我们需要合约的 ABI(应用程序二进制接口),其中包含合约中所有可调用的函数及其输入和输出。目前,它适用于区块浏览器中已验证的合约,或通过手动添加 ABI。在未来的版本中,我们将探索通过搜索公共数据库中的函数选择器来自动生成 ABI 的可能性。
以下“流程”图以简化的方式展示了 eth_decoder 库在解码 eth_call JSON-RPC 调用时所遵循的过程:
