Speicher manipulieren
-
Hallo,
ich versuche gerade ein Tutorial nachzuarbeiten, aber bei mir funktioniert es leider nicht. Ich möchte ein 1tes Programm haben, indem eine globale Variable "i" erstellt wird und deren Inhalt 15 sein soll. Anschließend wird im 10 Sekunden Abstand diese Variable sowie ihre Adresse ausgegeben.
In meinem 2ten Programm wird dann auf das 1te zugegriffen und diese Variable umgeschrieben (sodass bei der 2ten Ausgabe der Variable "i" im Programm 1 dann diese Variable verändert wird).Programm 1 heißt opfer.exe:
#include <iostream> #include <windows.h> using namespace std; int i = 15; int main() { cout << i << "\t" << &i << endl; Sleep(10000); cout << i << "\t" << &i << endl; Sleep(10000); return 0; }Und hier das 2te Programm:
#include <iostream> #include <windows.h> #pragma comment(lib,"User32.lib") using namespace std; int main() { HWND hWnd; HANDLE hproc; DWORD procid; DWORD rw = 0; unsigned adress = 0x00488004; int buffer = 0; hWnd = FindWindow(0,"Opfer.exe"); if(!hWnd) { cout << "test1"; Sleep(5000); return 0; } cout << "test"; Sleep(5000); GetWindowThreadProcessId(hWnd, &procid); hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procid); if(ReadProcessMemory(hproc,(LPCVOID)adress,&buffer, sizeof(buffer),&rw)) { cout << "Lesen erfolgreich\n"; cout << buffer; } CloseHandle(hproc); return 0; }In der Variable "adress" wird die Adresse der von der Ausgabe vom Programm "opfer.exe" eingesetzt. Mein Problem ist nun, dass ich nicht einmal ein Handle für "opfer.exe" bekomme, da ich sofort als Ausgabe "test1" erhalte (ich habe diese Ausgaben eingefügt, für Debbuging Zwecke). Aber warum finde ich mein Programm nicht? Ich starte zuerst Opfer.exe und anschließend das 2te Programm. Im Taskmanager steht auch als Task "Opfer.exe". Ich habe es auch ohne Endung, also nur "Opfer" versucht, allerdings auch ohne erfolg. Kann mir jemand helfen?
-
Hast du ein Fenster namens "Opfer.exe" offen? Wohl eher nicht.
Btw, falsches Forum.
-
Eigentlich habe ich schon das Fenster offen....
http://img300.imageshack.us/img300/7895/52631484.jpg
Welches Forum hätte ich den sonst nehmen sollen? Sorry, bin neu hier.
-
GoZu schrieb:
Eigentlich habe ich schon das Fenster offen....
Du hast ein paar Fenster offen, und im Taskmanager siehst du einen Prozess der so heißt. Aber die Fenster heißen nicht so, sondern haben andere Namen.
GoZu schrieb:
Welches Forum hätte ich den sonst nehmen sollen? Sorry, bin neu hier.
Wenn man neu in einem Forum ist, sollte man sich zuerst die als wichtig markierten Threads durchlesen. Wenn du das getan hättest, wüsstest du auch in welches Forum deine Frage gehört.
-
Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Du solltest i volatile deklarieren sonst wird das wahrscheinlich nichts.
Du kannst tools wie PantsOff benutzen um den Titel des Fensters zu bekommen oder du benutzt EnumWindows um durch alle Fensterhandle zu gehen, dann die ProzessID da rauskriegen und dann mit der ProzessID von Opfer.exe vergleichen bis du den richtigen Handle hast. Du kannst dir die entsprechenden Funktionen bei MSDN zusammen suchen.
-
Aus meiner Lib, viel Spaß beim Kopieren:
ProcessId Process::getProcessByProcessName(const std::wstring& processName) { //Convert given name to lowercase std::wstring processName_lowerCase = processName; std::transform(processName_lowerCase.begin(), processName_lowerCase.end(), processName_lowerCase.begin(), towlower); //Get a snapshot of all processes SafeHandle procSnapshot(CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)); if(procSnapshot == INVALID_HANDLE_VALUE) throw std::runtime_error("Process::getProcessByProcessName Error : CreateToolhelp32Snapshot() failed"); //Iterate the complete process-list PROCESSENTRY32 procEntry = { sizeof(procEntry) }; for(int moreProcessEntries = Process32FirstW(procSnapshot, &procEntry); moreProcessEntries; moreProcessEntries = Process32NextW(procSnapshot, &procEntry)) { //Convert current name to lowercase std::wstring currentProcess(procEntry.szExeFile); std::transform(currentProcess.begin(), currentProcess.end(), currentProcess.begin(), tolower); if(currentProcess == processName_lowerCase) return procEntry.th32ProcessID; } //The loop was left, so nothing was found throw std::runtime_error("Process::getProcessByProcessName Error : No process could be found"); }*Ich glaube ich sollte die Lib mal veröffentlichen, dann muss ich nicht immer kreuz-und-quer auf verschiedenen Foren Schnippsel posten*
-
pass auf, habe dazu eben mal nen kleines testapp geschrieben...
opfer prog
#include <iostream> #include <conio.h> int main() { int iReadMe = 5; printf("Address of iReadMe: %x", &iReadMe); getch(); }read prog
#include <windows.h> #include <conio.h> #include <iostream> #include <TlHelp32.h> #define OpferExeName "rpm_testapp_opfer.exe" DWORD GetPid(char *ProcessName) { PROCESSENTRY32 p32; HANDLE hSnap; bool isSuccess; if (!(hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0))) return 0; if (!(isSuccess = Process32First(hSnap, &p32))) return 0; while(true) { if (!(isSuccess = Process32Next(hSnap, &p32)) || GetLastError() == ERROR_NO_MORE_FILES) return 0; if (strstr(p32.szExeFile, ProcessName)) return p32.th32ProcessID; Sleep(5); } } int main() { DWORD dwPid = 0; HANDLE hProcess; DWORD lpBaseAddress; printf("waiting for %s...", OpferExeName); while(!dwPid) { printf("%c", '.'); dwPid = GetPid(OpferExeName); Sleep(5); } hProcess = OpenProcess(PROCESS_VM_READ, false, dwPid); if(!hProcess) printf("can't open Process!\n"); else { printf("Process found!\nBitte Addresse von iReadMe eingeben: "); scanf("%x", &lpBaseAddress); int buffer; ReadProcessMemory(hProcess, (void*)lpBaseAddress, &buffer, sizeof(buffer), 0); printf("Value of iReadMe: %i", buffer); } Closehandle(hProcess); getch(); }ist vielleicht nicht das ordentlichste, aber es funktioniert.

lg
-
Hallo,
versuch doch einfach mal den Namen deiner Konsolenanwendung (Opfer.exe) zu ändern, mit SetConsoleTitle( "Blubber" ). Dann such nach dem Fensternamen "Blubber" in deiner zweiten App.
Lg Tobi
-
ist vielleicht nicht das ordentlichste
Mach doch bitte die Handles wieder zu, das vergessen 50% aller WinAPI-Programmierer und dann gibts überall kommerzielle Apps, die Handles leaken bis zum ersticken

-
Icematix schrieb:
ist vielleicht nicht das ordentlichste
Mach doch bitte die Handles wieder zu, das vergessen 50% aller WinAPI-Programmierer und dann gibts überall kommerzielle Apps, die Handles leaken bis zum ersticken

verdammt, das habe ich vergessen. - dank dir!!