Detouring und Funktionspointer

  • Ich lauerte aus Langeweile mal wieder auf gamedeception.net und las mir die ganzen neuen Threads durch und irgendwann kam mir der Gedanke “Hey, warum nicht selber mal von Grund auf einen Hook schreiben?!”.
    Also google’te ich stundenlang, wie man detour’t, und fing am nächsten Tag auf Arbeit an, zu programmieren (ja, ich schäme mich auch, dass ich das während meiner Arbeitszeit gemacht hab - hatte aber keinen Einfluss auf meine Leistung, da mein Sprint für die Woche bereits erledigt war :p).


    Ein paar Grundinformationen zu meinem Projekt:
    Ziel ist es, eine DLL zu schreiben, welche in sich Funktionsprototypen enthält, die korrespondierende Funktionen in der zu hackenden Software umleiten soll (Detour). Das heißt, anstatt, dass die Software ihre Funktion ausführt, springt sie vorher in meine eigene Funktion aus der DLL, womit ich dann in der Software tun und lassen kann, was ich will :grinning_squinting_face:


    Man beginnt also mit einem neuen Projekt im Visual Studio (vorzugsweise eine neuere Version), wählt unter “C++” ein Win32 Projekt aus, und hakt im folgenden Fenster DLL und “leeres Projekt” an. Damit hat man eine solide Grundlage.


    Da wir uns nun diesen ganzen autogenerierten Code geschenkt haben, müssen wir selber ein wenig programmieren.
    Ich gehe hier übrigens davon aus, dass Grundkenntnisse im Programmieren vorhanden sind. Werde Offensichtliches nicht erklären:

    Code
    #include <Windows.h>#include <stdio.h>BOOL WINAPI DllMain(HINSTANCE hDLL, DWORD dwReason, LPVOID lpReserved) {	switch(dwReason) {		case DLL_PROCESS_ATTACH:			// hier können wir dann was Schönes machen, wenn die DLL			// an den Prozess gehängt wurde			char strText[50];			sprintf(strText, "Ich bin nun in einem Prozess unter 0x%x geladen :3", hDLL);			MessageBoxA(NULL, strText, "Pups!", NULL);			break;		case DLL_PROCESS_DETACH:			// hier ist die Ausgangstür - nicht vergessen, aufzuräumen ;3			break;	}	return TRUE;}


    Yay! Somit gibt unsere DLL schon mal eine schöne Messagebox aus, wenn sie an einen Prozess gehängt wird! :3
    Zum Anhängen braucht ihr ein DLL-Injection-Programm - am reibungslosesten ging das bei mir bisher immer mit WinJect-1.7-2009-05-02.rar


    Das alles hat natürlich schon den eigentlichen Prozess abgeändert, aber wir wollen ja mehr machen!




    Um nun überhaupt weiterarbeiten zu können, müssen wir uns eine Grundlage zum Detouren holen … dafür könnten wir uns eine eigene Funktion schreiben, die Bytes herumkopiert, oder wir laden einfach von Microsoft höchstpersönlich “Detours Express 3.0”. Selbiges einfach installieren. Dann öffnen wir die “Visual Studio Eingabeaufforderung” und navigieren in den Installationsordner von Detours Express 3.0, wo wir dann einfach lässig “nmake all” ausführen. Somit wird Detours für uns kompiliert und wir können das dann in unser Projekt einbinden.
    Das geschieht, indem man mit der rechten Maustaste im Visual Studio auf sein Projekt klickt und da auf Eigenschaften. In dem Fenster dann auf “VC++-Verzeichnisse”, wo man bei Includeverzeichnisse den Includeordner von Detours angibt und bei Bibliotheksverzeichnisse den libX86-Ordner. (Achtung am Rande: euer Projekt muss auch im x86-Modus sein [Default]).


    Nun könnt ihr unter dem Include aus dem ersten Codeschnipsel einfach das hier anhängen:

    Code
    #include <detours.h>#pragma comment(lib, "detours.lib")


    Als nächstes lädt ihr euch ein Reverse Engineering Tool herunter - vorzugsweise IDA Pro Free und installiert selbiges.
    Nun öffnet ihr damit (als Administrator) die EXE, die ihr kompromittieren wollt. Um das beispielhaft zeigen zu können, hab ich ne kleine Testanwendung geschrieben, welche eine Funktion namens “int meineFunktion(int x)” enthält. Das Laden kann je nach Größe der Binaries unterschiedlich dauern. Wenn fertig, dann klickt ihr oben auf den Reiter “Functions”, wo ihr dann alle Funktionen der EXE sehen könnt:



    Mit einem Doppelklick auf die Zielfunktion, springt IDA im Assemblerview auf den entsprechenden Codeteil, wo wir dann praktischerweise gleich sehen, mit welcher Callingconvention diese Funktion aufgerufen wird, was wir beim hooken nämlich brauchen.



    Links sieht man die Startadresse der Funktion liegt bei “0x004011A0”. Da IDA idR “0x00400000” als Basisadresse nimmt, liegt unser Funktionsoffset also bei “0x000011A0” (0x11A0).
    Nun schreiben wir unsere DLL ein wenig um, so dass sie sich dynamisch die Basisadresse des Prozesses holt (könnte ja dynamisch sein) und sich selbst anhand des Funktionsoffsets errechnet, wo unsere Funktion im Speicher liegt:



    Ergebnis:




    Tadaaa~ … wir haben erfolgreich in einem fremden Prozess herumgepfuscht!
    Das lässt sich nun noch prima erweitern - vielleicht für Softwarecracks, Spielehacks oder was auch immer :3
    Vielleicht erzähl ich die Tage noch ein wenig mehr drüber :winking_face:



    Fragen könnt ihr einfach als Antwort stellen … braucht keinen Extrathread dafür :grinning_squinting_face:

    4 Mal editiert, zuletzt von maumau~ ()

  • Mein Exfreund wie ich ihn kenne xD
    Habe keine Ahnung was das ist oder Darstellen soll aber.. Toll gemacht! :face_with_tongue:
    Weißt ja.. Technikmaskottchen und so xD

    You just don't know what you supposed to be?
    You'll figure that out
    The more you know who you are, and what you want, the less you let things upset you!


    Ex-Administratorin von Letsmine (2012-2018)

  • Aha. Okay. Sehr interessant~


    Hmmmmmm. Okay. Ich versteh kein Wort :'D


    Das heißt... kein Wort ist nicht ganz richtig :grinning_squinting_face:
    Ich komme mit dass der Prozess gehooked wird, dann ein Detour gesetzt wird der den Prozessverlauf auf dein Programm weiterleitet. Am Ende wird der normale Prozess fortgeführt.


    Stimmt das soweit ? :smiling_face:

  • Interessant, dass es so "einfach" ist, einen beliebigen Prozess zu hacken. Auf diese Art kann man Subroutinen in Programme einfügen, ohne die Originaldateien anzurühren. O.o
    Frohes Hacken weiterhin! :winking_face:


    PS: Ich habe die Funktionsweise im Groben verstanden. *grins* :grinning_squinting_face:

    Code
    ┌──┐ ┌┐  ┌┐ ┌┐   ┌─┐                         ┌┐
    │┌┐│ ││  └┘┌┘└┐  │┌┘                         ││
    │└┘│ │└─┐┌┐└┐┌┘ ┌┘└┐┌──┐┌─┐┌───┐┌┐┌┐┌───┐┌─┐ ││
    │┌┐│ │┌┐│││ ││  └┐┌┘│┌┐││┌┘│ ─ ││└┘││ ─ ││┌┘ └┘
    │└┘│ │└┘│││ │└┐  ││ │└┘│││ │ ──┤└┐┌┘│ ──┤││  ┌┐
    └──┘ └──┘└┘ └─┘  └┘ └──┘└┘ └───┘ └┘ └───┘└┘  └┘
  • @itsMEE: Japp, stimmt so im Groben!!
    Tobias1595: Ist wirklich cool ... so stehen einem einige Möglichkeiten offen :3


    Hier eine Beispielanwendung von Detouring (die Bilder sind schon etwas älter und waren nur Tests, mittlerweile kann die dll schon VIEL mehr :D)

  • Japp - wenn auch die Funktion zum Raussuchen der vtables der Direct3DDevice anhand einer OP-Code-Signatur nicht von mir ist (sind aber auch nur knapp 15 Zeilen Code), so hab ich doch die restliche Logik dahinter geschrieben!
    Bin ab morgen zwar knapp 2 Wochen in Deutschland, aber werde dann danach ein kleines Tutorial dazu schreiben :smiling_face:


    Aber wie man hier sieht, ist der Grundansatz so ziemlich der gleiche:


  • Thread veraltet und unbenutzt, wird von mir geclosed und ins Archiv verschoben.
    Bei Einspruch: Threadersteller-->PN an mich!


    //closed & //moved

    It's time to say goodbye...


    Rechtschreibung ist mir Latte, hat nichts mit dem Inhalt zu tun sondern nur mit Schickeria...
    Grammatik schenke ich Putin! Der wird sie brauchen beim ausschreiben der Haftbefehle...
    Hater liebe ich in jeder Form! Nur ein Hater zeigt dir das du wirklich gut bist!

  • Wie kommst du dann zu der Annahme, dass ein schädliches Programm geschrieben wird?
    Viele Softwarehersteller nutzen heutzutage DLL-Injection, um sich in andere zu Prozesse zu hängen. Nicht zuletzt xfire (sofern man das heute überhaupt noch kennt) für die OnScreenDisplays.

  • Hallo :smiling_face:
    Da dieser Thread nun einige Zeit alt ist und vermutlich aufgrund der Inaktivität kein Interesse mehr besteht, verschiebe ich das mal ins Archiv :smiling_face:


    Wenn jemand möchte, dass der Thread hier bleibt, einfach bei mir oder auch bei einem anderen FMod wenden :smiling_face:


    LG Diar :smiling_face:

    Zitat von space_rat370

    Die beste Rache ist unglaublicher Erfolg.



    1372888714