字节序(Byte Ordering)是多字节数据在计算机内存中存储或网络传输时各字节的存储顺序,主要分为两大类,一类是小端序(Little endian),另一类是大端序(Big endian)。

字节序

字节序是多字节数据在计算机内存中存放的字节顺序,它是学习程序调试技术必须掌握的基本概念之一。字节序主要分为小端序和大端序。示例代码:ZJANYP_JQ96FXALD[M9)U1V.png](https://cdn.nlark.com/yuque/0/2020/png/554486/1581247098561-6de7b74b-6b48-45ff-a1f1-a5209cf0445e.png#align=left&display=inline&height=88&name=ZJANYP_JQ96FXALD%5BM9%29U1V.png&originHeight=88&originWidth=651&size=56107&status=done&style=none&width=651)<br />以上代码中共有4种数据类型,他们大小不同。下面看看统一个数据根据不同字节序保存时有何不同。<br />![H}[MQV]FSJD4XL0QL(LL@I9.png
提示:字母a的ASCⅡ码的十六进制表示为0x61,字母e的ASCⅡ码的十六进制表示为0x65。字符串最后是以NULL结尾的。
采用大端序存储数据时,内存低位村拿出数据的高位,内存地址高位存储数据的低位,这是一种最直观的字节存储顺序;采用小端序存储数据时,地址高位存放数据的高位,地址的低位存放数据的低位,这是一种逆序的存储方式,保存的字节顺序被倒转,他是最符合人类思维的字节序。
数据为单一字节时,无论采用大端序还是小端序保存,字节存储顺序都一样。只有数据长度在2个字节以上时,即数据为多字节数据(multi-bytes)时,选用大端序还是小端序会导致数据的存储顺序不同。代码中,字符串“abcde”被保存在一个字符数组str中,字符数组在内存中是连续的,此时向字符数组存放数据,无论采用大端序还是小端序,存储顺序都相同。


大端序与小端序

采用大端序保存多字节数据非常直观,它常用于大型UNIX服务器的RISC系列的CPU中。此外,网络协议中也经常采用大端序方式。了解这些,对从事x86系列应用程序的开发人员以及代码逆向分析人员具有非常重要的意义,因为通过网络传输应用程序使用数据时,往往都需要修改字节序。
Intel x86 CPU采用的小端序。小端序采用逆序方式存储数据,使用小端序进行算数运算以及扩展/缩小数据时,效率都非常高。

在OllyDbg中查看小端序

首先编写一个简单的测试程序,代码如下:
EMKL0UJ{U_2HK$XU47EVR28.png
生成exe文件后用OllyDbg调试,用Go to命令跳转到401000地址处。
L6Q_]IVV28WD{9L6H~8FB]Y.png
main()函数地址为401000,全局变量b、w、dw、str的地址分别为40AC40、40AC44、40AC48、40AC4C。通过数据窗口来分别查看它们所在的内存区域,使用Go to命令跳转到40AC40地址处。
F$5`KI{EYL8WWB7W6{T%H]5.png
从图中可以看到,变量w与dw中的数据采用小端序存储。本书之后内容默认所有数据都采用小端序存储。