MessageBox mit Errorcode
-
Hey Leute

Ich sitze immer noch an meinem Pinballhack, es gibt aber schon wieder ein Problem. Ich sitze glaube ich mittlerweile 8-9 Stunden an diesem Teil. xD
Ich frage aus einem Textfeld den Wert ab, der in die Highscore geschrieben werden soll. Kompiliert wird es einwandfrei, allerdings kackt das Programm ab und ich habe keine Ahnung warum.
if((HWND)lParam == hwndButton1) { if (HIWORD(wParam) == BN_CLICKED) { HWND hWindow; HWND h1; HANDLE pHandle; DWORD pid; LONG addr = 0x01025598; LPSTR buffer; h1=hwndLabel1; SetWindowText(h1,"Hacking..."); const int max_text_length = 100; GetWindowText(h1,(LPTSTR)buffer,max_text_length); SIZE_T written; if(hWindow = FindWindow(NULL, "3D-Pinball für Windows - Space Cadet")) { GetWindowThreadProcessId(hWindow,&pid); pHandle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid); if(pHandle) { SetWindowText(h1, "Opened Process..."); WriteProcessMemory(pHandle,(LPVOID)addr,(LPVOID)atoi(buffer),sizeof(atoi(buffer)),&written); DWORD errorcode = GetLastError(); if(written) { SetWindowText(h1, "Successfully written Highscore..."); return 0; } else { MessageBox(h1,"oO",(LPSTR)errorcode,MB_OK); } } else { SetWindowText(h1, "Failed to open process."); } } else { SetWindowText(h1, "Couldn't find the Window."); } } }Ich habe das restliche des Programmes rausgelassen, ich bin mir ziemlich sicher das es an der MessageBox liegt, da wenn ich dort (LPSTR)errorcode durch einen normalen string ersetze, keine Probleme auftreten. Das heißt ja wiederrum das der Wert nicht in den Speicher geschrieben hat, kann das vllt an der atoi(buffer) Konvertierung liegen?
-
Brrr, gruselige Sachen machst du da

