
Расширение Burp Suite для декодирования вызовов Ethereum JSON-RPC и взаимодействий со смарт-контрактами, поддерживающее несколько сетей и автоматическое получение ABI.
Web3 Decoder — это расширение для Burp Suite, предназначенное для анализа операций с блокчейном и взаимодействий со смарт-контрактами. Оно обрабатывает JSON-RPC вызовы к Ethereum и совместимым сетям (включая Polygon, Arbitrum, BSC и другие)
Большинство поддерживаемых блокчейн-эксплореров, таких как etherscan.io, требуют API-ключ для выполнения более чем 1 запроса каждые 5 секунд.
Чтобы добавить свои API-ключи, у вас есть 2 варианта:
Расширение кэширует загруженные ABI из блокчейн-эксплореров, таких как etherscan,
в папке с именем .abi_caches в формате JSON. Вы можете просто добавить новый файл в эту папку,
следующего соглашения об именовании:
{chain_id}_{contract_address.lower()}.abi
Например:
# Ethereum Mainnet (chain ID 1), контракт 0xfbdca68601f835b27790d98bbb8ec7f05fdeaa9b
1_0xfbdca68601f835b27790d98bbb8ec7f05fdeaa9b.abi
# Polygon (chain id 137), контракт 0x447646e84498552e62ecf097cc305eabfff09308
137_0x447646e84498552e62ecf097cc305eabfff09308.abi
Эта документация применима к Windows и Linux; пользователи macOS могут использовать DMG-файл.
Проверьте наличие Git и Python в вашей системе.
Запустите сеанс терминала от имени администратора.
Это расширение требует библиотеки python3, такие как web3.py, которые, к сожалению, недоступны для python 2.7 для непосредственного использования с Jython 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 вы можете добавить python-расширение, выбрав файл burp_web3_decoder.py на вкладке Extender в Burp Suite
eth_calleth_sendRawTransaction (и их внутренних функций)eth_calleth_calleth_call, так и в eth_sendRawTransactionВсе поддерживаемые сети можно найти в файле chains.json. Это сети, у которых есть блокчейн-эксплорер с теми же API, что и у etherscan. Если вы хотите добавить больше блокчейн-эксплореров, добавьте их в файл chains.json, протестируйте и сделайте pull request!
Дополнительные примеры, включая proxy и 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"
}
}
}
]
JSON-RPC запрос eth_chainId к используемому узлу для определения сети, с которой мы работаем, и в зависимости от сети выбирается API блокчейн-эксплорера путём поиска в файле chains.json.
В качестве примера использования: для декодирования вызовов функций нам нужен ABI (Application Binary Interface) контракта, который содержит все функции, которые можно вызывать в контракте, а также их входные и выходные данные. На данный момент это работает с верифицированными контрактами в блокчейн-эксплорере или с ручным добавлением ABI. В будущих версиях мы рассмотрим возможность автоматической генерации ABI путём поиска селекторов функций в публичных базах данных.
Следующая диаграмма «потока» упрощённо показывает процесс, который библиотека eth_decoder выполняет при декодировании JSON-RPC вызовов eth_call:
