检查内存值
Inspecting memory values
我有一个检查游戏内存值的项目的源代码。我不明白的是:作者是如何如此精确地确定这些值的类型和位置的?例如,下面是他定义的结构体:
typedef struct {
UInt16 times_used; // 0x0
UInt16 token; // 0x2
SInt16 previous_id; // 0x4
SInt16 next_id; // 0x6
SInt32 model; // 0x8
char unknown00[0x1B]; // 0xC
UInt8 player_owner; // 0x27
char unknown01[0x18]; // 0x28
UInt32 position_x; // 0x40
UInt32 position_y; // 0x44
char unknown02[0x1F]; // 0x48
UInt32 death_type; // 0x69
char unknown03[0x7]; // 0x6D
UInt32 destination_x; // 0x74
UInt32 destination_y; // 0x78
char unknown04[0x84]; // 0x7C
UInt32 health_damage; // 0x100
UInt32 shield_damage; // 0x104
UInt32 energy_damage; // 0x108
char unknown05[0x74]; // 0x10C
} Unit;
他在这个地址0x3BC2060
寻找它,它的大小是0x8B8
。我运行了程序,观察了这个位置的内存,当然,我可以识别出一些东西,比如name属性,但他是如何如此精确地发现的?
谢谢。
我希望我能说清楚:
你看0x3bc2060和下一个0x8b8字节/八字节。要对这样的结构体进行逆向工程,关键是要观察使用该结构体的程序,为其中的不同字段填充值。
那么您可以从从0x3bc2060开始的许多转储中推断出下面的0x8b8字节发生了什么。
但是它并不像你想象的那么精确,因为有些字段显然是不可赋值的。这些是未知字符[]。
对结构体进行反向操作是一项非常繁琐的任务,您需要对调试器有很大的耐心;)
希望这有助于理解它的原理
相关文章:
- 检查nullptr是否100%保护内存布局不受segfault影响
- 使用 valgrind 检查我的链表暗示中的内存泄漏,让我"肯定丢失:1 个块中有 40 个字节"
- 如何使用 Malloc 调试来检查本机内存泄漏?
- 如何在c/c++中检查两个任意内存范围是否重叠
- 如何检查C++智能指针内存分配是否成功?
- 投射空指针以检查内存对齐情况
- 有没有办法检查内存缓存是否已重新启动?
- 为什么我的 C++ 程序在执行 TCMALLOC 堆检查器或堆配置文件时使用大量内存
- 如何检查是否可以在C 中使用某个内存地址
- 检查destructor是否正在破坏所有动态内存
- 在编译时检查特征类型保存的数据在内存中是否连续
- 我可以检查共享内存中是否存在地址
- 如何检查指针是否指向正确对齐的内存位置
- 使用GDB并检查Data的内存布局
- Malloc内存检查是否连续
- 嵌入的Linux PPC32动态内存检查工具
- 与实际内存内容相比,GDB 内存检查输出偏差 8 个字节
- 如何对守护程序进行内存检查
- 双指针内存检查,我们是否需要单独删除两者
- 运行valgrind/其他内存检查通过eclipse luna在Windows-8 64位