- ARM匯編與逆向工程:藍狐卷·基礎知識
- (美)瑪麗亞·馬克斯特德
- 765字
- 2024-05-14 11:09:06
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
- Securing Blockchain Networks like Ethereum and Hyperledger Fabric
- 網絡空間攻防技術原理
- Metasploit Penetration Testing Cookbook(Third Edition)
- Rootkit和Bootkit:現代惡意軟件逆向分析和下一代威脅
- 黑客攻防與電腦安全從新手到高手(微視頻+火力升級版)
- 網絡安全保障能力研究
- Kali Linux Wireless Penetration Testing Cookbook
- Falco云原生安全:Falco原理、實踐與擴展
- Instant Java Password and Authentication Security
- 數據要素安全:新技術、新安全激活新質生產力
- 電腦安全與攻防入門很輕松(實戰超值版)
- 黑客攻防從入門到精通
- 空間群組密鑰管理研究:基于自主的深空DTN密鑰管理
- Mastering Linux Security and Hardening
- 安全網絡構建