从代码到内存:通用入门指南
1. 指针与数组在内存中的存储
在内存中,像thinStringP(地址 0x01243040)和wideStringP(地址 0x0124306C)这样的变量所存储的值仅 4 字节长,且不包含字符串数据。这是因为它们实际上是指向各自数组首字符的指针。例如,thinStringP包含 0x012420F8,在对应内存视图中,可以看到地址 0x012420F8 处存储着 “my_thin_terminated_value_pointer”。
查看这些指针之间的数据,可以看到thinStringA和wideStringA存储的文本。此外,thinStringA和wideStringA在空终止符之后还有填充字节,这是因为它们被声明为长度为 40 的数组,所以会填充到 40 个字符。
2. 数据结构
与之前讨论的数据类型不同,结构体是用于容纳多个简单且相关数据的容器。了解如何在内存中识别结构体的游戏黑客,可以在自己的代码中模拟这些结构体,这能大大减少需要查找的地址数量,因为只需要找到结构体起始地址,而不是每个单独项的地址。
2.1 结构体元素顺序和对齐
结构体在内存转储中不会明显体现,内存转储显示的是结构体包含的对象。通过下面的代码示例来查看结构体元素的顺序和对齐情况:
struct