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]
- 程序转换维基百科有一个 逆向工程和再工程路线图,讨论了反汇编器、反编译器以及用于将程序从一种高级语言翻译成另一种高级语言的工具。
- 其他支持多平台的反汇编器