Readprocessmemory
-
ich will von einem prozess den speicher auslesen mit readprocessmemory aber leider gibt getlasterror immer 998 aus.
Unzulässiger Zugriff auf einen Speicherbereich.
aber woran kann das liegen?? an den rechten oder übergebe ich die falsche addresse?? und wie kann ich die addressen finden
ich habs schon mit einem debugger versucht aber ich bekomme halt immer den fehler da raus!!Thx für eure Hilfe schon im V orraus
-
Aus was für einem Prozess möchtest du denn lesen? Woher hast du die Adressen an denen du lesen willst? Wenn du deinen Code posten würdest, wäre das schon recht hilfreich.
-
Das Prozesshandle muss mit Lesezugriffsrechten auf den Prozessspeicher geoeffnet werden, oder z.B. mit ALL_ACCESS.
Falls Windows das verbietet, kannst Du nix machen, ist dann halt eine Sicherheitsmassnahme.
Anderer Trick ist, dass Du z.B. eine DLL schreibst, die global mit jedem Prozess geladen wird, und die einen Thread startet, der prueft, ob ein externes Signal fuer einen Speicherdump kommt, und wenn, den Prozessspeicher in eine Datei schreibt.
(EDIT: letzteres geht, indem man einen Windows-Hook installiert)
-
was für ein Hook brauch ich da?
hier mal der code!!
HWND Spiel; HANDLE SpielProcess; unsigned GoldAddress=0x0DD812B8; DWORD SpielPID; char DEBUG[200]; FILE *DebugFile; DebugFile=fopen("DEBUG.txt","w"); Spiel=FindWindow(NULL,"Spiel"); if(!Spiel) { MessageBox(NULL,"Fenster ist geschlossen","FEHLER",NULL); return 0; } GetWindowThreadProcessId(Spiel,&SpielPID); wsprintf(DEBUG,"PID=%d",SpielPID); MessageBox(NULL,DEBUG,"INFO",NULL); SpielProcess=OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ,FALSE,SpielPID); if(SpielProcess==NULL) { MessageBox(NULL,"konnte kein ProzessHandle öffnen","FEHLER",NULL); return 0; } DWORD BytesRead=0; LPVOID lpBuffer=0; for(;;) { if(GetAsyncKeyState(0x41) < 0)break; if(ReadProcessMemory(SpielProcess,(LPCVOID)GoldAddress,lpBuffer,16,&BytesRead)==NULL) { MessageBox(NULL,"ReadProcessMemory failed","FEHLER",NULL); if(GetLastError()==998) { MessageBox(NULL,"Falsche Addresse","FEHLER",NULL); } break; } fprintf(DebugFile,"lpBuffer=%s BytesRead=%d GetLastError=%d\n",lpBuffer,BytesRead,GetLastError()); Sleep(500); } DWORD Exit; GetExitCodeProcess(SpielProcess,&Exit); CloseHandle(SpielProcess); ExitProcess(Exit); return TRUE;
-
Ich nehme mal an, dass du die Adresse im Spiel mit einem entsprechenden Tool herausgefunden hast, diese Adressen sind zwar dann abhängig vom Betriebssystem verschieden aber ansonsten immer gleich (frag mich nicht, warum
)
Ich gehe also mal davon aus, dass die WinAPI mit dem Fehlercode nicht den Zugriff auf den Speicher deines Spiels meint sondern einfach nicht in den Buffer schreiben kann, da er ein NULL-Pointer ist?!
-
Mr.Lover schrieb:
was für ein Hook brauch ich da?
Nimm irgendeinen, z.B. fuer Tastaturevents, wenn Du eh auf einen Tastendruck warten willst.
Bei OpenProcess() kannst Du uebrigens auch ALL_ACCESS angeben, dann kannst Du sicher(er) sein, dass Du auch dessen Speicher auslesen kannst.
Mit Hooks hast Du den Vorteil, das Dein Code im Kontext des jeweiligen Prozesses ausgefuehrt wird. Lies Dir mal das Hooks-Kapitel in der Platform SDK Dokumentation durch.
Du musst dafuer Deinen Code in eine DLL packen. ReadProcessMemory() kannst Du Dir dann schenken, da Du den Speicher direkt auslesen kannst.
Du kannst auch die ToolHelp DLL verwenden, um mehr Informationen ueber einen Prozess herauszubekommen. Du kannst damit auch einen Mini-Debugger schreiben, der das zu testende Programm startet und dann dessen Speicher ausliest.
-
Wie sieht denn der aktuelle Stand aus? Lag es an dem fehlerhaften Buffer?
-
ne lag nicht an dem buffer aber trotzdem danke
ok ich versuch das gleich mal mit den hooks thx @ Power Off
-
Mr.Lover schrieb:
ne lag nicht an dem buffer aber trotzdem danke
Du hast es aber schon versucht, Speicher für den Buffer zu allokieren?
LPVOID lpBuffer = new char[17]; //Buffer für die Daten(Nullterminierung nicht vergessen bei Ausgabe als String)Die Angelegenheit mit den Hooks schießt meiner Meinung nach etwas über das Ziel hinaus. Das Auslesen von Speicher fremder Prozesse funktioniert auf diesem wege 100-prozentig. und deine Zugriffsflags reichen eigentlich auch, das wäre somit die einzige Erklärung.
