
Burp Suite拡張機能で、Ethereum JSON-RPC呼び出しとスマートコントラクトのやり取りをデコードし、複数のチェーンと自動ABI取得に対応します。
Web3 Decoder は、ブロックチェーン操作とスマートコントラクトのやり取りを分析するために設計された Burp Suite 拡張機能です。Ethereum および互換性のあるネットワーク(Polygon、Arbitrum、BSC など)への JSON-RPC 呼び出しを処理します。
etherscan.io など、サポートされているほとんどのブロックエクスプローラーでは、5 秒間に 1 回以上のリクエストを許可するために API キーが必要です。
API キーを追加するには 2 つのオプションがあります:
この拡張機能は、etherscan などのブロックエクスプローラーからダウンロードした ABI を、.abi_caches という名前のフォルダー内に JSON 形式でキャッシュします。そのフォルダー内に、以下の命名規則に従って新しいファイルを追加するだけです:
{chain_id}_{contract_address.lower()}.abi
例:
# Ethereum メインネット (チェーン ID 1)、コントラクト 0xfbdca68601f835b27790d98bbb8ec7f05fdeaa9b
1_0xfbdca68601f835b27790d98bbb8ec7f05fdeaa9b.abi
# Polygon (チェーン ID 137)、コントラクト 0x447646e84498552e62ecf097cc305eabfff09308
137_0x447646e84498552e62ecf097cc305eabfff09308.abi
このドキュメントは Windows と Linux に適用されます。macOS ユーザーは DMG ファイル を使用できます。
システムに Git と Python がインストールされているか確認してください。
管理者としてターミナルセッションを開始してください。
この拡張機能には web3.py などの python3 ライブラリが必要ですが、残念ながらこれらは Jython 2.7 で直接使用するための python 2.7 では利用できません。「ハック」として、メイン機能は python 3 ライブラリで記述されており、拡張機能は python 仮想環境を通じてそのライブラリを実行します(汚い話ですが...)
使用される python3 ライブラリのプリコンパイル済みバイナリを、Linux、Windows、Mac OSX 用に作成しました。拡張機能は、ライブラリを実行できない場合にこれらのバイナリを使用します。パフォーマンス向上や開発のためには、virtualenv を作成し、次のようにインストールできます:
cd "web3-decoder"
virtualenv -p python3 venv
source venv/bin/activate
pip install web3 py-evm
拡張機能は、作成された virtualenv を使用してライブラリを呼び出します。
virtualenv が作成されたら、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 ファイルに追加してテストし、プルリクエストを作成してください!
プロキシやマルチコール呼び出しを含むその他の例については、EXAMPLES.md を参照してください。
eth_call:
Raw:

Decoded:

eth_sendRawTransaction (Uniswap v2 テスト):
{
"method": "eth_sendRawTransaction",
"params": [
"0x02f9015b820539808459682f00850df8475800830493e0947a250d5630b4cf539739df2c5dacb4c659f2488d880de0b6b3a7640000b8e47ff36ab500000000000000000000000000000000000000000000009e0950598867d8000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000002105eaa660ff62b14a5e093fc348e13ab63af2e600000000000000000000000000000000000000000000000000000000623b16570000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0fc001a005cfdf9ff11dea2d3e8781cb6ba140ae6e86a0922bfa75938b6f2456f513e24ca057f02b3f7125edb59e22651d503bc296153860e3843f9d495ad21d898c8e20c3"
],
"id": 4700418092893,
"jsonrpc": "2.0"
}
Decoded:
[
{
"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 を手動で追加することで動作します。将来のリリースでは、公開データベースで関数セレクターを検索して ABI を自動生成する可能性を検討します。
次の「フロー」図は、eth_decoder ライブラリが eth_call JSON-RPC 呼び出しをデコードするときに従うプロセスを簡略化して示しています:
