Contract-Deployment

有關智能合約二進製文件佈局的任何文件?

  • April 29, 2022

我正在嘗試編寫一個反彙程式序來反彙編智能合約的二進制程式碼。末尾有尾隨字節,這會導致反彙編問題。例如,該合約的最後幾行如下所示:

   ...
   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

一旦你有了所有的部分,你只需要反編譯:

  • 合約創建程式碼
  • 合約字節碼(不含元數據)

我希望這能回答你的問題。

引用自:https://ethereum.stackexchange.com/questions/127159