1. "PROCESS_ALL_ACCESS" ist böse. Denke bei späteren Projekten darauf die Flags auszuwählen die du brauchst, nicht alle auf einmal. Die Größe variiert nämlich je nach System.
WriteProcessMemory(pHandle,(LPVOID)addr,(LPVOID)atoi(buffer),sizeof(atoi(buffer)),&written);Da ist einiges falsch
1. Prozesshandle, korrekt
2. Addresse, auch korrekt
3. Was soll das denn bitte sein? atoi gibt eine Integerzahl zurück, die Funktion jedoch erwartet einen Zeiger auf auf deinen Wert. Hier tritt wohl eine Soeicherbereichsverletzung auf, deswegen "kackt" es auch ab.
4. Wie kommst du darauf? Du willst offensichtlich ein int schreiben, warum dann nicht sizeof(int) ?
5. OkMessageBox(h1,"oO",(LPSTR)errorcode,MB_OK);Hier wieder ein paar grobe Fehler
1. Ok
2. Sinnlos, aber korrekt
3. Schon wieder fütterst du die Funktion mit Bullshit und benutzt nen C-Csast damit der Compiler es frisst. GetLastError() gibt ein DWORD zurück, also eine Zahl. Die Funktion erwartet einen Zeiger auf einen String. Der Errorcode ist zu 100% eine Zahl außerhalb des Speicherbereichs des Programms, von daher schon wieder Speicherbereichsverletzung.
4. OkDu solltest dich dringend nochmal mit den Grundlagen auseinander setzen bzw aufhören C-Casts zu benutzen um dem Compiler zu vergewaltigen.
pHandle = OpenProcess(PROCESS_VM_WRITE, false, pid) { DWORD bytesWritten; bool errorCheck; int numberToWrite = atoi(buffer); errorCheck = WriteProcessMemory(pHandle,(LPVOID)addr,(LPVOID)&numberToWrite, sizeof(int), &bytesWritten); if(!errorcheck || bytesWritten != sizeof(int) { char stringBuffer[6]; DWORD lastError = GetLastError(); itoa (lastError, &stringBuffer, 10); MessageBox(h1,"Error occured !", &stringBuffer, MB_OK); } }So sollte es klappen, habe das ganze hier im Forum geschrieben und hab nie wirklich mit C-Bordmitteln gecoded. Wenn du C++ codest, solltest du deinen Stil gründlich überarbeiten, das hier ist vlt C, hat aber mit C++ so gut wie nix zu tun

-
Danke für deine Antwort! Ich bin noch nicht lange dabei und übe mit dem "Projekt" jetzt mit der WinAPI zurecht zu kommen.
Ich habe bis jetzt nur die C++ Syntax gelernt und die WinAPI Referenz wenn es nötig war studiert. Ich setz mich morgen mal ran und überarbeite meinen Code.
-
So, ich hab es überarbeitet, allerdings bekomme ich einen plöden Kompilierfehler und wenn ich den fehlerhaften Code auskommentiere, dann stürzt das Programm ab, also wieder eine Zugriffsverletzung.
if (HIWORD(wParam) == BN_CLICKED) { HWND hWindow, h1; HANDLE pHandle; DWORD pid,bytesWritten; LONG addr = 0x01025598; char buffer[256]; h1=hwndLabel1; bool errorCheck; const int max_text_length = 100; GetWindowText(h1,(LPTSTR)buffer,max_text_length); if(hWindow = FindWindow(NULL, "3D-Pinball für Windows - Space Cadet")) { GetWindowThreadProcessId(hWindow,&pid); pHandle = OpenProcess(PROCESS_VM_WRITE,false,pid); if(pHandle) { int numberToWrite = atoi(buffer); errorCheck = WriteProcessMemory(pHandle,(LPVOID)addr,(LPVOID)&numberToWrite,sizeof(int),&bytesWritten); if(!errorCheck || bytesWritten != sizeof(int)) { char stringBuffer[6]; DWORD lastError = GetLastError(); itoa (lastError, &stringBuffer, 10); MessageBox(h1,"Error occured !", &stringBuffer, MB_OK); } else { SetWindowText(h1, "Successfully written Highscore..."); } } else { SetWindowText(h1, "Failed to open process."); } } else { SetWindowText(h1, "Couldn't find the Window."); } }Fehler:
gui.cpp: In function `LRESULT WindowProcedure(HWND__*, UINT, WPARAM, LPARAM)': gui.cpp:136: error: cannot convert `char (*)[6]' to `char*' for argument `2' to `char* itoa(int, char*, int)' gui.cpp:137: error: cannot convert `char (*)[6]' to `const CHAR*' for argument `3' to `int MessageBoxA(HWND__*, const CHAR*, const CHAR*, UINT)' make.exe: *** [gui.o] Error 1
-
Hallo
itoa erwartet einen char-Zeiger und nicht die Adresse eines char-Arrays. Der gleiche Fehler passiert dir beim Aufruf von MessageBox. Am Beispiel von wsprintf:
char stringBuffer[6]; DWORD lastError = GetLastError(); wsprintf(stringBuffer, "%d", lastError); MessageBox(h1, stringBuffer, NULL, MB_OK);MfG,
Probe-Nutzer
-
Xdab4yaX schrieb:
Ich bin noch nicht lange dabei und übe mit dem "Projekt" jetzt mit der WinAPI zurecht zu kommen.
Und da fängst du gleich damit an in fremden prozessen rumzuhacken? Sollte man für die Grundlagen nicht erstmal etwas einfachere Sachen machen? Nur mal so eine Überlegung.
-
Probe-Nutzer schrieb:
Hallo
itoa erwartet einen char-Zeiger und nicht die Adresse eines char-Arrays. Der gleiche Fehler passiert dir beim Aufruf von MessageBox. Am Beispiel von wsprintf:
char stringBuffer[6]; DWORD lastError = GetLastError(); wsprintf(stringBuffer, "%d", lastError); MessageBox(h1, stringBuffer, NULL, MB_OK);MfG,
Probe-Nutzer
Naja, Fail von mir.
Ich würde sowieso Stringstreams statt itoa/atoi benutzen, eliminiert die Gefahr von Overflows...aber dachte der TE schreibt in C, deswegen habe ich versucht auch in C zu schreiben hehe.
-
Gut, habe den Kompilierfehler aus dem Weg geschafft, dank dir Probe-Nutzer.
Ich habe jetzt auch schon mit einem StringStream das Problem mit dem Absturz gelöst, jetzt gibt es nur noch ein Problem mit dem WriteProcessMemory, ich bekomme den Fehlercode 5, das bedeutet, das er keine ausreichenden Rechte hat, um in den Prozess zu schreiben
Ich bin aber im Administratorprofil eingeloggt und habe auch die processrights auf "PROCESS_VM_WRITE".
Wisst ihr woran das liegen kann, denn ich habe schonmal mit einem Konsolenprojekt das gleiche Teil geschrieben, dort funktionierte es fehlerfrei. Hier die Source dazu:#include <windows.h> #include <iostream> int main() { HWND hWindow; HANDLE pHandle; DWORD pid; LONG addr = 0x01025598; int buffer[1]; SIZE_T written; std::cout << "Pinball Hack by Xdab4yaX" << std::endl; std::cout << "Enter Value:"<<std::endl; std::cin >> buffer[0]; if(hWindow = FindWindow(NULL, "3D-Pinball für Windows - Space Cadet")) { GetWindowThreadProcessId(hWindow,&pid); pHandle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid); if(pHandle) { std::cout << "Process Opened..."<<std::endl; WriteProcessMemory(pHandle,(LPVOID)addr,buffer,sizeof(1),&written); if(written) { std::cout << "Writing Memory Successful..."<<std::endl; system("PAUSE"); } else { DWORD errorcode = GetLastError(); std::cout << "Failed to Write Memory!" << std::endl << errorcode << std::endl; system("PAUSE"); } } } }
-
Fixed!!!
Hier die Source, ich hab einfach ein Integer Array genommen, dann in den ersten Platz den gestreamten int reingeschrieben.
Like this:if (HIWORD(wParam) == BN_CLICKED) { HWND hWindow, h1; HANDLE pHandle; DWORD pid,bytesWritten; LONG addr = 0x01025598; char buffer[256]; h1=hwndLabel1; bool errorCheck; const int max_text_length = 100; istringstream isst; int numberToWrite=0; isst.str( buffer ); isst >> numberToWrite; int valueToWrite[1]; valueToWrite[0] = numberToWrite; GetWindowText(h1,(LPTSTR)buffer,max_text_length); if(hWindow = FindWindow(NULL, "3D-Pinball für Windows - Space Cadet")) { GetWindowThreadProcessId(hWindow,&pid); pHandle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid); if(pHandle) { errorCheck = WriteProcessMemory(pHandle,(LPVOID)addr,valueToWrite,sizeof(valueToWrite),&bytesWritten); if(!errorCheck || bytesWritten != sizeof(1)) { char stringBuffer[6]; DWORD lastError = GetLastError(); wsprintf(stringBuffer, "%d", lastError); MessageBox(h1, stringBuffer, NULL, MB_OK); } else { SetWindowText(h1, "Successfully written Highscore..."); } } else { SetWindowText(h1, "Failed to open process."); } } else { SetWindowText(h1, "Couldn't find the Window."); }Ich hab keinen Plan warum es gefunzt hat, aber ich hab jetzt nochmal 3 Stunden Arbeit nur dafür reingesteckt. Wenigstens klappt es jetzt!
Danke für eure Hilfe
-
1. OpenProcess: PROCESS_VM_OPERATION|PROCESS_VM_WRITE
2. würde Vorsichtshalber mit VirtualProtectEx() den Zugriff sicherstellen - die Page könnte ja auch mit dem PAGE_READONLY-flag versehen sein.