2010-11-30 2 views
4

Ich fuhr wieder gegen eine Wand und brauche deine Hilfe mit etwas Low-Level-Zeug. Es ist mir bereits gelungen, exportierte DLL-Funktionen (with this code btw.) zu haken, indem ich sie in meinen Zielprozess injizierte (z. B. kann ich einfach MessageBoxW von user32.dll umleiten). Leider ziele ich auf ein anderes Szenario ab: Ich muss eine Funktion umgehen, die in der ausführbaren Datei definiert ist, in die ich meinen Code einfüge. Die Anwendung ist Open-Source, also weiß ich alles über die Funktion, die ich zum Einhängen benötige, aber die Binärdatei ist mit einem Zertifikat signiert, so dass ich meine eigene Version nicht kompilieren kann. Ist es möglich, die Adresse der Funktionen zur Laufzeit abzurufen oder mit einer anderen Technik umzuleiten? Das Ziel ist eine "normale" 32-Bit-Windows-Binärdatei. nichts Besonderes dachte ich;)Wie finde ich eine Adresse, um eine EXE-Datei zu öffnen?

Mit freundlichen Grüßen Nefarius

EDIT: vielleicht aufgrund meines lahm Englisch mir nicht detailliert genug war, so dass hier ein kleines Codebeispiel:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    foo(); 
} 

BOOL foo(char* someData) 
{ 
    return printf("%s", someData); 
} 

Now I möchte die Funktion foo() umgehen, die in einer dynamischen Bibliothek nicht existiert. Das ist mein Problem. Ich weiß nicht wie und ich bin mir nicht sicher, ob das so funktioniert, wie ich denke.

EDIT: Jetzt weiß ich, dass es möglich ist, so dass die wichtige Frage geändert: wie? Wie bekomme ich die Informationen, die ich brauche? die Funktionen Adresse?

+1

Stellen Sie keine [tags] in der Betreffzeile, vor allem, wenn Sie legen sie auch in den Bereich Tags. – abelenky

+0

Ups, danke! – Nefarius

Antwort

0

erwerben ich mein Ziel mit einem paar Low-Level-Windows-API-Funktionen Einhaken, nicht die beste Lösung, aber es funktioniert, Assembler Mine ist nicht ...

+0

Ich fühle mich wie die tatsächliche Antwort, die ich suchte, fehlt. –

1

Sicher, verwenden Sie einfach so etwas wie Ollydbg, um einen Haltepunkt zu setzen, und bearbeiten Sie die Assembly, nachdem die ausführbare Datei geladen wurde (und die Überprüfung des Zertifikats abgeschlossen ist). Um dies dauerhaft zu tun, ist es etwas anspruchsvoller, aber je nachdem, wie ausgefeilt die Zertifikatsprüfung ist, können Sie dieses Bit einfach umgehen, indem Sie es durch eine NOP ersetzen (keine Operation).

EDIT: Wenn Sie 64-Bit-Windows ausführen, haben Sie möglicherweise mehr Glück mit Microsoft eigenen Debugging Tools. Ich habe sie nie benutzt, also habe ich keine Ahnung, wie sie mit Ollydbg vergleichen.

+0

Oh, ich möchte das Zertifikat nicht austricksen, es interessiert mich nicht :-) Ich brauche nur den (int) Rückgabewert einer Funktion, die hart in die Binärdatei selbst kodiert ist. Ich versuchte OllyDbg BTW. aber ich habe Win7 x64 ... * startet VBox mit XP * – Nefarius

+0

@Nefaurius: und was ist die Frage? Warum reparierst du es nicht einfach? – ruslik

+0

@ Ruslik: einfache Antwort: wie? Ich muss zugeben, ich habe keine Erfahrung mit dem Zerlegen/Debuggen/Reverse, also bin ich ziemlich Headless ATM. – Nefarius

1

Wenn dies für etwas ist, das mehr als eine einmalige Debugging-Zeit ist, schauen Sie in Microsoft Detours, eine API für Hooking-Funktionen.

+0

Ich weiß schon, wie man Funktionen anhängt und es funktioniert. Ich weiß einfach nicht, wie man nicht-dynamische Funktionen, die in ausführbaren Dateien definiert sind, haken kann. – Nefarius

+1

@Nefarius: Hooking ist das gleiche. Ihre einzige Herausforderung besteht darin, sie zu finden, da sie sich nicht in einer Exporttabelle befinden. Aber wie du gesagt hast: Du hast alle Informationen. Sie können den Speicherort der Funktion fest codieren oder die .MAP-Datei analysieren. – MSalters

+0

Ok es ist möglich, gut. Meine nächste Herausforderung wird also sein, die Funktionsadresse zu holen. Hast du einen Hinweis für mich (Link zu Beispiel, Tutorial, was auch immer?), Würde mich sehr freuen. Tut mir leid, ich habe keine Ahnung, wie ich das machen soll. – Nefarius

0

Sie müssen die Funktionen Adresse dann ein jmp an der Funktionen Einstiegspunkt zu Ihrer Prozedur einfügen und dann die ursprüngliche proc wiederherstellen und dann zurück auf die ursprüngliche Funktion.

+1

Sehen Sie sich das Patch-Tool hier an. Genau das tut dies: http://comrade.ownz.com/projects/petools.html –

+0

Danke! Sehr interessant, aber ich weiß immer noch nicht, wie ich die Funktion von meinem injizierten Code umleiten kann. Ich kann DLL exportierte Funktionen ohne irgendwelche Probleme haken, aber ich benötige die Adresse der Funktion, weil es keine DLL gibt, zum zu haken ... – Nefarius

0

Verwenden Sie EasyHook dafür. Mit dieser Bibliothek können Sie eine Funktion mit der Adresse abfangen.

+0

Ich kenne EasyHook und was es kann/tut, aber ich * habe nicht die Funktionsadresse *! – Nefarius

+0

Sie können die Adresse der Funktion nicht mit EasyHook abrufen, die Adresse ist die Funktion selbst (wenn sie nicht mit Linker-Optimierungen kompiliert wird). Zu EasyHook sollten Sie & foo als Adresse übergeben. –

Verwandte Themen