Lesen den Speicher aus “.exe" + offset?
Bin ich mit WinAPI ist ReadProcessMemory()
zu Lesen, einige "versteckte" Informationen aus einem Spiel.
Ich habe Cheat Engine, um herauszufinden, die statische Zeiger, aber ich weiß nicht, wie zu Lesen, von Ihnen.
Cheat Engine gibt mir einen Zeiger auf so etwas wie dieses: "mygame.exe"+1C50
Ich bin wirklich neu auf WinAPI, wie konvertiere ich "mygame.exe"+1C50
an eine Adresse, die ich Lesen kann mit ReadProcessMemory()
?
EDIT: ich habe versucht, die Vereinfachung des Problems, aber ich denke, ich sollte habe den vollständigen code in den ersten Platz.
Also ich arbeite mit statischen Adressen und multi-level-Zeiger hier, aber ich bin immer noch stecken mit immer die Basis-Adresse oder w/e.
Hier ist der vollständige code und ein Bild von meinem cheat engine Adresse:
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
using namespace std;
HANDLE GetProcessHandle(const char *procName);
int main()
{
const char *procName = "prism3d.exe";
HANDLE hProc = GetProcessHandle(procName);
if (hProc) {
/* This works if I use the dynamic address (f.e. 0x02C2C4DC),
but it changes every time I restart the game.
I need to use the static address (prism3d.exe+A1C) to get
the dynamic address for my "nuke".
*/
float nuke;
ReadProcessMemory(hProc, (void*)0x02C2C4DC, &nuke, 4, 0);
cout << nuke;
}
CloseHandle(hProc);
return 0;
}
HANDLE GetProcessHandle(const char *procName)
{
HANDLE hProc = NULL;
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (Process32First(hSnapshot, &pe32)) {
do {
if (!strcmp(pe32.szExeFile, procName)) {
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
break;
}
} while (Process32Next(hSnapshot, &pe32));
}
CloseHandle(hSnapshot);
return hProc;
}
Edit 2:
Hier ist, wie ich versuchte zu Lesen, den Wert meiner nuke, aber es gibt mir Zufallszahlen, verschiedene jedes mal wenn ich das Spiel neu starten (manchmal ist es 0
manchmal 324324324
, etc...):
if (hProc) [
DWORD baseAddr = (DWORD)GetModuleHandle(procName) + 0xA1C50; //also tried this with GetModuleHandle(NULL)
DWORD mainAddr;
ReadProcessMemory(hProc, (void*)(baseAddr + 0x111C), &mainAddr, 4, 0);
//Nuke
float nuke;
DWORD nukeAddr;
ReadProcessMemory(hProc, (void*)(mainAddr + 0x48), &nukeAddr, 4, 0);
ReadProcessMemory(hProc, (void*)nukeAddr, &nuke, 4, 0);
cout << nuke;
}
InformationsquelleAutor Skamah One | 2013-07-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Basis-offset ist in der Regel der Beginn des Moduls im Speicher, können Sie diese mit
GetModuleHandle
(die Adresse dieser gibt ist der start der PE-Speicher). Ich sage im Allgemeinen, weil einige Konventionen definieren der base relativ zum Anfang der code-Abschnitt, die Sie dann Lesen müssen, von der PE.können Sie etwas tun, wie die folgenden:
Den oben funktioniert nur, wenn Sie laufen im Adressraum des Prozesses, die Sie sind targeting (via dll injection), tun dies über eine remote-Prozess (wie dein Beispiel zeigt), die Sie benötigen, um aufzählen zu Prozess-Module um ein gültiges handle für das Modul, das Sie interessiert sind in.
MSDN ist ein Beispiel dafür, dass hier, refactoring es ein wenig, können Sie eine Funktion erstellen, die überprüft, den Namen und die Rückgabe der
HMODULE
wenn es passt, Gießen, geben Sie die Modul-Basisadresse..exe
statische Zeigerhaben Sie überprüft, ob die Adresse CE-berichten ist die Datei relativ oder code-Abschnitt relativ? und was genau sind die "seltsamen" zahlen?
NÖ, wie kann ich das überprüfen...? Ich habe einen Zeiger mit dem Wert
"mygame.exe" + 1C50
die Punkte an eine andere Adresse, die ich versuche, um die "andere Adresse". Und nur einige große Ganzzahlen17512325403
etc.das "große ganze Zahl" ist die Adresse, ReadProcessMemory wird nur eine Ebene der Dereferenzierung, so müssen Sie es mehrmals zu Folgen, die Zeiger
Nur realisieren Sie das nicht in den Adressraum des Prozesses, so GetModuleHandle fehl, siehe mein update
InformationsquelleAutor Necrolis