
Burp Suite 확장 프로그램으로, 이더리움 JSON-RPC 호출과 스마트 계약 상호작용을 디코딩하며, 여러 체인과 자동 ABI 검색을 지원합니다.
Web3 Decoder는 블록체인 작업과 스마트 계약 상호작용을 분석하기 위해 설계된 Burp Suite 확장 프로그램입니다. 이더리움 및 호환 네트워크(Polygon, Arbitrum, BSC 등 포함)에 대한 JSON-RPC 호출을 처리합니다.
etherscan.io와 같은 대부분의 지원되는 블록 탐색기는 5초에 1회 이상의 요청을 허용하려면 API 키가 필요합니다.
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 사용자는 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:
원본:

디코딩됨:

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를 수동으로 추가하여 작동합니다. 향후 릴리스에서는 공개 데이터베이스에서 함수 선택기를 검색하여 ABI를 자동 생성할 가능성을 탐구할 것입니다.
다음 "흐름" 다이어그램은 eth_decoder 라이브러리가 eth_call JSON-RPC 호출을 디코딩할 때 따르는 프로세스를 단순화된 방식으로 보여줍니다:
