逆向工程--数据的存储及表示形式
写在最前面:
由于以前学习过相关内容,这里只记录一些重点,不会按照目录一步步记录。
同时此课程重在实践,所以后续会有较多的实践操作。
进制及进制的转换
二进制
、十六进制
、八进制
、十进制
之间的转换公式要记清楚,这是一个很基础的知识,这里不再赘述。
数据宽度、字节序
数据宽度
是指数据在存储器中存储的尺寸。
在计算机中,所有数据的基本存储单位都是字节(byte)
,每个字节占8个位(位
是计算机存储的最小单位,而不是基本单位,因为在存储数据时几乎没有按位进行存储的)。其他的存储单位还有字(word)
、双字(dword)
和八字节(qword)
。
各个存储单元可以表示的数值范围如下:
注:上表中给出的数值范围是无符号数。对于有符号数往往是使用第一位表示正负:0表示正、1表示负
。
字节序:即字节顺序。是指一个数在内存单元中各个单元存储的顺序
有以下两种字节序:
- 大尾方式:也叫大端存储。是指数据高位存放在低地址,数据低位存放在高地址。
- 小尾方式:也叫小端存储。与大尾存储的顺序相反。
以0x01020304
为例,两种字节序下的存储顺序如下表:
注:字节序是以数据宽度为单位的,也就是说我们在根据字节序判断数据时首先要知道此数据的宽度,而后在此宽度大小下进行分析。
注:字节序往往容易记混,这个说一下我的记忆方法。
把内存
看作是一条连续的位空间,左边是高位,右边是低位,此时将数据存储到内存中:大端法
就是反向存储,小端法
就是正向存储,而一个字节的内部是采用小端的思想。
一般在Windows
中使用小端存储、在Linux
和网络传输
中使用大端存储。
判断字节序的方法
取值比较法
先定义一个4字节的十六进制数,而后取其在内存中的低地址字节的数据,根据其值判断即可
注意:这段代码的关键就是*(BYTE*)&dwSmallNum
取出来的值。我的想法是通过与运算
,获取低地址的八位二进制数。
直接转换比较法
前置知识:网络传输中使用大端序+有函数可以将本机数据转换为网络数据
判断方法:将某数据与其转换后数据比较即可判断是否为大端序
常用的字节序转换函数:
注意:上图代码有误,应该将判断结果交换。