由於我是一個彙編語言初學者和學習目的,我試圖在遊戲中掃描內存地址和指針。我對指針和地址感到困惑。彙編指針和基地址
我在youtube上找到了教程的指針,但我想深入瞭解這個指針和偏移量。
我不明白如何將這些偏移和地址加在一起,給存儲1000
值我的理解是,00F8EBE0是基址的最後地址, 「22,20,10,C,20」是五個偏移量。
00F8EBE0 - > 11DA0924 = 1000這是怎麼發生的? 如何用C++讀取00F8EBE0值?我是否需要這些抵消來幫助我獲得最終價值?
由於我是一個彙編語言初學者和學習目的,我試圖在遊戲中掃描內存地址和指針。我對指針和地址感到困惑。彙編指針和基地址
我在youtube上找到了教程的指針,但我想深入瞭解這個指針和偏移量。
我不明白如何將這些偏移和地址加在一起,給存儲1000
值我的理解是,00F8EBE0是基址的最後地址, 「22,20,10,C,20」是五個偏移量。
00F8EBE0 - > 11DA0924 = 1000這是怎麼發生的? 如何用C++讀取00F8EBE0值?我是否需要這些抵消來幫助我獲得最終價值?
在進程的虛擬內存空間中,加載了映像文件(「something.exe」)。如果您將0x00F8EBE0
添加到該地址並閱讀該位置,您將獲得0x127B5450
。將箭頭讀作「指向」,將方括號中的值看作「地址加偏移量」。您可以通過編程獲得圖像庫using the ToolHelp32 API。
這裏有一個指向對象結構的指針鏈,每個偏移量都給你指向結構/對象中下一個指針的位置。
要從其他程序使用此信息,您可以使用ReadProcessMemory。從第一個偏移量(圖像基準)開始,調用ReadProcessMemory
,然後添加相關偏移量,然後重複。一般過程如下:
//assuming you've calculated the image base of the target
//and acquired a handle to the process:
LPVOID base = ImageBase + 0x00F8EBE0; //note: EntryPoint needs obtaining properly
LPVOID value;
ReadProcessMemory(hnd,base,(LPVOID) &value,sizeof value, NULL);
base = value + 0x20;
ReadProcessMemory(hnd,base,(LPVOID) &value,sizeof value, NULL);
base = value + 0xc;
ReadProcessMemory(hnd,base,(LPVOID) &value,sizeof value, NULL);
base = value + 0x10;
ReadProcessMemory(hnd,base,(LPVOID) &value,sizeof value, NULL);
base = value + 0x20;
ReadProcessMemory(hnd,base,(LPVOID) &value,sizeof value, NULL);
base = value + 0x44;
ReadProcessMemory(hnd,base,buf,sizeof value, NULL);
//value will now contain the number 1000.
請注意,沒有任何保證過程的地址空間在每次運行時看起來都是一樣的;如果它分配任何內存,到入口點的第一個偏移量(0x00F8EBE0
)將不相同。
如果您將指針和偏移量轉換爲C/C++,那麼您最好考慮數組。對於數組,通常有一個基指針,它是數組指針。當你想訪問一個特定的值時,你需要添加索引,該索引轉換爲偏移量。 最簡單的情況是一個char數組,因爲這裏你在索引和偏移量之間有1:1的關係。
char p[100];
p[10] = 32;
10的偏移和假設的「p」具有0x1000的一個值,那麼,其中值45被分配給將0x100A中的地址。
mov eax, 1000h
mov [eax+0ah], 20
現在下一個案例將是一個整數數組,其中int的大小爲四個字節。這裏的索引必須乘以編譯器爲你做的。
int p[100];
p[10] = 32;
這將轉化爲:
mov eax, 1000h
mov edx, 0ah
mov [eax+edx*4], 20
所以目標地址將是1000H + 10×4 = 40(28H) - > 1028h
在C++中,通常有類。從彙編器的角度來看,這和結構是一樣的,所以你有一個basepointer,它是你的類的地址,偏移地址指向那個特定類/結構中的每個成員。但是,您應該記住,當您在C/C++中創建一個strcut /類時,編譯器可以在成員之間添加填充字節,這實際上意味着來自membner的偏移並不是必需的,您在閱讀C/C++代碼。
i.E.
struct { char a; int b; } myStruct;
的在這種情況下B的偏移將很可能MYSTRUCT + 2(或4),而不是MYSTRUCT + 1,因爲編譯器將有可能增加一個aligment使其偶數地址或一個DWORD對齊的地址。