官术网_书友最值得收藏!

1.4 反編譯

逆向工程的一個較新的創新是使用反編譯器。反編譯器比反匯編器更進一步。反匯編器只是顯示程序的人類可讀的匯編代碼,而反編譯器則試圖從編譯的二進制文件中重新生成等價的C/C++代碼。

反編譯器的一個優點是通過生成偽代碼顯著減少和簡化反匯編的輸出。當快速瀏覽一個函數以從宏觀層面上了解程序正在執行什么操作時,這可以使閱讀更加容易。

當然,反編譯的缺點是在這個過程中可能會丟失重要的細節。此外,由于編譯器在從源代碼到可執行文件的轉換過程中本身是有損失的,因此反編譯器不能完全重建原始源代碼。符號名稱、局部變量、注釋以及大部分程序結構在編譯過程中會被破壞。同樣,如果存儲位置被積極優化的編譯器重復使用,那么試圖自動命名或重新標記局部變量和參數的做法也會產生誤導。

讓我們看一個C函數的例子,使用GCC編譯它,然后用IDA Pro和Ghidra的反編譯器進行反編譯,以顯示實際的情況。

圖1.7顯示了Linux源代碼庫中ihex2fw.c[6]文件中一個名為file_record的函數。

在Armv8-A架構上編譯C文件(沒有任何特定的編譯器選項)并將可執行文件加載到IDA Pro 7.6中后,圖1.8顯示了由反編譯器生成的file_record函數的偽代碼。

圖1.9顯示了Ghidra 10.0.4對同一函數的反編譯輸出。

在這兩種情況下,如果我們仔細觀察,便可以看到原始代碼的影子,但是這些代碼遠不如原始代碼易讀和直觀。換句話說,雖然在某些情況下反編譯器可以為我們提供程序的高層次概述,但它絕不是萬無一失的,也無法替代深入研究給定程序的匯編代碼。

圖1.7 ihex2fw.c源文件中file_record函數的源代碼

圖1.8 IDA Pro 7.6對編譯后的file_record函數的反編譯輸出

圖1.9 Ghidra 10.0.4對編譯后的file_record函數的反編譯輸出

話雖如此,反編譯器在不斷發展,并且越來越擅長重構源代碼,特別是對于簡單的函數。雖然,使用你想在更高層次上進行逆向工程的函數的反編譯器輸出是一個有用的輔助,但是當你想要更深入地了解正在發生的事情時,請不要忘記查看反匯編輸出。


[1]Planning a Computer System, Project Stretch, McGraw-Hill Book Company, Inc., 1962. (http://archive.computerhistory.org/resources/text/IBM/Stretch/pdfs/Buchholz_102636426.pdf)

[2]http://ftp.gnu.org/old-gnu/Manuals/gas-2.9.1/html_chapter/as_7.html

[3]https://web.mit.edu/gnu/doc/html/binutils_5.html

[4]https://ghidra-sre.org

[5]https://hex-rays.com/ida-pro

[6]https://gitlab.arm.com/linux-arm/linux-dm/-/blob/56299378726d5f2ba8d3c8cbbd13cb280ba45e4f/firmware/ihex2fw.c

主站蜘蛛池模板: 佛学| 平顺县| 辽中县| 武城县| 崇义县| 广灵县| 彝良县| 逊克县| 钟祥市| 喜德县| 桃园市| 泉州市| 栖霞市| 吉首市| 民权县| 佛冈县| 从江县| 阳曲县| 清原| 安塞县| 改则县| 梓潼县| 长乐市| 闻喜县| 丹寨县| 平阳县| 河北省| 德保县| 聂拉木县| 绍兴市| 乌恰县| 安化县| 恩平市| 镇江市| 阳山县| 剑河县| 东乡| 平塘县| 和田县| 吴江市| 宜川县|