上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.2 高级语言
那么,为什么汇编语言没有成为编写软件的主流编程语言?一个主要原因是汇编语言不具有可移植性。想象一下,为了支持每种处理器架构,每次都必须重新编写整个应用程序代码库!这是非常大的工作量。取而代之的是,新的语言已经发展了起来,能将这些特定于处理器的细节抽象出来,使同一个程序可以很容易地在不同的架构下被编译。这些语言通常被称为高级语言,与更贴近特定计算机硬件和架构的低级汇编语言形成对比。
这里的“高级语言”一词本质上是相对的。C和C++刚开始被认为是高级语言,而汇编语言被认为是低级语言。由于出现了更新的、更抽象的语言,如Visual Basic和Python,C/C++如今经常被视为低级语言。归根结底,这取决于你所站的角度和所问的对象。
与汇编语言一样,处理器不能直接理解高级源代码。程序员需要使用编译器将编写的高级程序转换成机器码。和以前一样,我们需要指定二进制文件将在哪种架构上运行,并且使用交叉编译器在非Arm系统上创建Arm架构的二进制文件。
编译器的输出是一个可在特定的操作系统上运行的可执行文件,而且通常输出给用户的是二进制可执行文件,而不是程序的源代码。因此往往当我们想分析一个程序时,我们所拥有的只是编译后的可执行文件。
不幸的是,对于逆向工程师来说,一般情况下,不可能逆转编译过程返回到原始源代码。编译器不仅是非常复杂的程序,在原始源代码和生成的二进制文件之间有许多层的迭代和抽象,而且其中许多步骤丢弃了方便程序员推理程序的人类可读信息。
在没有要分析的软件源代码的情况下,根据要求的详细程度,我们有两种分析方式:反编译或反汇编可执行文件。