Contract-Deployment
有關智能合約二進製文件佈局的任何文件?
我正在嘗試編寫一個反彙程式序來反彙編智能合約的二進制程式碼。末尾有尾隨字節,這會導致反彙編問題。例如,該合約的最後幾行如下所示:
... 0821 20 SHA3 0822 66 PUSH7 0x61696c6564a264 082A 69 PUSH10 0x7066735822122093f028 0835 25 25 0836 50 POP 0837 35 CALLDATALOAD 0838 B6 B6 0839 1D SAR 083A F4 DELEGATECALL 083B 76 PUSH23 0xb13b9dba3c4f06f60e51b9b4caee31680b389aef327f64 0853 73 PUSH20 0x6f6c63430008020033 <- PUSH20 requires 20 bytes, only 9 bytes left, which causes error while disassembling
與創建時的完整二進制數據進行比較:
... 0E9D 20 SHA3 0E9E 66 PUSH7 0x61696c6564a264 0EA6 69 PUSH10 0x7066735822122093f028 0EB1 25 25 0EB2 50 POP 0EB3 35 CALLDATALOAD 0EB4 B6 B6 0EB5 1D SAR 0EB6 F4 DELEGATECALL 0EB7 76 PUSH23 0xb13b9dba3c4f06f60e51b9b4caee31680b389aef327f64 0ECF 73 PUSH20 0x6f6c63430008020033b53127684a568b3173ae13 <--- the 20 bytes and the rest 0EE4 B9 B9 0EE5 F8 F8 0EE6 A6 A6 0EE7 01 ADD 0EE8 6E PUSH15 0x243e63b6e8ee1178d6a717850b5d61 ...
好像損壞了,
PUSH20 9-bytes
環顧了一下,有很多十六進制值好像是字元串。所以我猜合約二進製文件的最後一段是“數據段”,其中包含字元串。但是程式碼段在哪裡結束?所以我可以停止在那個地方拆卸。
目前我只是反彙編程式碼,下一步我將嘗試解析字元串並顯示在使用的位置,例如:
0EEE XX SOME_OPERAND ; "some string used at this line"
有沒有關於二進制佈局的文件?
這部分是 CBOR 編碼的合約元數據,你可以在文件中閱讀它。基本上,合約執行時程式碼的最後 2 個字節將是
length
位於上方的元數據有效負載,您可以在反編譯期間將其省略。該合約的元數據
a264697066735822122093f028255035b61df476b13b9dba3c4f06f60e51b9b4caee31680b389aef327f64736f6c63430008020033
解碼為:{"ipfs": h'122093F028255035B61DF476B13B9DBA3C4F06F60E51B9B4CAEE31680B389AEF327F', "solc": h'000802'}
合約創建程式碼將包括:
- 建構子
- 合約程式碼
- 論據
在這個答案中,我提供了一種方法來辨識契約部署字節碼中的所有這些部分,如果這對您有任何用處,因為您確實在反編譯以下參數:
0ECF 73 PUSH20 0x6f6c63430008020033b53127684a568b3173ae13 ^ Arguments start here
一旦你有了所有的部分,你只需要反編譯:
- 合約創建程式碼
- 合約字節碼(不含元數據)
我希望這能回答你的問題。