2010-03-23 5 views
6

Ich verwende Detours, um die Nachrichtenfunktion einer ausführbaren Datei einzubinden, aber ich muss meinen eigenen Code ausführen und dann den ursprünglichen Code aufrufen. Nach dem, was ich in den Detours-Dokumenten gesehen habe, klingt es definitiv so, als würde das automatisch passieren. Die ursprüngliche Funktion druckt eine Nachricht auf den Bildschirm, aber sobald ich einen Umweg anhänge, beginnt sie, meinen Code auszuführen und hört auf zu drucken.Sie müssen die ursprüngliche Funktion von der Umleitungsfunktion aufrufen

Der ursprüngliche Code Funktion ist in etwa:

void CGuiObject::AppendMsgToBuffer(classA, unsigned long, unsigned long, int, classB); 

Meine Funktion ist:

void CGuiObject_AppendMsgToBuffer([same params, with names]); 

Ich kenne die Speicherposition die ursprüngliche Funktion in residiert, so verwenden:

DWORD OrigPos = 0x0040592C; 
DetourAttach((void*)OrigPos, CGuiObject_AppendMsgToBuffer); 

bringt mich in die Funktion. Dieser Code funktioniert fast perfekt: Meine Funktion wird mit den richtigen Parametern aufgerufen. Die Ausführung verlässt jedoch meine Funktion und der ursprüngliche Code wird nicht aufgerufen. Ich habe versucht, jmping zurück in, aber das stürzt das Programm ab (ich nehme an, der Code Detours verschoben, um den Haken passen ist verantwortlich für den Absturz).

Edit: Ich habe es geschafft, das erste Problem zu beheben, ohne zur Programmausführung zurückzukehren. Indem ich den OrigPos-Wert als Funktion anrufe, kann ich zur "Trampolin" -Funktion und von dort zum ursprünglichen Code gehen. Irgendwo entlang der Zeilen ändern sich jedoch die Register und das führt dazu, dass das Programm mit einem Segfault abstürzt, sobald ich wieder in den ursprünglichen Code zurückkomme.

Edit2: Abschlussarbeitscode:

class CGuiObject 
{ 
public: 
    void MyFunc([params]); 
}; 

DWORD TrueAddr = 0x0040592C; 

CGuiObject::MyFunc([params]) 
{ 
    _asm { pushad } 
    // process 
    _asm { 
     popad 
     leave 
     jmp TrueAddr 
    } 
} 

und mit TrueAddr zum ersten param in DetourAttach.

+0

Können Sie dies in einem Disassembler durchlaufen? –

+0

Ja, ich habe debug eingebaut und am Anfang meiner Funktion einen Haltepunkt gesetzt. Code-Treffer, die, ich pushad, Logging (senden Sie die Nachricht an einen fstream mit dem Operator <<), popad und jmp an die Adresse Umleitungen zurückgegeben. Die Ausführung geht durch das kopierte Zeug und zurück in die ursprüngliche ausführbare Datei. Es läuft für ein paar Zeilen, aber soweit ich sehen kann, wird ECX auf 0 zurückgesetzt und wird als Zeiger verwendet, daher der segfault. Wenn das nicht hilft, kann ich den kompletten Code mit asm posten. – ssube

Antwort

1

Vorausgesetzt, dass Sie versuchen, einen C++ - Methodenaufruf abzufangen, haben Sie wahrscheinlich ein Aufrufkonventionsproblem, wenn Sie die ursprüngliche Funktion aufrufen.

Ich habe nicht versucht, dies persönlich mit Umleitungen zu tun, aber dieser Beitrag verweist auf etwas, das Ihnen helfen könnte. C++ — Detours (Win32 API Hijacking) — Hijack Class Methods Siehe den Link in der zweiten Antwort.

+0

Dies funktionierte rund herum. Am Ende habe ich eine Skelettklasse erstellt, die perfekt funktioniert. Es kann sich sogar selbst dazu aufrufen, Nachrichten in die Warteschlange einzufügen oder die letzten Teile zu überspringen, um eine Nachricht zu verhindern. Danke für den Link! :) – ssube

Verwandte Themen