IAT verschlüsseln

Hallo

Ich möchte bei einem meiner Programme die IAT verschlüsseln und zur Laufzeit wieder entschlüsseln. Wie ich im Prinzip die IAT verschlüssel ist mir klar. Mir stellt sich jedoch die Frage - "Wie entschlüssle ich diese zur Laufzeit wieder ?"

Bisher hatte ich mir folgende Gedanken dazu gemacht.
Der Windows PE-Loader schreibt ja beim Laden der PE die Adressen der Imports in die IAT. Wenn ich nun die IAT aber encrypted habe und erst wieder decrypten muss, kann der PE-Loader ja seine Arbeit nicht verrichten (Was macht der Loader eigentlich, wenn die IAT nicht lesbar ist ?). Das hieße, dass ich die Adressen der Imports manuell erstellen muss (GetProcAddress, GetModuleHandle).
Dieser Ansatz stellt mich jedoch vor das Problem, dass ich nicht weiß wie ich an die Adresse von GetProcAddress / GetModuleHandle komme, wenn die IAT encrypted ist.

Eine mögliche Lösung, die mir eingefallen ist, wäre es eine eigene Version von GetProcAddress / GetModuleHandle zu schreiben.
Das war dann jedoch der Punkt an dem meine Recherchen scheiterten.

Wär super, wenn jemand von euch hierbei weiter weiß :)


MrSpider
 
Hi,

also um GetModuleHandle zu emulieren brauchst du "nur" einen Pointer auf den PEB (Process Environment Block [1]) (fs:[0x30])
Dort gibt es dann ein Feld Ldr (Typ PEB_LDR_DATA [2])
Hier hast du dann die Möglichkeit die Module in 3 verschiedenen Varianten zu traversieren (für welche du dich entscheidest ist egal):
Load Order
Memory Order
Initialization Order

Das ganze kann man dann wieder als LDR_DATA_TABLE_ENTRY casten und schon hat man DllNamen und Base.
Mehr braucht man für GetModuleHandle ja nicht ;)

GetProcAddress ist dann schon ein wesentliches Stück einfacher.
Die Base-Address einfach ein paar mal casten und ein bisschen mit Offsets jonglieren (hierzu sollte es genug Infos im Internet geben [3])
Im Endeffekt einfach den EAT des Modules traversieren indem sich die Funktion befindet.

[1] PEB Structure (Windows)
[2] PEB_LDR_DATA Structure (Windows)
[3] Iczelion's PE Tutorial 7: Export Table

Was dabei zu beachten ist(!) steht schon auf der MSDN-Seite:
[This structure may be altered in future versions of Windows.]


MfG
Inliferty
 
Ein weiterer Ansatz ist nur LoadLibrary und GetProcAddress als reguläre und einzige Imports zu halten. Sobald dein Programm dann ausgeführt wird, kann es diese Funktionen nutzen um alle benötigten Adressen zu sammeln und die von Windows erstellte IAT mit einer neuen (vollständigen) zu überschreiben.
 
Naja abgesehn dafür braucht das Programm ein paar APIs zum initialisieren.
Also den ganzen IAT encrypten geht nicht (außer du schreibst einen ASM-Stub der die nötigen APIs sucht und dann die Adressen fixed).

Weiters sollte man nicht versuchen im echten IAT verschlüsselt Daten abzulegen. Wenn der PE-Loader von Windows versucht die Daten zu interpretieren wird er wahrscheinlich keinen passenden Export finden.
-> PE-Loader wirft einen Error-Code zurück und das Programm startet nicht.

MfG
Inliferty

@ xrayn:
Nur LoadLibrary und GetProcAddress zu importieren ist für mich wie, wenn man schreit "Hey du musst genau HIER suchen!"
 
Es gibt keine Möglichkeit eine vorhandene IAT zu verschlüsseln und diese dann zur Laufzeit wieder zu entschlüsseln, da man keine Möglichkeit hat vor dem PE-Loader Code auszuführen - es sei denn man hat ein Exploit gegen den Loader. Man geht so vor, dass man benötigten Imports sichert, diese von mir aus verschlüsselt und dann sofort nachdem der Loader (der entweder keine, oder nur eine IAT mit LoaderLibrary/GetProcAddress) vorgefunden hat, die Arbeit des Loaders wiederholt und manuell eine valide IAT erstellt.

@ xrayn:
Nur LoadLibrary und GetProcAddress zu importieren ist für mich wie, wenn man schreit "Hey du musst genau HIER suchen!"
Eine Executable, die keine Adressen importieren muss, ist auch nicht viel unauffälliger ;)
 
Danke für eure Antworten :)
Ich werde es jetzt so machen, dass ich keine Funktionen importiere (-> leere IAT) und mir dann manuell alle Adressen zusammensuche (so wie es Inliferty beschrieben hat).
Soweit funktioniert das auch - Eine funktionierende GetModuleHandle Funktion hab ich schon in MASM implentiert :)

Eine Executable, die keine Adressen importieren muss, ist auch nicht viel unauffälliger
Zur Not komm einfach noch ein paar Zufällige Imports mit rein, damit wenigstens irgendwas importiert wird .... ^^

EDIT:
GetModuleHandle und GetProcAddress sind nun so wie es Inliferty beschrieben hat nachprogrammiert - funktioniert einwandfrei.
Danke für eure Hilfe :)
 
Zuletzt bearbeitet:
Zurück
Oben