2011-08-05 66 views
2

我有一個檢查遊戲內存值的項目的源代碼。我不明白的是:作者如何精確地確定了這些值的類型和位置?例如,這裏就是他所定義的結構:檢查內存值

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。我運行程序並在這個位置觀察記憶,當然,我可以識別一些像名稱屬性的東西,但他是如何精確地發現這一點的?

謝謝。

+1

他用調試器。 –

回答

5

我希望我得到這個直:

你看看0x3bc2060和下0x8b8字節/字節。 爲了逆向工程這樣的結構,使用這個結構來觀察程序是非常重要的,通過填充它的不同字段的值來實現。

然後,您可以從許多從0x3bc2060開始的轉儲和以下0x8b8字節 推斷髮生了什麼。

但它並不像你所期望的那麼精確,因爲有些字段顯然是不可分配的。這些是char unknown []。

做一個反向結構是一個非常枯燥的事情,你需要與你的調試器的耐心;)

希望這有助於理解它是如何工作的原則