C++ detours unter 64bit

  • Ersteller Ersteller Tigerass 2.0
  • Erstellt am Erstellt am
T

Tigerass 2.0

Gast
Hallo,

Ich beschäftige mich zurzeit näher mit detours. Unter 32 bit kein Problem,
jedoch habe ich jetzt eine 64bit Anwendung, bei welcher meine Methode nicht mehr funktioniert. Hoffe ihr könnt mir ein paar Tipps geben,
vll. kennt sich da ja jemand von euch aus.

Hier meine x86 Version:
Code:
void DetourFunc32(BYTE *ursprung, const BYTE *ziel)
{
	BYTE b[] = {0xE9, 0x90, 0x90, 0x90, 0x90};//JMP | Adresse
	BYTE *jmp = (BYTE*)malloc(5+sizeof(b));

	DWORD dwback;
	VirtualProtect(ursprung, sizeof(b), PAGE_READWRITE, &dwback);
		
		memcpy(jmp, ursprung, sizeof(b));			
		jmp += sizeof(b);									

		*(DWORD*)(b+1) = (DWORD)(ursprung+5 - jmp) - sizeof(b);
		memcpy(jmp, b, sizeof(b));

		*(DWORD*)(b+1) = (DWORD)(ziel - ursprung) - sizeof(b);
		memcpy(ursprung, b, sizeof(b));

	VirtualProtect(ursprung, sizeof(b), dwback, &dwback);
}

Beispiel zur Anwendung:
Code:
void func(void)
{
	MessageBoxA(NULL, "test", "test", MB_OK);
}
int __stdcall _MessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
	return MessageBoxW(NULL, L"detour", L"detour", MB_OK); //MessageBoxW damit kein Overflow
}

int main(int argc, char* argv[])
{
    func();
    DetourFunc32((BYTE*)GetProcAddress(LoadLibrary("USER32.DLL"),"MessageBoxA"), (BYTE*)_MessageBoxA);
    func();
    system("pause");
    return 0;
}

LG Tigerass
 
Ohne deinen Code, dort genauer angesehen zu haben:

Du verwendest für deinen Sprung, in einem 64 Bit System einen 32 Bit Pointer. Ich denke, da es selbst geschrieben hast, wird der Rest der Lösung sicher nahe liegen.
 
Mein eigentliches Problem liegt darin dass ich mich zu wenig mit Assembler auskenne,
und nicht weiß ob es soeinen jmp geben kann:
Code:
0xE9, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90
Ich habe gelesen man sollte stattdessen einen statischen nehmen, also in etwa so:
Code:
0x48, 0xB8, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0xFF, 0xE0
mov RAX | x64 Adresse | jmp RAX

LG Tigerass
 
Zurück
Oben