检查内存值

Inspecting memory values

本文关键字:内存 检查      更新时间:2023-10-16

我有一个检查游戏内存值的项目的源代码。我不明白的是:作者是如何如此精确地确定这些值的类型和位置的?例如,下面是他定义的结构体:

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字节发生了什么。

但是它并不像你想象的那么精确,因为有些字段显然是不可赋值的。这些是未知字符[]。

对结构体进行反向操作是一项非常繁琐的任务,您需要对调试器有很大的耐心;)

希望这有助于理解它的原理