1

我正在使用稱爲Cheat Engine的內存編輯應用程序。我將Cheat Engine附加到遊戲中。在我的遊戲中,我有一個稱爲HP的32位整數。 HP存儲在內存地址A中。如果我重新啓動遊戲,HP將存儲在新的內存地址B中。似乎使用Cheat Engine,我可以執行指針掃描並找到指向的靜態內存地址C另一個內存地址及其相應的偏移量D和偏移量,以便在該會話期間[D +偏移量]始終存儲HP的內存地址。所以如果我解引用[D + offset],我總是得到存儲HP的內存地址。指針的偏移有什麼好處?

這裏是一個圖:

A或B - > HP

d +偏移 - > A或B

Ç - > d

優點是什麼使用偏移?爲什麼C不能直接指向A或B?我很熟悉使用偏移量在處理C語言中的數組時很有用。這是否意味着只要我看到指針的偏移量,指針就指向數組中的第一個元素,偏移量是指數組中的一個元素?

+0

在這個級別的答案可能會受到代碼旨在運行的芯片(或虛擬機)的體系結構和指令集的嚴重影響。一些指令集通過爲偏移索引提供快速尋址模式來鼓勵這種情況。 – dmckee 2013-04-23 16:32:54

回答

2

如果您瞭解C語言,應該很容易想象和理解。在C中編寫的任何內容都非常接近編譯程序時生成的實際機器代碼。

C語言中對象的抽象通常是用「struct」來完成的。

在您的例子設想一個非常簡單的「播放器」的結構:

struct Player { 
    int id; 
    float xposition; 
    float yposition; 
    int health; 
    int maxhealth; 
}; 

如果你想創建這樣一個對象,你可以做這樣的事情:

struct Player *myPlayer = malloc(sizeof(struct Player)); 

什麼是好的用高級語言看結構化的東西其實只是編譯程序中的一塊內存。

爲了訪問例如「健康」,你在C中使用myPlayer->health;。但是現在它如何在編譯的程序中看起來並不知道美麗的名字,並且只有一塊內存可以使用?

它必須使用基址指針的偏移量。在上面的例子中(假設Windows操作系統和任何默認配置成熟的編譯器)在一些僞機器代碼的訪問將是這個樣子:

move myHealth, read4bytes[myPlayer + 12] 

如果您反向工程編程',你不能告訴無論內存塊是一個結構體,一個數組,還是一個類(來自C++代碼)或者完全不同的內存塊的偏移量訪問。

+0

完美解釋。真棒回答。 :) – user2312080 2013-04-23 18:33:11