ich habe ein Problem ,denn ich möchte mit einer Value Adressen suchen und die Ergebnisse ersetzen. Dabei bin ich auf das gestoßen:
Code:
#include <Windows.h> #include <Tchar.h> #include <vector> // Struktur für Fensterelement struct Window { std::basic_string<::TCHAR> title; ::HWND handle; }; // Variablen std::vector<Window> windows; // Callback fr EnumWindows. Wird aufgerufen fr jedes Fenster BOOL CALLBACK EnumWindowsProc (::HWND hwnd, ::LPARAM l_param); // Listet Fenster auf und regelt Auswahl eines Fensters ::HWND select_window (void); // Werte aus dem Adresspuffer ersetzen void repleace_values (::HANDLE process, std::vector<::DWORD>& adresses); // Durchsucht Arbeitsspeicher nach gesuchtem Wert u. speichert alle Adressen mit diesem Wert void scan_memory (::HANDLE process, ::DWORD start, ::DWORD end, unsigned int value, std::vector<::DWORD>& adresses); // Dursucht die gespeicherten Adressen wiederholt void rescan_memory (::HANDLE process, std::vector<::DWORD>& adresses); // /////////////////////////////////////////////////////////////////////////// // Programmeinsprungspunkt. int _tmain (int argc, ::TCHAR* argv[]) { // Ausgabe der Überschrift ::_tprintf (_T ("MemScan v1.3 by TcH\n\n")); // Fenster auswählen ::HWND hwnd = select_window (); // Scann starten... ::DWORD process_ID; // Zum Fenster zugehörigen Prozess ermitteln ::DWORD thread_ID = ::GetWindowThreadProcessId (hwnd, &process_ID); // In den Prozess einklinken ::HANDLE process = ::OpenProcess (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF, FALSE, process_ID); ::MEMORY_BASIC_INFORMATION mbi; // Dient zur Ermittlung der Arbeitsspeichergröße, sowie Anfang und Ende ::SYSTEM_INFO sys_info; ::GetSystemInfo (&sys_info); // Alle Adressen welche den gesuchten Wert werden hier gespeichert std::vector<::DWORD> adresses; unsigned int value = 0; // Keine Adresswerte im Array, Scan starten ::_tprintf (_T ("Nach welchem Wert soll gescannt werden: ")); ::_tscanf (_T ("%d"), &value); ::_tprintf (_T ("starte Scanvorgang nach %d\n"), value); // Anfangsadresse für Durchsuchung festlegen ::DWORD adress = (::DWORD) sys_info.lpMinimumApplicationAddress; do { // Arbeitsspeicherbereiche ermitteln ::VirtualQueryEx (process, reinterpret_cast<void*>(adress), &mbi, sizeof (::MEMORY_BASIC_INFORMATION)); // Anfang & Ende des aktuellen Bereiches ermitteln ::DWORD start = (::DWORD) mbi.BaseAddress; ::DWORD end = (::DWORD) mbi.BaseAddress + mbi.RegionSize; // Bereich einem "tiefen" Scan unterziehen if (mbi.State == MEM_COMMIT) scan_memory (process, start, end, value, adresses); adress += mbi.RegionSize; // Durchsuche solange nach Bereichen, bis Ende im RAM } while (adress < (::DWORD) sys_info.lpMaximumApplicationAddress); // Ausgabe der Anzahl der Übereinstimmungen ::_tprintf (_T ("%d Uebereinstimmungen gefunden\n"), adresses.size ()); // nochmaliger Scan oder Ersetzen kann nur stattfinden, wenn Adressen gefunden wurden if (adresses.size () != 0) { while (true) { // Ausgabe des Menus unsigned int choice; ::_tprintf (_T ("Gefilterte Adressen Scannen (1)\n") _T ("Werte aus vorhandenem Scan ersetzten (2)\n") _T ("Beenden (3)\n") _T ("Auswahl: ")); ::_tscanf (_T ("%u"), &choice); // Vorhandene Adressen nochmals durchsuchen if (choice == 1) rescan_memory (process, adresses); // Werte der Adressen ersetzen else if (choice == 2) repleace_values (process, adresses); // Beenden else if (choice == 3) { // Aufräumen - Handle wieder freigeben ::CloseHandle (process); return 0; } // Ungültige Eingabe else ::_tprintf (_T ("Fehler - ungueltige Eingabe\n")); } } // Aufräumen - Handle wieder freigeben ::CloseHandle (process); // Schließen des Fensters verhindern ::TCHAR a; ::_tscanf (_T ("%c"), &a); return 0; } // /////////////////////////////////////////////////////////////////////////// // Callback fr EnumWindows. Wird aufgerufen fr jedes Fenster BOOL CALLBACK EnumWindowsProc (::HWND hwnd, ::LPARAM lParam) { // Kein Fenster if (!::IsWindow (hwnd)) return (TRUE); // nur sichtbare Fenster auflisten if (!::IsWindowVisible (hwnd)) return (TRUE); // Fensterberschrift ermitteln ::TCHAR title[256]; if (!::GetWindowText (hwnd, title, sizeof (title) / sizeof (title[0]))) return (TRUE); // neues Fenster hinzufgen... Window wnd; wnd.handle = hwnd; wnd.title = title; windows.push_back (wnd); return (TRUE); } // /////////////////////////////////////////////////////////////////////////// // Listet Fenster auf und regelt Auswahl eines Fensters ::HWND select_window (void) { // Alle Fenster auflisten ::EnumWindows (EnumWindowsProc, 0); // Liste aller Fenster ausgeben. std::vector<Window>::iterator window_it = windows.begin (); for (int i = 0; window_it != windows.end (); ++ window_it, ++ i) ::_tprintf (_T ("%d : %s\n"), i, window_it->title.c_str ()); // Auswahl des Fensters & Prüfung, ob Auswahl im Gültigskeitsbereich liegt unsigned int choice = 0; do { ::_tprintf (_T ("\nWelches Fenster soll gescannt werden: ")); ::_tscanf (_T ("%d"), &choice); } while (choice < 0 || choice >= windows.size ()); // ausgewählte Fensterhandle zurckgeben return (windows[choice].handle); } // /////////////////////////////////////////////////////////////////////////// // Werte aus dem Adresspuffer ersetzen void repleace_values (::HANDLE process, std::vector<::DWORD>& adresses) { // Abfragem durch welchen Wert ersetzt werden soll unsigned int write_buffer = 0; ::_tprintf (_T ("Mit welchem Wert soll ersetzt werden: ")); ::_tscanf (_T ("%d"), &write_buffer); // Adresse fr Adresse den Wert ersetzen std::vector<::DWORD>::iterator i = adresses.begin (); for (i; i != adresses.end (); ++ i) { if (::WriteProcessMemory (process, reinterpret_cast<void*>(*i), &write_buffer, sizeof (unsigned int), 0)) ::_tprintf (_T ("Erfolg - Wert wurde ueberschrieben\n")); else ::_tprintf (_T ("Fehler - Wert konnte nicht ueberschrieben werden\n")); } } // /////////////////////////////////////////////////////////////////////////// // Durchsucht Arbeitsspeicher nach gesuchtem Wert u. speichert alle Adressen mit diesem Wert void scan_memory (::HANDLE process, ::DWORD start, ::DWORD end, unsigned int value, std::vector<::DWORD>& adresses) { for (::DWORD i = start; i < end; ++ i) { unsigned int read_buffer = 0; // Wert auslesen ::ReadProcessMemory (process, reinterpret_cast<void*>(i), &read_buffer, sizeof (unsigned int), 0); // Wert stimmt mit gesuchten Wert berein if (read_buffer == value) { ::_tprintf (_T ("Wert (%d) an der Stelle 0x%x gefunden\n"), value, i); adresses.push_back (i); } } } // /////////////////////////////////////////////////////////////////////////// // Durchsucht die gespeicherten Adressen void rescan_memory (::HANDLE process, std::vector<::DWORD>& adresses) { if (adresses.size () > 0) { unsigned int value = 0; ::_tprintf (_T ("Nach welchem Wert soll gescannt werden: ")); ::_tscanf (_T ("%d"), &value); ::_tprintf (_T ("starte Scanvorgang nach %d\n"), value); // temporäres Array, indas die neuen Adressen kopiert werden std::vector<::DWORD> temp; std::vector<::DWORD>::iterator i = adresses.begin(); for (i; i != adresses.end (); ++ i) { unsigned int read_buffer = 0; // Wert auslesen ::ReadProcessMemory (process, reinterpret_cast<void*>(*i), &read_buffer, sizeof (unsigned int), 0); // Wenn gesuchter Wert vorhanden, Adresse speichern if (read_buffer == value) { ::_tprintf (_T ("Wert (%d) an der Stelle 0x%x gefunden\n"), value, *i); temp.push_back (*i); } } // Altes Array löschen adresses.clear (); // Altes Array durch neues ersetzen adresses = temp; ::_tprintf (_T ("%d Uebereinstimmungen gefunden\n"), adresses.size()); } else { ::_tprintf (_T ("Keine Werte vorhanden\n")); } }
#push
#push