So viele verschiedene Arten, Code in eine PE zu schleusen?

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
 
ohh...viele neue links ;-)
google findet halt doch net alles...

is da auch ein link zu meinem letzten problem bei?
rein von den links her klingt das auch mehr nach den ganzen oberen varianten?
 
Ist ein einfügen dann unmöglich oder nur erschwert?
nur erschwert. Am besten:
http://sandsprite.com/CodeStuff/Understanding_imports.html
Eine DLL hinzuzufügen geht immer - eine vorhandene IAT zu erweitern kann dagegen problematisch werden.
Du hast ja praktisch aus der DataDirectory einen Verweis auf ImportDirectory. Diese bestehn nur aus RVA angaben (also wo DLL-String und ImportTables zu finden sind). D.h möchte man noch eine ImportDirectory hinzufügen und es ist kein Platz mehr vorhanden, kann man die existierenden einfach dahinkopieren, wo genug Platz ist und eine ImportDirectory anhängen. Da die ganzen Angaben RVAs sind, braucht man nur in der DataDirectory Verweis auf die neue ImportDirectory Adresse zu ändern.

- 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.
Nicht ganz. "Echte Männer" können mittels PEB Kernel32/NtDLL Exports auch "zu Fuß" lesen :). Also an GetModuleHandle/LoadLibrary/GetProcAddress Funktionen ohne irgendwelche Imports drankommen.

Zusätzlich kann man natürlich diese Funktionen auch zu den Imports hinzufügen.
 
so...dank euren links und tipps bin ich schon wesentlich weiter :D
nu bin ich auf der suche nach dem algo für die checksumme...
gibts zu deren berechnung irgendwo ne funktion?

Gruß,
Ben90
 
Zurück
Oben