x86 反彙編/反彙編器和反編譯器
本質上,反彙編器與彙編器完全相反。彙編器將用匯編語言編寫的程式碼轉換為二進位制機器程式碼,而反彙編器則反轉該過程,並嘗試從二進位制機器程式碼中重新建立彙編程式碼。
由於大多數組合語言與底層機器指令具有對應關係,因此反彙編過程相對簡單。基本的反彙編器通常可以透過讀取位元組並執行表查詢來實現。當然,反彙編也存在自身的問題和陷阱,這些問題將在本章的後面部分進行介紹。
許多反彙編器可以選擇以 Intel、AT&T 或(偶爾)HLA 語法輸出組合語言指令。本書中的示例將交替使用 Intel 和 AT&T 語法。通常,我們不會在程式碼示例中使用 HLA 語法,但將來可能會改變。
在這裡我們將列出一些常用的反彙編工具。請注意,有一些專業反彙編器(需要付費獲得許可),也有一些免費軟體/共享軟體反彙編器。每個反彙編器都具有不同的功能,因此作為讀者,你需要決定你更喜歡使用哪些工具。
- ODA
- 是一個免費的基於網路的反彙編器,適用於多種架構。你可以使用“即時檢視”即時檢視程式碼是如何反彙編的,每次一個位元組,或者上傳檔案。該網站目前處於測試版,但隨著時間的推移,它只會變得越來越好。
- http://www.onlinedisassembler.com
- IDA Pro
- 是一個專業的反彙編器,價格昂貴,功能極其強大,並且擁有一系列功能。IDA Pro 的缺點是其標準單使用者版售價為 515 美元。因此,本華夏公益教科書不會專門考慮 IDA Pro,因為其價格過高。免費版本確實存在;見下文。
- (版本 6.x) http://www.hex-rays.com/idapro/
- Relyze Desktop
- 是一個互動式軟體逆向工程工具,允許你反彙編、反編譯和比較 x86、x64、ARM32 和 ARM64 軟體。
- https://www.relyze.com/overview.html
- Hopper Disassembler
- 是一款適用於 Mac 的逆向工程工具,可以讓你反彙編、反編譯和除錯 32/64 位 Intel Mac 可執行檔案。它還可以反彙編和反編譯 Windows 可執行檔案。
- http://www.hopperapp.com
- OBJ2ASM
- 是一個適用於 Intel OMF、Microsoft COFF 格式、Linux ELF 或 Mac OS X Mach-O 格式的 16 位和 32 位 x86 物件檔案的物件檔案反彙編器。
- http://www.digitalmars.com/ctg/obj2asm.html
- PE Explorer
- 是一個反彙編器,其“重點是易用性、清晰度和導航”。它不像 IDA Pro 那樣功能齊全,但其價格更低,以彌補缺少的功能:130 美元。
- http://www.heaventools.com/PE_Explorer_disassembler.htm
- W32DASM (Win32dasm)
- W32DASM 曾經是一款出色的 16/32 位 Windows 反彙編器,但現在似乎不再開發了。最新版本來自 2003 年。網站已經關閉,沒有替代網站上線。
- http://www.softpedia.com/get/Programming/Debuggers-Decompilers-Dissasemblers/WDASM.shtml
- Binary Ninja
- Binary Ninja 是一個商業化的跨平臺(Linux、OS X、Windows)逆向工程平臺,旨在以更低的價格提供類似於 IDA 的功能集。一個用 python 編寫的先驅版本是開源的,可在 https://github.com/Vector35/deprecated-binaryninja-python 獲取。學生/非商業使用入門價為 99 美元,商業使用價為 399 美元。
- https://binary.ninja/
- Hiew
- x86-64 反彙編器和彙編器。單使用者許可證售價為 19 美元,終身更新售價為 199 美元。
- hiew.ru
- OllyDbg
- OllyDbg 是近年來最受歡迎的反彙編器之一。它擁有龐大的社群,並提供各種外掛。它強調二進位制程式碼分析。僅支援 x86 指令(目前不支援 x86_64,但正在開發中)。
- http://www.ollydbg.de/(官方網站)
- http://www.openrce.org/downloads/browse/OllyDbg_Plugins(外掛)
- http://www.ollydbg.de/odbg64.html(64 位版本)
- Capstone
- Capstone 是一個開源的反彙編框架,支援多種架構(包括 x86、x86_64)和平臺,並具有高階功能。
- http://www.capstone-engine.org/
- Zydis
- 快速輕量級的 x86/x86-64 解碼庫。它不提供反彙編功能,例如線性掃描或遞迴反彙編。
- https://github.com/zyantific/zydis
- Objconv
- 一個命令列反彙編器,支援 16 位、32 位和 64 位 x86 程式碼。最新的指令集(SSE4、AVX、XOP、FMA 等)、多種物件檔案格式、多種彙編語法方言。Windows、Linux、BSD、Mac。智慧分析。
- IDA 3.7
- 一個 DOS 圖形介面工具,其行為與 IDA Pro 非常相似,但功能有限。它可以反彙編 Z80、6502、Intel 8051、Intel i860 和 PDP-11 處理器,以及 x86 指令(最高支援 486)。
- http://www.simtel.net/product.php(搜尋 ida37fw)
- IDA Pro 免費軟體
- 其行為與 IDA Pro 幾乎完全相同,但僅反彙編 Intel x86 操作碼,並且僅限 Windows。它可以反彙編截至 2003 年的那些處理器的指令。免費用於非商業用途。
- (版本 4.1) http://www.themel.com/idafree.zip
- (版本 4.3) http://www.datarescue.be/idafreeware/freeida43.exe
- (版本 5.0) https://www.scummvm.org/frs/extras/IDA/idafree50.exe
- (版本 7.0) https://www.hex-rays.com/products/ida/support/download_freeware.shtml
- BORG 反彙編器
- BORG 是一個優秀的 Win32 反彙編器,帶圖形介面。
- http://www.caesum.com/
- HT 編輯器
- 一個用於分析 Intel x86 指令的的反彙編器。最新版本在 Windows 上以控制檯圖形介面程式執行,但也有一些為 Linux 編譯的版本。
- http://hte.sourceforge.net/
- diStorm64
- diStorm 是一個開源的、高度最佳化的 80x86 和 AMD64 流反彙編器庫。
- http://ragestorm.net/distorm/
- crudasm
- crudasm 是一個帶有多種選項的開源反彙編器。它是一個正在進行中的專案,並與一個部分反編譯器捆綁在一起。
- http://sourceforge.net/projects/crudasm9/
- BeaEngine
- BeaEngine 是一個完整的 IA-32 和 intel64 架構的反彙編器庫(用 C 編碼,可在各種語言中使用:C、Python、Delphi、PureBasic、WinDev、masm、fasm、nasm、GoAsm)。
- https://github.com/BeaEngine/beaengine
- Visual DuxDebugger
- 是一個用於 Windows 的 64 位偵錯程式反彙編器。
- http://www.duxcore.com/products.html
- BugDbg
- 是一個 64 位使用者級偵錯程式,旨在除錯 Windows 上的原生 64 位應用程式。
- http://www.pespin.com/
- DSMHELP
- Disassemble Help Library 是一個反彙編器庫,具有單行 Epimorphic 彙編器。支援的指令集 - Basic、System、SSE、SSE2、SSE3、SSSE3、SSE4、SSE4A、MMX、FPU、3DNOW、VMX、SVM、AVX、AVX2、BMI1、BMI2、F16C、FMA3、FMA4、XOP。
- http://dsmhelp.narod.ru/ (俄語)
- ArkDasm
- 是一個用於 Windows 的 64 位互動式反彙編器和偵錯程式。支援的處理器:x64 架構(Intel x64 和 AMD64)
- http://www.arkdasm.com/
- SharpDisam
- 是 udis86 x86 / x86-64 反彙編器的 C# 版本
- http://sharpdisasm.codeplex.com/
- CFF Explorer
- 特殊欄位描述和修改(支援 .NET)、實用程式、重建器、十六進位制編輯器、匯入新增器、簽名掃描器、簽名管理器、擴充套件支援、指令碼、反彙編器、依賴項檢視器等。
- ntcore.com
- bddisasm
- 快速、輕量級、x86/x64 指令解碼庫。
- github.com/bitdefender/bddisasm
Unix 反彙編器
[edit | edit source]許多 Unix 反彙編器,特別是開源的,已經移植到其他平臺,比如 Windows(大多數使用 MinGW 或 Cygwin)。一些反彙編器,比如 otool([OS X),是特定於發行版的。
- Capstone
- Capstone 是一個開源的反彙編框架,用於多架構(包括對 x86、x86_64 的支援)和多平臺(包括 Mac OSX、Linux、*BSD、Android、iOS、Solaris),具有高階功能。
- http://www.capstone-engine.org/
- Bastard 反彙編器
- Bastard 反彙編器是一個功能強大、可指令碼化的用於 Linux 和 FreeBSD 的反彙編器。
- http://bastard.sourceforge.net/
- ndisasm
- NASM 的 x86 和 x86-64 反彙編器。適用於 DOS、Windows、Linux、Mac OS X 和各種其他系統。
- udis86
- 用於 x86 和 x86-64 的反彙編器庫
- http://udis86.sourceforge.net/
- Zydis
- 快速、輕量級的 x86/x86-64 反彙編器庫。
- https://github.com/zyantific/zydis
- Objconv
- 見上文。
- ciasdis
- ciasdis 的正式名稱是 computer_intelligence_assembler_disassembler。這個基於 Forth 的工具允許逐步地、互動式地構建關於程式碼體的知識。它獨一無二的是,所有反彙編的程式碼都可以重新彙編成完全相同的程式碼。處理器有 8080、6809、8086、80386、Pentium I 和 DEC Alpha。一個指令碼功能有助於分析 Elf 和 MSDOS 標頭檔案,並使該工具可擴充套件。Pentium I ciasdis 可作為二進位制映像獲取,其他版本以原始碼形式提供,可載入到 lina Forth 上,可從同一個站點獲取。
- http://home.hccnet.nl/a.w.m.van.der.horst/ciasdis.html
- objdump
- 是標準配置,通常用於對二進位制檔案的常規檢查。注意重新定位選項和動態符號表選項。
- gdb
- 是標準配置,作為一個偵錯程式,但經常用於反彙編。如果你有一些你想反彙編的鬆散的十六進位制轉儲資料,只需將其(互動式地)輸入到其他內容之上,或者將其編譯成一個程式作為字串,如下所示:char foo[] = {0x90, 0xcd, 0x80, 0x90, 0xcc, 0xf1, 0x90};
- lida linux 互動式反彙編器
- 一個互動式反彙編器,具有一些特殊功能,例如密碼分析器。顯示字串資料引用,進行程式碼流分析,不依賴於 objdump。使用 Bastard 反彙編庫來解碼單個操作碼。該專案始於 2004 年,至今仍處於休眠狀態。
- http://lida.sourceforge.net
- dissy
- 該程式是一個互動式反彙編器,它使用 objdump。
- http://code.google.com/p/dissy/
- EmilPRO
- 取代了已棄用的 dissy[check spelling] 反彙編器。
- http://github.com/SimonKagstrom/emilpro
- x86dis
- 該程式可用於顯示二進位制流,例如引導扇區或其他非結構化二進位制檔案。
- ldasm
- LDasm(Linux 反彙編器)是 objdump/binutils 的基於 Perl/Tk 的 GUI,試圖模仿 W32Dasm 的“外觀和感覺”。它搜尋交叉引用(例如字串),將程式碼從 GAS 轉換為類似 MASM 的樣式,跟蹤程式等等。附帶 PTrace,一個程序流記錄器。最後更新於 2002 年,可從 Tucows 獲取。
- http://www.tucows.com/preview/59983/LDasm
- llvm
- LLVM 有兩個與反彙編器介面
- llvm-objdump
- 模仿 GNU objdump。
- llvm-mc
- 見 LLVM 部落格。使用示例$ echo '1 2' | llvm-mc -disassemble -triple=x86_64-apple-darwin9
addl %eax, (%rdx)
$ echo '0x0f 0x1 0x9' | llvm-mc -disassemble -triple=x86_64-apple-darwin9
sidt (%rcx)
$ echo '0x0f 0xa2' | llvm-mc -disassemble -triple=x86_64-apple-darwin9
cpuid
$ echo '0xd9 0xff' | llvm-mc -disassemble -triple=i386-apple-darwin9
fcos
- otool
- OS X 的目標檔案顯示工具。
- edb
- 一個跨平臺 x86/x86-64 偵錯程式。
- https://github.com/eteran/edb-debugger
- bddisasm
- 快速、輕量級、x86/x64 指令解碼庫。
- github.com/bitdefender/bddisasm
- rasm2
- radare2 反彙編器和彙編器工具。包含 x86.nz 庫,支援 x86/x86-64。
反彙編器問題
[edit | edit source]正如我們之前提到的,反彙編過程存在許多問題和困難。兩個最重要的困難是程式碼和資料之間的區分,以及文字資訊的丟失。
分離程式碼和資料
[edit | edit source]由於資料和指令都以二進位制資料的形式儲存在可執行檔案中,所以一個顯而易見的問題出現了:反彙編器如何區分程式碼和資料?任何給定的位元組是變數,還是指令的一部分?
如果資料僅限於可執行檔案的 .data 部分(段)(在後面的章節中解釋),並且如果可執行程式碼僅限於可執行檔案的 .code 部分,這個問題就不會那麼困難,但情況往往並非如此。資料可以插入到程式碼部分中(例如跳轉地址表、常量字串),而可執行程式碼可以儲存在資料部分中(儘管新系統正在努力出於安全原因阻止這種情況)。AI 程式、LISP 或 Forth 編譯器可能不包含 .text 和 .data 部分來幫助決定,並且將程式碼和資料交織在一起放在一個可讀、可寫和可執行的部分中,引導程式碼甚至可能需要相當大的努力來識別部分。一個經常使用的技術是識別可執行檔案的入口點,並遞迴地找到從那裡可以訪問的所有程式碼。這被稱為“程式碼爬行”。
許多互動式反彙編器將允許使用者選擇將程式碼段呈現為程式碼或資料,但非互動式反彙編器將自動進行分離。反彙編器通常會在同一行上提供指令和相應的十六進位制資料,將決定程式碼性質的負擔轉移給使用者。一些反彙編器(例如 ciasdis)將允許你指定關於是否將資料或程式碼反彙編以及發明標籤名稱的規則,這些規則基於所檢查物件的內容。以這種方式編寫你自己的“爬行者”更有效;對於大型程式來說,互動式反彙編可能不切實際,甚至是不可能的。
在任意可執行程式中分離程式碼和資料的普遍問題等同於停機問題。因此,不可能編寫出一個能夠正確分離所有可能輸入程式的程式碼和資料的反彙編器。逆向工程充滿了這種理論上的侷限性,儘管根據 Rice 定理,所有關於程式屬性的有趣問題都是不可判定的(因此編譯器和許多其他以任何形式處理程式的工具也會遇到這種限制)。在實踐中,互動式和自動分析的結合,以及堅持不懈,可以處理除了專門設計為阻止逆向工程的程式以外的所有程式,例如使用加密和在使用之前解密程式碼,以及在記憶體中移動程式碼。
丟失的資訊
[edit | edit source]使用者定義的文字識別符號,如變數名、標籤名和宏,在彙編過程中被刪除。它們可能仍然存在於生成的 объектные файлы中,供偵錯程式和重定位連結器等工具使用,但直接連線丟失了,重新建立這種連線需要不僅僅是一個簡單的反彙編器。特別是小的常量可能有多個可能的名稱。作業系統呼叫(如 MS-Windows 中的 DLL 或 Unices 中的 syscall)可以被重建,因為它們的名稱出現在單獨的段中或事先已知。許多反彙編器允許使用者根據他對程式碼的理解,將名稱附加到標籤或常量上。這些識別符號,以及原始檔中的註釋,有助於使程式碼對人類更易讀,並且還可以提供一些關於程式碼目的的線索。如果沒有這些註釋和識別符號,就很難理解原始碼的用途,也很難確定該程式碼使用的演算法。當你將這個問題與你試圖閱讀的程式碼可能實際上是資料(如上所述)的可能性結合起來時,就更難確定發生了什麼。現代最佳化編譯器也提出了另一個挑戰;它們將小的子例程內聯,然後將跨呼叫和返回邊界的指令組合起來。這會丟失有關程式結構方式的寶貴資訊。
類似於反彙編,反編譯器更進一步,嘗試用高階語言重現程式碼。通常,這種高階語言是 C,因為 C 足夠簡單和原始,可以促進反編譯過程。反編譯確實有其缺點,因為在原始編譯過程中會丟失大量資料和可讀性結構,並且無法重現。由於反編譯科學還處於起步階段,並且結果“良好”但並非“出色”,因此本頁面將僅列出反編譯器,並對反編譯的可能性進行一般性(但簡短的)討論。與反彙編器相比,反編譯器生成的程式碼不需要熟悉手頭的處理器。甚至可能反編譯的程式碼可以在不同的處理器上編譯,或者為在不同的處理器上重現程式提供一個合理的起點。
面對最佳化編譯器,人們經常問“反編譯甚至可能嗎?”在某種程度上,通常是可能的。但是,請不要誤解:最佳化編譯器會導致無法挽回的資訊丟失。一個例子是內聯,如上所述,其中呼叫的程式碼與其周圍環境合併,因此無法識別原始子例程的呼叫位置。反轉此過程的最佳化器類似於一個可以將詩歌用另一種語言重現的人工智慧程式。因此,完美的可操作反編譯器還有很長的路要走。最多,當前的反編譯器只能用作逆向工程過程的輔助工具,需要大量艱苦的工作。
- Hex-Rays 反編譯器
- Hex-Rays 是一款商業反編譯器。它作為流行的 IDA-Pro 反彙編器的擴充套件而製作。它目前是唯一一個可用的商業反編譯器,可以產生可用的結果。它支援 x86 和 ARM 架構。
- http://www.hex-rays.com/products/decompiler/index.shtml
- ILSpy
- ILSpy 是一款開源 .NET 程式集瀏覽器和反編譯器。
- https://github.com/icsharpcode/ILSpy
- DCC
- DCC 可能是現存最古老的反編譯器之一,可以追溯到 20 多年前。它作為一般反編譯過程的良好歷史和理論參考框架(映象:[1][2])。截至 2015 年,DCC 是一款 活躍專案。一些最新的更改包括針對長期存在的記憶體洩漏的修復以及更現代的基於 Qt5 的前端。
- RetDec
- 可重定向反編譯器是一款免費軟體 Web 反編譯器,它接收 Intel x86、ARM、MIPS、PIC32 和 PowerPC 架構的 ELF/PE/COFF 二進位制檔案,並輸出類似 C 或 Python 的程式碼,以及流程圖和控制流圖。它對每個反編譯設定了執行時間限制。它在大多數情況下都能產生良好的結果。
- https://github.com/avast/retdec
- Reko
- 一個模組化的開源反編譯器,支援互動式 GUI 和命令列介面。它的可插拔設計支援多種可執行檔案格式和處理器架構的反編譯(截至 2015 年,支援 8 位、16 位、32 位和 64 位架構)。它還支援在實際反編譯之前執行解包指令碼。它對二進位制檔案執行全域性資料和型別分析,並在 C++ 的一個子集中生成其結果。
- http://sourceforge.net/projects/decompiler
- https://github.com/uxmal/reko
- C4Decompiler
- C4Decompiler 是一款正在開發中的互動式靜態反編譯器(2013 年 Alpha 版)。它對二進位制檔案進行全域性分析,並在 Windows GUI 中顯示生成的 C 原始碼。上下文選單支援導航、屬性、交叉引用、C/Asm 混合檢視以及反編譯上下文的操縱(函式 ABI)。
- http://www.c4decompiler.com
- Boomerang 反編譯器專案
- Boomerang 反編譯器旨在建立一個強大的、可重定向的反編譯器。到目前為止,它只以中等成功率反編譯成 C。
- http://boomerang.sourceforge.net/
- 逆向工程編譯器 (REC)
- REC 是一款強大的“反編譯器”,它將本機彙編程式碼反編譯成類似 C 的程式碼表示。程式碼介於彙編和 C 之間,但比純彙編更具可讀性。不幸的是,該程式似乎很不穩定。
- http://www.backerstreet.com/rec/rec.htm
- ExeToC
- ExeToC 反編譯器是一款互動式反編譯器,過去曾吹噓過相當不錯的結果。
- http://sourceforge.net/projects/exetoc
- snowman
- Snowman 是一款開源的本機程式碼到 C/C++ 反編譯器。支援 ARM、x86 和 x86-64 架構。讀取 ELF、Mach-O 和 PE 檔案格式。重建函式、其名稱和引數、區域性和全域性變數、表示式、整數、指標和結構型別、所有型別的控制流結構,包括 switch。具有一個不錯的圖形使用者介面,可以一鍵在彙編程式碼和重建的程式之間導航。有一個命令列介面用於批處理。
- https://derevenets.com
- Ghidra
- Ghidra 是一款反向工程軟體包,其中包含一個反編譯器。它由美國國家安全域性為內部工作編寫,顯然是由於他們不想再培訓他們僱用的每一個人而釋出的。它用 Java 編寫。
大多數嵌入式 CPU 都是 8 位 CPU。[1]
通常,當子例程完成後,它會返回到執行緊隨call指令的下一個地址。
但是,組合語言程式設計師偶爾會使用幾種不同的技術來調整返回地址,從而使反彙編更加困難
- 跳轉表,
- 計算跳轉,以及
- 呼叫指令後的引數。
在 8 位 CPU 上,計算跳轉通常透過將計算出的“返回”地址壓入堆疊來實現,然後使用“返回”指令跳轉到該地址。例如,RTS 技巧使用這種技術來實現跳轉表(分支表)。
一些子例程不是從堆疊或某些固定的全域性地址中獲取其引數,而是將其引數提供在呼叫該子例程的指令之後的記憶體地址中。使用此技術的子例程會調整返回地址以跳過所有常量引數資料,然後返回到“呼叫”指令後的多個位元組的地址。使用此技術的更著名的程式之一是“Sweet 16”虛擬機器。
該技術可能會使反彙編更加困難。
以下是一個簡單示例,其中write()過程按如下方式實現
; assume ds = cs, e.g like in boot sector code
start:
call write ; push message's address on top of stack
db "Hello, world",0dh,0ah,00h
; return point
ret ; back to DOS
write proc near
pop si ; get string address
mov ah,0eh ; BIOS: write teletype
w_loop:
lodsb ; read char at [ds:si] and increment si
or al,al ; is it 00h?
jz short w_exit
int 10h ; write the character
jmp w_loop ; continue writing
w_exit:
jmp si
write endp
end start
然後,像 TASM 這樣的宏彙編器將使用這樣的宏
_write macro message
call write
db message
db 0
_write endm
從人類反彙編器的角度來看,這是一個噩夢,儘管在原始彙編原始碼中,這很容易閱讀,因為無法從二進位制形式決定 db 是否應該被解釋,並且這可能包含各種跳轉到實際的可執行程式碼區域,觸發對永遠不應該分析的程式碼的分析,並干擾對實際程式碼的分析(例如,從 0000h 或 0001h 反彙編上面的程式碼根本不會產生相同的結果)。
但是,一個半像樣的工具,可以指定規則,並使用啟發式方法來識別文字,將不會有任何問題。
大多數 32 位 CPU 使用 ARM 指令集。[1][2][3]
典型的 ARM 彙編程式碼是一系列子程式,子程式之間散佈著字面常量。子程式的 標準序言和尾聲 非常容易識別。
- ciasdis “一個彙編器,其中操作碼、運算元和修飾符都是物件,可用於反彙編。” 用於 8080 8086 80386 Alpha 6809,並且應該可用於 Pentium 68000 6502 8051。
- radare,逆向工程框架 包括用於反彙編許多處理器程式碼的開源工具,包括 x86、ARM、PowerPC、m68k 等;還包括用於許多虛擬機器,包括 java、msil 等;以及用於許多平臺,包括 Linux、BSD、OSX、Windows、iPhoneOS 等。
- IDA,互動式反彙編器(IDA Pro)可以反彙編大量處理器的程式碼,包括 ARM 架構(包括 Thumb 和 Thumb-2)、ATMEL AVR、INTEL 8051、INTEL 80x86、MOS Technologies 6502、MC6809、MC6811、M68H12C、MSP430、PIC 12XX、PIC 14XX、PIC 18XX、PIC 16XXX、Zilog Z80 等。
- objdump,GNU binutils 的一部分,可以反彙編多種處理器和平臺的程式碼。binutils 是工具鏈的重要組成部分,因為它提供了連結器、彙編器和其他實用程式(如 objdump)來操作目標平臺上的可執行檔案,並且適用於大多數流行平臺。
- 對於 OS X/BSD 系統,XCode 套件中有一個類似的工具,叫做 otool。
- 反彙編器 在 Curlie 上列出了大量反彙編器
- 程式轉換維基百科: 反彙編 列出了許多高度推薦的反彙編器
- 在 SourceForge 上搜索 “disassemble” 展示了適用於各種 CPU 的許多反彙編器。
- Hopper 是一款反彙編器,執行在 OS-X 上,並可以反彙編 32/64 位 OS-X 和 Windows 二進位制檔案。
- 昆士蘭大學二進位制翻譯器(UQBT) 是一個可重用的基於元件的二進位制翻譯框架,支援 CISC、RISC 和基於堆疊的處理器。
- ↑ a b Jim Turley. "The Two Percent Solution". 2002.
- ↑ Mark Hachman. "ARM Cores Climb Into 3G Territory". 2002. “雖然英特爾和 AMD 在計算領域獲得了大部分關注,但 ARM 的嵌入式 32 位架構……已超過所有其他架構。”
- ↑ Tom Krazit. "ARMed for the living room". “ARM 在 2005 年授權了 16 億個核心”。2006 年。
- http://www.crackmes.de/ : 逆向工程挑戰
- Caesum 的 “A Challengers Handbook”[3] 提供了一些關於逆向工程 JavaScript、Flash Actionscript (SWF)、Java 等程式的提示。
- 開源研究所偶爾會在其其他腦筋急轉彎中進行逆向工程挑戰。[4]
- 程式轉換維基百科有一個 逆向工程和再工程路線圖,討論了反彙編器、反編譯器以及用於將程式從一種高階語言翻譯成另一種高階語言的工具。
- 其他支援多平臺的反彙編器