逆向工程学:基础结构

本文介绍了逆向工程学的基础,特别是微架构和寄存器的相关知识。从编译过程开始,解释了C程序如何转化为汇编代码,并通过一个简单的C程序展示了编译、汇编和链接的过程。接着,详细探讨了处理器的寄存器,包括通用寄存器、EFLAGS寄存器中的标志位,如零标志位、符号标志位和进位标志位,以及它们在程序执行中的作用。建议读者通过实践理解汇编语言,为逆向工程打下基础。
摘要由CSDN通过智能技术生成

总览

感谢你观看我的最新系列文章 应用逆向工程学 。开始之前,我必须为这个系列做一些序言和声明。本文将会介绍微体系结构的基础知识,即对逆向工程所需要的事物。这些微体系结构的学习会使学习汇编的时产生的更容易理解一些。内容包括基础的通用寄存器,处理器状态标识符,ISA(指令集架构),虚拟内存,以及快速了解一下Intel 64的执行过程。

请注意:我假设你有使用Rust,C,C ++等编译语言进行编程的经验。如果没有,但有兴趣阅读本系列文章,那么我希望你花些时间学习其中一种语言的基础知识。 了解它们的高层结构将帮助你在底层环境中理解它们。 因为我们马上就要和汇编语言打交道。所以,如果你对它们的细节一无所知,则这篇文章可能不适合你。 因为你有很多东西要学习才能理解。同时我按照一种循环渐进的,适合学习的方式把将本系列分为许多部分。
本系列文章中给出的所有项目和示例都编写为在Windows 10 x64(版本1903 Build 18362)上运行。 所使用的架构是Intel 64架构。不过,如果你使用AMD64,大多数内容仍然适用。 如果你使用的是其他体系结构或操作系统,请务必参考正确的架构说明资料以了解它们。 你在这学习的内容在其他操作系统上大都适用。 如果当你感到读不懂时,请务必参考推荐的阅读部分,或寻找其他信息!

高层部分介绍

如果你使用的是高级语言,并且在正规机构中学习了某种形式的计算机系统课程,那么你可能会熟悉编译过程以及可执行文件的实际运行方式。但是,如果你没有了解过汇编或只听说过它的名称,那么没关系,我们将通过一个简单的C程序来了解汇编在处理器上的执行方式。对于C程序的部分细节,我禁用了所有优化功能,启用了完整的调试信息,并禁用了其他一些设置。我将提供代码仓库的链接,该系列的所有未来项目都将发布。你可以直接下载并在Visual Studio 2019中运行,然后进行编译和了解。我们将编写一个简单的C程序,该程序调用Windows API来获取计算机名称,实现自定义strlen函数,并打印出计算机名称和名称长度。我们不关注它的复杂性–我希望它尽可能简单。就是为了当我们将其分解为难以理解的汇编语言时,没有人会发狂(当在汇编中看到SIMD指令时,很少人能保持冷静)。

让我们简要介绍一下编译过程。

编译过程

C编译器的工作是进行项目的预处理,编译和链接可执行文件。这意味着将处理文件,预处理器指令(宏)和其他条件编译指令。这是第一阶段。编译过程通常涉及四个主要阶段,并使用各种工具-尤其是编译器,汇编器和链接器。该过程的第二步是编译。它获取预处理阶段和源代码的输出,并生成汇编源。值得注意的是,某些编译器使用集成的汇编器,那种汇编器会直接生成机器代码,而不是一些中间结果,然后调用汇编器。这将我们引到编译过程的下一部分:汇编。在此阶段,将使用汇编程序将汇编指令转换为目标代码。输出是直接在目标处理器上运行的指令-所有的指令都是(或应该是)ISA的一部分。编译过程的最后一部分是链接。现在已经生成了目标代码,我们必须重新排序程序的各个部分,以生成可以正常运行的可执行程序。链接器排列目标代码的各个部分,以便函数可以调用不同区域中的函数。此阶段还会链接程序中使用的库,以便程序可以使用这些库函数。对于我们接下来实现的的C程序,链接器会将kernel32.lib添加到目标代码中,以调用GetComputerNameA
这是编译过程的表视图。
图片来自Stackoverflow.com
我们已经介绍了编译过程,接下来我们将看看我们的C程序,并且生成一些汇编代码并进行一窥。 如果你对编译/编译器感兴趣,请参阅“推荐阅读”部分中的详细信息。

分解编译后的代码

我们要分解的编译后的代码是我们上面提到的C程序。 没什么特别的,这只是为了了解C程序真正的源代码。

ALT
上面这一段就是我们的C程序。 它获取我们的计算机名称,并将其与我们的计算机名称长度(就是名称缓冲区的字节数)一起打印出来。现在让我们对其进行编译,但是首先要对项目设置进行一些更改,以便我们可以生成汇编代码。 为了使汇编代码更容易理解,我们将禁用所有优化,并删除所有调试信息。 要生成汇编代码,我们必须将 项目 -> 属性 -> C/C++ -> 输出文件 中的汇编程序输出 设置为/FA
ALT
汇编器输出将放置在我们的输出目录中。 让我们构建它,然后到输出目录中打开汇编器输出的文件。 如果你不熟悉汇编,你可能很难理解下面的内容。 你可能还需要会一些指令和助记符(只是表示操作的一种表示形式)。
ALT
生成的汇编代码非常的长,所以我只选择了我们需要关注的部分:main函数。可以看到,即使添加了各种标识符,这东西读起来也还是和天书一样。在上面节选的汇编代码中,每一行都是一条指令(不包括注释和主PROC / ENDP)。x86体系结构中,有数百条指令,同时还包括这些指令的数十种变体。这些紫粉色的关键字就是我们所说的助记符。大致浏

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值