Thread in Prozess schreiben
-
Hallo,
habe mal wieder ein spezielles Problem :
Versuche eine Funktion aus einem anderen Prozess ohne DLL injection aufzurufen:
unsigned char func_bytes[26] { 0x55, 0x8B, 0xEC, 0xFF, 0x35, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x6A, 0x00, 0xFF, 0x15, 0x40, 0x95, 0x60, 0x00, 0x83, 0xC4, 0x0C, 0x8B, 0xE5, 0x5D, 0xC3 }; void init(HANDLE process_handle) { string cmd = "cg_fov 90"; //ein command an das spiel DWORD cmd_addr; DWORD func_addr; cmd_addr = (DWORD)VirtualAllocEx(process_handle, NULL, sizeof(cmd) , MEM_COMMIT, PAGE_EXECUTE_READWRITE); WriteProcessMemory(process_handle, (LPVOID) cmd_addr, &cmd, sizeof(cmd), NULL); func_addr = (DWORD)VirtualAllocEx(process_handle, NULL, sizeof(func_bytes), MEM_COMMIT, PAGE_EXECUTE_READWRITE); //set correct address of str func_bytes[5] = ((cmd_addr & 0x000000FF))+0x04; //aus irgendeinem grund sind manchmal 4 oder 3 bytes vor meinem string,... func_bytes[6] = (cmd_addr & 0x0000FF00) >> 8; func_bytes[7] = (cmd_addr & 0x00ff0000) >> 16; func_bytes[8] = (cmd_addr & 0xff000000) >> 24; WriteProcessMemory(process_handle, (LPVOID)func_addr, func_bytes, sizeof(func_bytes), NULL); CreateRemoteThread(process_handle, 0, 0, (LPTHREAD_START_ROUTINE)func_addr, 0, 0, 0); } int main() { HANDLE mw2_handle; mw2_handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, FindProcessId(L"iw4m.exe")); //iw4mp in steam if (mw2_handle == INVALID_HANDLE_VALUE || mw2_handle == 0x00000000) { cout << "ERROR : Can't open MW2 HANDLE\n" << "GetLastError = " << GetLastError(); _getch(); return 1; } init(mw2_handle); _getch(); return 0; }
Also : Zuerst mache ich platz für meinen string im anderen prozess, dann schreibe ich dort den string herein! Aus irgendeinem grund stehen an der adresse cmd_addr noch 3-4 Bytes vor dem eigentlichen string. Könnte diese ja einfach überspringen aber es ist ja oft eine unterschiedliche menge. Woran könnte das liegen ?
Als nächstes mache ich platz für den thread. Dann packe ich die richtige addresse des strings in den func_bytes array (an die PUSH stelle da die addresse des strings als paramter an eine funktion geht) Dann werden die Bytes geschrieben und meine bytes werden als thread im prozess aufgerufen!
Das Problem ist das ich immer sofort eine Access Violation bekomme wenn der Thread losgeht, was mache ich falsch ?
55 push ebp 8B EC mov ebp,esp FF 35 00 00 00 00 push dword ptr ds:[00000000Ch] 6A 00 push 0 6A 00 push 0 FF 15 40 95 60 00 call dword ptr ds:[0609540Ch] 83 C4 0C add esp,0Ch 8B E5 mov esp,ebp 5D pop ebp C3 ret
Das ist der assembler code von meinem thread (also an der adresse func_addr)
Die Funktion die ich aufrufen will sieht ungefähr so aus :
void __cdecl execute_command (int p1, int p2, char *cmd) (0x609540C)
p1 und p2 sollen 0 sein und cmd mein command!
-
Ceno schrieb:
Aus irgendeinem grund stehen an der adresse cmd_addr noch 3-4 Bytes vor dem eigentlichen string. Könnte diese ja einfach überspringen aber es ist ja oft eine unterschiedliche menge. Woran könnte das liegen ?
std::string ist eine Klasse. Keine Ahnung was, aber irgendwas steht da davor. Nimm "string.c_str()" damit bekommst du den Pointer auf den eigentlichen string.
Ceno schrieb:
Das Problem ist das ich immer sofort eine Access Violation bekomme wenn der Thread losgeht, was mache ich falsch ?
Du hast keinen Breakpoint gesetzt.
Ceno schrieb:
FF 15 40 95 60 00 call dword ptr ds:[0609540Ch]
Wie kommst du darauf ? Meiner Meinung nach ist das Blödsinn.
Deine Bytes im Disassembler ergeben bei mir:02AD000E FF15 40956000 CALL DWORD PTR DS:[609540]
Und das ist nunmal die falsche Addresse. Ich würde es so machen:
02AD004D FF15 0C540906 CALL DWORD PTR DS:[609540C]