6 Stimmen

API Hooking ohne Umwege

Einführende Informationen: Windows 7 64-Bit. C++. 64-Bit-Anwendungen und DLLs. Hooking ohne MS Umwege.

Frage: Ich habe mit dem Problem gekämpft, ein funktionierendes Beispiel zu finden, das das Hooking in Windows demonstriert. Die meisten Tuts da draußen scheinen zu einer Zeit geschrieben worden zu sein, in der 32-Bit Windows XP das einzige Betriebssystem war... Inzwischen habe ich die 64-Bit-Hürden des Verständnisses überwunden und eine DLL erfolgreich injiziert. Mein nächster Schritt auf dieser Reise des Wissens ist das Hooking. Um der Nostalgie des Themas gerecht zu werden, unterstützt MS's Detours keine 64-Bit (kostenlos) und ich zahle sicherlich keine 10.000 Dollar für irgendetwas. Also verfolgte ich die konventionellen Methoden in diese Anleitung .

Dieses Tutorial ist großartig, aber ich habe ein paar Schwierigkeiten, diesen Abschnitt zu verstehen:

void BeginRedirect(LPVOID newFunction)
{
    BYTE tempJMP[SIZE] = {0xE9, 0x90, 0x90, 0x90, 0x90, 0xC3};
    memcpy(JMP, tempJMP, SIZE);
    DWORD JMPSize = ((DWORD)newFunction - (DWORD)pOrigMBAddress - 5);
    VirtualProtect((LPVOID)pOrigMBAddress, SIZE, 
                PAGE_EXECUTE_READWRITE, &oldProtect);
    memcpy(oldBytes, pOrigMBAddress, SIZE);
    memcpy(&JMP[1], &JMPSize, 4);
    memcpy(pOrigMBAddress, JMP, SIZE);
    VirtualProtect((LPVOID)pOrigMBAddress, SIZE, oldProtect, NULL);
}

Insbesondere kämpfe ich mit dem tempJMP-Byte und all den memcpy gehen auf. Ich habe eine Adresse für die Funktion InsertDate() von Notepad, die ich entführen möchte, aber ich bin nicht sicher, wohin ich sie richten soll... Wäre dies die Adresse der neuen Funktion? Oder ist sie nicht relativ? Ich weiß nicht, ich bin nur auf der Suche nach einigen Hinweisen.

2voto

Julien Punkte 155

Hotpatch-fähige Funktionen beginnen mit dem folgenden Befehl mov edi,edi und werden eingeleitet durch 5 NOP-Anweisungen (Code Cave, wenn ich mich richtig erinnere).

Beim Hotpatching wird das mov edi,edi mit einem kurzen Sprung in die Codehöhle überschrieben. Die Codehöhle wird auch mit einem Sprung zu Ihrem Hook-Handler (die Funktion, mit der Sie den API-Aufruf abfangen und an die eigentliche API-Funktion weiterleiten) neu geschrieben.

1voto

Greko2009 Punkte 433

Die ganze Idee ist, den ursprünglichen Code, der Messagebox ausführt, zu "überschreiben":

JuMP <CustomMessageBoxFunction>
RETurn (back to program execution) 

Also ,

Zuerst kopiert er seinen Shellcode in das JMP-Array:

 memcpy(JMP, tempJMP, SIZE);

Dann kopiert er die Original-Assemblercode-Bytes von der ursprünglichen Adresse in seinen Zwischenspeicher "oldBytes", damit er sie nach Ausführung seiner benutzerdefinierten Funktion zurückkopieren kann:

memcpy(oldBytes, pOrigMBAddress, SIZE);

Dann kopiert er die zuvor berechnete Adressgröße in das JMP-Array direkt nach dem jmp-Befehl:

memcpy(&JMP[1], &JMPSize, 4);

Schließlich enthält sein JMP[]-Array den zum Aufruf seiner Funktion erforderlichen Shellcode, z. B.

JMP 1234
RET

Jetzt muss er das über die ursprünglichen Bytes kopieren, wo das Programm die ursprüngliche MessageBox-Funktion erwartet:

memcpy(pOrigMBAddress, JMP, SIZE);

Nun zu Ihrer Frage, wenn Sie ein Hook InsertDate() dann anstelle von pOrigMBAddress können Sie die Adresse von InsertDate verwenden möchten.

Ich bin mir aber nicht sicher, ob das mit 64bit Windows funktioniert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X