Überschreiben / "Hacken" von Funktionsaufrufen



  • Hallo,

    Gibt es eine Möglichkeit bestimmte Funktionen zu überschreiben?
    Beispiel: Ich weiß die Adresse einer Funktion des Types: int (*name)(void);.
    Ich möchte diese Funktion "manipulieren", so dass bei Aufruf dieser Funktion, eine von mir definierte Funktion selben Types gestartet wird.

    Einfaches Beispiel:

    int test() {
      return 25;
    }
    
    int call_me_instead() {
     return 25;
    }
    
    int main()
    {
      test(); //ruft test auf!!!
    
      //ist mir klar, dass das NICHT so geht.. den folgenden Code-Abschnitt suche ich
      test = call_me_instead;
    
      //
    
      test(); //ruft call_me_instead auf
    
      GetOpenFileName = hack_function_for_get_open_file_name;
      GetOpenFileName(&struct); //ruft MEINE funktion auf..
    }
    

    #defines zum Überschreiben sind NICHT möglich (in meinen Fall). Bitte beachten: Das "Überschreiben" muss mit allen Funktionen funktionieren - also auch mit solchen die bsp. über eine Standard-Bibliothek geladen wurden.

    Gibt es einen solchen weg?
    Wenn ja wie?

    Vielen Dank für jede Hilfe,
    mit freundlichen Grüßen,
    Timo


  • Mod

    Wenn du die Adresse von test() schon kennst, was hindert dich daran, einfach deinen Programmcode an die Stelle zu schreiben? Nichts außer eventueller Speicherschutz*.

    P.S.: Wenn es dir ernst ist, musst du Assembler lernen, C alleine reicht da nicht.

    *: Dies kann aber eventuell eine sehr hohe Hürde sein.



  • Könntest du kurz ein Beispiel geben, wie ich den Funktionscode an die entsprechende Stelle kopieren könnte?

    Vielen Dank schonmal für deine Hilfe,
    Timo



  • Da das ganze unter Standard-C wohl nicht möglich ist, würd ich (unter Linux) das ganze über LD_PRELOAD lösen. Google mal nach libtrash, wenn Du ein Beispiel brauchst.


  • Mod

    Timo.Stark schrieb:

    Könntest du kurz ein Beispiel geben, wie ich den Funktionscode an die entsprechende Stelle kopieren könnte?

    Vielen Dank schonmal für deine Hilfe,
    Timo

    Prinzipiell mit memcpy, solange dein Betriebssystem das zulässt. Wenn dein Computer aber Sicherheitsmechanismen wie das NX-Bit benutzt, dann wird dir das nicht viel nützen und bloß einen Segmentation fault ergeben.

    Hackangriffe sehen daher üblicherweise auch anders aus. Das wohl üblichste Szenario ist dies: Man greift den Stack an (da darf man immer schreiben) und ändert dort Rücksprungadressen auf eigenen Code den man vorher auch auf den Stack des Programms geschrieben hat.



  • Hallo Sepp,

    memcpy war mein erster Versuch ==> Segmentation Faults (Danke für den Hinweis woran das liegt). Die Funktion liegt in meinen eigenen Prozess - ich dachte in diesen Fall würden keine Schutzmaßnahmen seitens Windows greifen.

    Gibt es für den "Angriff" (ist eher nicht als Angriff - sondern zu Debugging-Maßnahmen gedacht) auf den Stack Tutorials im Internet?

    @SG1: Danke für den Hinweis - Leider benötige ich für meine Software eine 100% Kompatibilität zu Windows Betriebssystemen, deshalb kann ich die Library libtrash nicht nutzen.

    Vielen Dank nochmal,
    Timo



  • Timo.Stark schrieb:

    Gibt es für den "Angriff" (ist eher nicht als Angriff - sondern zu Debugging-Maßnahmen gedacht) auf den Stack Tutorials im Internet?

    Der Klassiker nennt sich "Smashing the stack for fun and profit" - aber zum Debugging eher nicht zu gebrauchen.

    @SG1: Danke für den Hinweis - Leider benötige ich für meine Software eine 100% Kompatibilität zu Windows Betriebssystemen, deshalb kann ich die Library libtrash nicht nutzen.

    Für Windows such mal nach "dll injection". Ist IIRC nicht ganz so simpel wie LD_PRELOAD, funktioniert aber prinzipiell genauso.


Anmelden zum Antworten