2016-11-21 1 views
3

Ich versuche zu verstehen C++ Art und Weise des Lesens/Schreibens im Speicher. Was ich habe ist, ich versuche, eine Adresse von einem Zeiger zu bekommen. Ich habe den Zeiger, der auf meine gewünschte Adresse zeigen wird. Wie ich die aktuelle Adresse habe, die ich verwenden möchte, um den Wert zu lesen, nehmen wir an, die Adresse ist 14C9862, aber wie jedes Mal, wenn ich das Programm erneut ausführen, ändert sich diese Adresse. Ich habe den Zeiger, der an diese Adresse schreibt (ich bin mit Cheat Engine), und es sagt der Zeiger gleich zu eax + ePSXE.exe + A82020 wie für EAX = 77420 und ePSXE.exe = 1718 (Ignorieren der Nullen), also Wie könnte ich das in C++ so schreiben, dass ich die ADRESSE jedes Mal bekomme, wenn ich das Programm erneut starte.C++ Holen Sie sich eine Adresse aus einem Zeiger

Aktuelle Code:

int readTest {}  
ReadProcessMemory(handle, (LPBYTE*)ePSXe+pointer?, &readTest, sizeof(readTest), 0); 
     std::cout << readTest << std::endl; 

Wie ich denke jetzt LPBYTE ein Zeiger auf ein Byte ist, so konnte es nicht sein, wie (A82020*)???? Ich bin nur verrückt zu werden, weiß ich nicht, wie es zu tun.

Antwort

0

Es sieht so aus, als ob Ihre Zieladresse berechnet werden kann, wenn Sie die Basisadresse des Moduls ePSXE.exe kennen.

Man könnte es mit der Verwendung des folgenden Codes erhalten:

#include <windows.h> 
#include <TlHelp32.h> 

DWORD procId = 0; // <-- Replace with real process ID 
MODULEENTRY32 lpModuleEntry = {0}; 
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, procId); 
if(!hSnapShot) 
{ 
    return NULL; 
} 

DWORD baseAddress = 0; 
lpModuleEntry.dwSize = sizeof(lpModuleEntry); 
BOOL bModule = Module32First(hSnapShot, &lpModuleEntry); 
while(bModule) 
{ 
    if(!strcmp(lpModuleEntry.szModule, "ePSXE.exe")) 
    { 
    CloseHandle(hSnapShot); 
    baseAddress = reinterpret_cast<DWORD>(lpModuleEntry.modBaseAddr); 
    } 
    bModule = Module32Next(hSnapShot, &lpModuleEntry); 
} 
CloseHandle(hSnapShot); 

Schließlich müssen Sie mit der Modul-Basisadresse statischen Teil der Adresse kombinieren:

ReadProcessMemory(handle, reinterpret_cast<LPVOID>(baseAddress + 0xA82020), &readTest, sizeof(readTest), NULL); 
+0

nicht zugelassen lpModuleEntry.szModule statt einer WCHAR ein Const Char sein? Visual gibt mir einen Fehler –

+0

@MatthewSouza Eigentlich ist es 'TCHAR', die' wchar_t' ist, wenn Ihr Projekt für Unicode-Zeichensatz konfiguriert ist. Der obige Code wird nicht getestet, er sollte Ihnen eine Idee geben, wie Sie mit der Adresse umgehen können. – Nikita

+0

Vielen Dank Ihre Antwort ist in der Tat richtig, es hat funktioniert! Aber ohne den EAX-Wert gibt es eine Zufallszahl von einer anderen Adresse. Ich weiß nicht die Hälfte der Dinge, die du geschrieben hast, aber ich werde es wirklich intensiv studieren. Vielen Dank für Ihre Antwort! –

Verwandte Themen