Hallo zusammen,
Ich bin neu hier und beschäftige mich das erste mal mit dem verändern von Executables.
Bisher habe ich MySQL injections und allgemein sicherheitslücken im web-bereich erforscht.
Nun habe ich auf vielen verschiedenen Seiten auch entsprechend viele verschiedene Arten gefunden, wie man code in eine vorhandene PE-EXE einschleusen kann.
Ich habe vor alle nacheinander einmal durchzuprobieren.
Hier würde ich gerne mal zusammentragen, welche Varianten es so gibt, um mir eine vollständige übersicht zu verschaffen.
Was ich bisher gefunden habe:
- Eine EXE öffnen und den Code in eine vorhandene Section oder eine neue Section einfügen. Problem: Der eigene Code kann nur die Funktionen verwenden, die schon vorhanden sind.
- Den Code per RemoteThread in Form einer DLL in einen laufenden Prozess laden.
Problem: Prozess-Start schon vorbei.
- Den Code ebenfals in Form einer DLL injezieren. Dazu den Prozess starten, kurz anhalten, die eigene DLL reinladen und den Prozess weiter laufen lassen.
- Per Windows Hook den eigenen Code global im ganzen System verbreiten.
Problem: Extreme Verlangsamung des infizierten Systems.
- Die Exe eines nicht laufenden Prozesses in den speicher Mappen und die eigene DLL in die Import-Tabelle einfügen.
Problem: Meistens kein Platz dafür da?
Und genau hier (zur letzten Variante) setzt auch eine Frage an die mich gerade beschäftigt:
Ich schreibe gerade ein Programm, welches eine PE öffnet und meine DLL in die Import-Tabelle einfügen soll. Allerdings habe ich die PE nicht in den Speicher gemappt, sondern per fopen_s geöffnet. Dazu muss ich halt ein wenig rumrechnen, um von den RVAs auf die RawData-Adressen zu kommen. Gibt es ein Argument wieso ich doch besser die PE mappen sollte? Und was genau ist damit gemeint, dass es meist keinen Platz in der Import-Tabelle gibt? Ist ein einfügen dann unmöglich oder nur erschwert? Denn im Moment sieht es bei mir so aus, dass ich ganz am ende der .rdata Section in der sich bei meinem Beispiel die Tabelle befindet noch einiges an Platz habe. Dort habe ich zuerst mal einen eintrag mit meinem DLL namen dazugemacht.
Zwischen den Import-Discriptoren und dem folgenden Code gibt es jedoch keine lücke mehr, um einen weiteren Discriptor für meine DLL hinzuzufügen. Ist dies immer so oder nur manchmal? Kann ich in diesem Fall den folgenden Code runter schieben, solange in rdata noch platz ist, die RVAs der DLL-Namen und Function-Namen anpassen und dann meine DLL einfügen? Reicht dies an Änderungen, um meine DLL zum laufen zu bringen? Also der Discriptor + RVA des Namens?
Ich hoffe dies sind nicht zuviele Fragen auf einmal.
Anderswo habe ich leider keine genaueren Informationen zu dieser Injection Variante finden können.
Gruß,
Ben90
Ich bin neu hier und beschäftige mich das erste mal mit dem verändern von Executables.
Bisher habe ich MySQL injections und allgemein sicherheitslücken im web-bereich erforscht.
Nun habe ich auf vielen verschiedenen Seiten auch entsprechend viele verschiedene Arten gefunden, wie man code in eine vorhandene PE-EXE einschleusen kann.
Ich habe vor alle nacheinander einmal durchzuprobieren.
Hier würde ich gerne mal zusammentragen, welche Varianten es so gibt, um mir eine vollständige übersicht zu verschaffen.
Was ich bisher gefunden habe:
- Eine EXE öffnen und den Code in eine vorhandene Section oder eine neue Section einfügen. Problem: Der eigene Code kann nur die Funktionen verwenden, die schon vorhanden sind.
- Den Code per RemoteThread in Form einer DLL in einen laufenden Prozess laden.
Problem: Prozess-Start schon vorbei.
- Den Code ebenfals in Form einer DLL injezieren. Dazu den Prozess starten, kurz anhalten, die eigene DLL reinladen und den Prozess weiter laufen lassen.
- Per Windows Hook den eigenen Code global im ganzen System verbreiten.
Problem: Extreme Verlangsamung des infizierten Systems.
- Die Exe eines nicht laufenden Prozesses in den speicher Mappen und die eigene DLL in die Import-Tabelle einfügen.
Problem: Meistens kein Platz dafür da?
Und genau hier (zur letzten Variante) setzt auch eine Frage an die mich gerade beschäftigt:
Ich schreibe gerade ein Programm, welches eine PE öffnet und meine DLL in die Import-Tabelle einfügen soll. Allerdings habe ich die PE nicht in den Speicher gemappt, sondern per fopen_s geöffnet. Dazu muss ich halt ein wenig rumrechnen, um von den RVAs auf die RawData-Adressen zu kommen. Gibt es ein Argument wieso ich doch besser die PE mappen sollte? Und was genau ist damit gemeint, dass es meist keinen Platz in der Import-Tabelle gibt? Ist ein einfügen dann unmöglich oder nur erschwert? Denn im Moment sieht es bei mir so aus, dass ich ganz am ende der .rdata Section in der sich bei meinem Beispiel die Tabelle befindet noch einiges an Platz habe. Dort habe ich zuerst mal einen eintrag mit meinem DLL namen dazugemacht.
Zwischen den Import-Discriptoren und dem folgenden Code gibt es jedoch keine lücke mehr, um einen weiteren Discriptor für meine DLL hinzuzufügen. Ist dies immer so oder nur manchmal? Kann ich in diesem Fall den folgenden Code runter schieben, solange in rdata noch platz ist, die RVAs der DLL-Namen und Function-Namen anpassen und dann meine DLL einfügen? Reicht dies an Änderungen, um meine DLL zum laufen zu bringen? Also der Discriptor + RVA des Namens?
Ich hoffe dies sind nicht zuviele Fragen auf einmal.
Anderswo habe ich leider keine genaueren Informationen zu dieser Injection Variante finden können.
Gruß,
Ben90