文章目錄
- 背景
- 目的
- 安裝
- 1、安裝 Rust
- 2、克隆 heimdall-dec
- 3、編譯 heimdall-dec
- 4、運行 heimdall-dec
- 使用說明
- 1、訪問 Web 界面
- 2、輸入合約信息
- 3、查看反編譯結果
- 實戰演示
- 1、解析普通合約
- 2、解析代理合約
背景
在區塊鏈安全研究中,智能合約的審計和分析至關重要。
RPC端點為與區塊鏈節點(如以太坊、Polygon、BSC等)之間的通信提供了一種方式。通過RPC端點,任何人都可以訪問區塊鏈上合約的字節碼、狀態數據等信息。而合約地址則是定位特定智能合約的唯一標識符。
通過RPC端點和合約地址,我們能夠與區塊鏈節點上的合約進行通信,查詢該合約的字節碼。合約字節碼是編譯后的 Solidity 代碼,包含了合約的執行邏輯,但不以可讀的形式展示。
Heimdall 是一款智能合約反編譯工具,通過反編譯字節碼,可將其還原為易于理解的可讀 Solidity 代碼。
基于 Heimdall 的反編譯功能,heimdall-dec 項目實現了一個 Web 前端,能夠通過圖形化界面展示反編譯后的合約代碼。它不僅支持普通合約的反編譯,還能自動解析代理合約(Proxy Contract),并找到對應的實現合約(Implementation Contract)進行反編譯,極大地方便了合約分析工作。
該項目的 GitHub 地址如下:
https://github.com/smartdone/heimdall-dec
目的
本篇文章的目的:
1.介紹 heimdall-dec 反編譯工具的安裝和使用方法。
2.解析智能合約,包括普通合約和代理合約。
3.實戰演示,展示如何使用 heimdall-dec 反編譯合約。
安裝
由于 heimdall-dec 是基于 Rust 開發的,首先需要安裝 Rust。
1、安裝 Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安裝完成后,執行以下命令確認 Rust 是否安裝成功:
source $HOME/.cargo/env # 讓終端識別 Rust 命令rustc --version
2、克隆 heimdall-dec
克隆項目代碼倉庫:
git clone https://github.com/smartdone/heimdall-dec.git
cd heimdall-dec
3、編譯 heimdall-dec
使用 cargo build 進行編譯:
cargo build --release
編譯完成后,生成的可執行文件位于:
./target/release/heimdall-dec
4、運行 heimdall-dec
./target/release/heimdall-dec
此時,heimdall-dec 將啟動一個本地 Web 服務器,默認監聽 http://127.0.0.1:8080。
使用說明
1、訪問 Web 界面
在瀏覽器中打開:http://127.0.0.1:8080
2、輸入合約信息
RPC 鏈接:輸入區塊鏈網絡的 RPC 端點(可從 Chainlist 獲取)。例如:
以太坊主網:https://mainnet.infura.io/v3/YOUR_API_KEYPolygon:https://polygon-rpc.comBSC:https://bsc-dataseed.binance.org
合約地址:輸入需要反編譯的智能合約地址。
3、查看反編譯結果
點擊提交后,Heimdall 將查詢該地址的合約字節碼。如果是代理合約,自動解析其實現合約,反編譯字節碼并顯示可讀的 Solidity 代碼。
實戰演示
1、解析普通合約
Polygon(Matic)對應的 RPC 為:
https://polygon-rpc.com
該網絡上的 USDC(Token USD Coin)智能合約地址為:
0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174
輸入 RPC 和合約地址,點擊提交:
查看解析后的 Solidity 代碼,分析其邏輯:
2、解析代理合約
在智能合約部署之后,通常無法修改其邏輯代碼。一旦合約發布,就無法直接更新或者修復漏洞。為了解決這個問題,代理合約采用了將邏輯合約和存儲分離的設計。代理合約只是一個轉發請求的合約,而實際的業務邏輯由實現合約(Implementation Contract)來執行。如果發現某些漏洞或需要添加新功能時,開發者只需要部署新的實現合約,并將代理指向新合約。
許多 DeFi 項目使用代理合約(如 Transparent Proxy、UUPS Proxy),直接查詢合約無法獲取完整代碼。
但該項目能夠解析代理合約,并找到對應的實現合約(Implementation Contract)進行反編譯。
舉個例子,提交:
RPC:https://eth.llamarpc.com
Address:0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9
輸出結果如下圖所示:
// proxy address: 0x5D4Aa78B08Bc7C530e21bf7447988b1Be7991322
這意味著:
- 0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9 是一個代理合約(Proxy Contract)
- 0x5D4Aa78B08Bc7C530e21bf7447988b1Be7991322 是實現合約(Implementation Contract)
同時,也可通過終端查看輸出(不含源碼):