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]
    

Anmelden zum Antworten