C++反汇编与逆向分析技术揭秘(第2版)
上QQ阅读APP看书,第一时间看更新

2.7 本章小结

计算机的工作流程归根结底是输入→处理→输出的过程,而数据正是被处理的对象。作为逆向工作者,需要正确考察数据。对数据的考察有以下两点。

1. 在何处

数据是代码加工处理的对象,而代码本身也是以二进制形式存放的,对于处理器而言,代码的本质也是数据。我们在分析的时候,会看到不同指令对数据的处理,这时首先要确定数据的存储位置,对于内存中的数据,要查看地址。有了内存地址,才能得到内存属性。我们需要了解的属性有可读、可写、可执行。藉此,可以知道此数据是否为变量(可读写)、是否为常量(只读)、是否为代码(可执行)等。除了知道属性以外,我们还可以考察进程在内存的布局,如栈区、堆区、全局区、代码区等,藉此,又可以知道数据的作用域。

到底是代码还是数据?程序员认为是代码,那就是代码;程序员认为是数据,那就是数据。其中滋味,留待读者在后面的学习中逐步体会。

2. 如何解释

得到了内存地址,还是无法得到数据的正确内容,因为缺少解释方式。如“无鸡鸭也可无鱼肉也可无银钱也可”,可以解释为:“无鸡鸭也可,无鱼肉也可,无银钱也可。”也可以解释为:“无鸡,鸭也可;无鱼,肉也可;无银,钱也可。”

本章归纳的各类数据的解释方式和特点,是我们学习后面内容的基础,读者应重点掌握。下面补充介绍一下“大尾方式”和“小尾方式”。

这两种方式又分别称为“大端方式”和“小端方式”,出自某个西方童话,内容大意是:有个小人国,争论吃鸡蛋的时候应该是先把鸡蛋的大头敲开,还是应该先把小头敲开;为此国内引发了激烈的讨论,最后导致国家分裂、爆发战争,在这场战争中,国王和一些大臣丧命。

计算机的数据存储也是这样的道理,如果约定了存储的顺序,大家就都能正确写入和读出了,没必要在意当初为什么制定这样的存储顺序。制定字节存储顺序的人可能就是想避免别人问他为什么选择这个方向,故以此典故封堵闲人之口。