WriteProcessMemory funktioniert nicht richtig
-
Hi,
ich versuche gerade einen Integer eines anderen Programms zu verändern. Hier ist mein Code:
MEMORY_BASIC_INFORMATION mbi; SYSTEM_INFO sysinfo; unsigned long FromAddress = 0x00000000; bool Break = false; GetSystemInfo(&sysinfo); do { VirtualQueryEx(hProcess, (LPCVOID) FromAddress, &mbi, sizeof(MEMORY_BASIC_INFORMATION)); if (mbi.State == MEM_COMMIT && mbi.Protect == PAGE_READWRITE && mbi.Type == MEM_PRIVATE) { unsigned long Start = (unsigned long) mbi.BaseAddress; unsigned long End = (unsigned long) mbi.BaseAddress + mbi.RegionSize; LPBYTE buf = new BYTE[End - Start]; ReadProcessMemory(hProcess, (LPVOID) Start, buf, End - Start, 0); for (int i = 0; i < (int) (End-Start); ++i) if (buf[i] == (BYTE) NewValueInt) { cout <<"Value found!" <<endl; int CurrentAddress = Start + i; if (!WriteProcessMemory(hProcess, (LPVOID) CurrentAddress, NewValue, 1024, 0)) cout <<"Writing Failed!" <<endl; Break = true; break; } delete [] buf; } FromAddress += mbi.RegionSize; } while ((LPVOID) FromAddress < sysinfo.lpMaximumApplicationAddress && !Break);
Ich durchsuche also die ganze Bandbreite der Addressen und ich finde sie dann auch (lauft Output). Was nicht funktioniert ist das was ich bezwecken möchte: Die Variable meines anderen Programms zu ändern:
#include <iostream> #include <conio.h> #include <windows.h> int main() { SetConsoleTitle("Victim"); int a = 1; while (true) { _getch(); std::cout <<"a = " <<a <<std::endl; } }
-
Du brauchst evtl. noch ein VirtualProtectEx. Ansonsten kannst du immer mit GetLastError schauen, ob du mehr Infos über den Fehler bekommst.
-
WriteProcessMemory(hProcess, (LPVOID) CurrentAddress, **&**NewValue, 1024, 0)
-
Hallo, ich hab da früher mal was zusammen gefrickelt das habe ich gerade noch gefunden, vielleicht hilft dir das.
#include <windows.h> #include <iostream> using namespace std; void read_addr ( HANDLE ); void write_to_addr ( HANDLE ); int main() { HWND hwnd = 0; DWORD ID = 0; HANDLE handle = 0; int auswahl = 0; char win_title[256] = "0"; cout<<"Fester Titel von zu Manupulierendem Programm eingeben: "; cin.getline ( win_title , 256); hwnd = FindWindow(NULL, win_title ); if(!hwnd) { cout<<"Fehler Programm konnte nicht gefunden werden !"<<endl; system("PAUSE"); return 0; } GetWindowThreadProcessId(hwnd, &ID); handle = OpenProcess(PROCESS_ALL_ACCESS, false, ID); while (1) { system("CLS"); cout<<"(1) Adressen lesen"<<endl; cout<<"(2) Wert an Adresse schreiben"<<endl; cout<<"Auswahl: "; cin>>auswahl; switch ( auswahl ) { case 1: read_addr ( handle ); break; case 2: write_to_addr ( handle ); break; default: cout<<"Falsche eingabe 1 oder 2 eingeben !"<<endl; system("PAUSE"); break; } } system("PAUSE"); CloseHandle(handle); return 0; } void read_addr ( HANDLE handle ) { unsigned adresse = 0; int puffer = 0; system("CLS"); cout<<"Zu lesenden Adresse eingeben: "; cin>>adresse; ReadProcessMemory(handle, ( LPCVOID )adresse, &puffer , sizeof(puffer) , 0); cout<<"Adress Wert: " << puffer << endl; system("PAUSE"); } void write_to_addr ( HANDLE handle ) { int wert = 0; int puffer = 0; unsigned addr = 0; DWORD rw = 0; system("CLS"); cout<<"Speichadresse eingeben an die die Daten geschrieben werden sollen: "; cin>>addr; cout<<endl; cout<<"Wert eingeben welcher an die Speicheradresse geschrieben werden soll: "; cin>>wert; WriteProcessMemory(handle, (LPVOID)addr, &(puffer = wert ), sizeof(int), &rw); }
Vic
#include <windows.h> #include <iostream> int main() { SetConsoleTitle("test programm"); int var = 19; while (1) { system("CLS"); std::cout<< var << " " << &var << std::endl; Sleep(1500); } }