x86汇编与逆向工程:软件破解与防护的艺术
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1.1 反编译何时有用

对于许多编程语言来说,完全反编译是不可能的。这些语言将代码直接构建成机器码,在这个过程中会丢失一些信息,比如变量名。虽然一些高级反编译器能够为这些语言构建伪代码,但是这个过程并不完美。

然而,一些编程语言会使用所谓的即时(Just-In-Time,JIT)编译技术。当使用JIT语言编写的程序被“构建”时,它们会被从源代码转化为一种中间语言(Intermediate Language,IL)而非机器码。JIT编译器在程序运行之前会将一份代码以这种中间语言形式存储起来,等到程序开始运行的时候,再将代码转换为机器码。使用JIT编译技术的语言包括Java、Dalvik(Android)以及.NET。

例如,Java因在很大程度上不受平台限制而闻名。背后的原因是它使用了中间语言Java字节码(Java bytecode)和Java虚拟机(Java Virtual Machine, JVM)。通过将程序代码分发为字节码并在运行时对其进行编译,JVM将Java中间语言转换为特定于运行它的机器的机器码。虽然这种方式可能会对文件大小和性能产生负面影响,但在可移植性上有所收获。

JIT编译还大大简化了这些应用程序的逆向工程。这些中间语言与原始源代码非常相似,可以被反编译或转换回源代码。源代码的设计初衷就是为了方便人们阅读,这使得理解应用程序的逻辑、识别软件保护措施或其他嵌入的秘密变得容易得多。