5 Stimmen

PE-Format - IAT-Fragen

Ich versuche, einen Exe-Packer für Windows zu schreiben. Bis jetzt habe ich einige Grundlagen erarbeitet. Der Teil, an dem ich stehe, ist jedoch das Lesen des "BOUND IMPORT Directory Table" (oder .idata Abschnitt?), im Grunde genommen der Abschnitt der PE-Datei, der die Liste der DLLs enthält, die der Loader importieren muss.

Ich frage mich, was der beste Weg ist, entweder:

[A] herauszufinden, wo die IAT ist (weil das Ausführen von PEView gegen ein paar verschiedene .exe-Dateien zu zeigen scheint, dass diese Liste an verschiedenen Stellen enthalten sein kann) und dann die Liste zu lesen

ODER

[B] Einen Weg zu finden, um direkt die Liste der DLLs zu lesen, die eine exe importieren muss.

Gibt es einen Weg, dies zu tun? Gibt es weitere Literatur, die Leute empfehlen können, um herauszufinden, wo die IAT sein sollte und wie man sie liest?

6voto

Aaron Klotz Punkte 10727

Ja, du kannst das IAT finden, indem du dich durch die Header der ausführbaren Datei kämpfst. Schau in winnt.h nach den Header-Deklarationen.

Für eine ausgezeichnete Aufschlüsselung darüber, wie man Informationen in den Headern findet, siehe Matt Pietreks Serie in MSDN Magazine, "Ein ausführlicher Blick auf das Win32 Portable Executable-Dateiformat", Teile I und II.

Du kannst auch die tatsächliche Microsoft PE-Spezifikation von hier erhalten.

TL;DR: Grundsätzlich erfolgt die Reihenfolge der Nachschlagen wie folgt:

  1. Beginne mit der Basisadresse der Binärdatei. Das ist eine IMAGE_DOS_HEADER-Struktur.
  2. Folge dem Feld e_lfanew, um zur IMAGE_NT_HEADERS-Struktur zu gelangen.
  3. Folge dem OptionalHeader, um zur IMAGE_OPTIONAL_HEADER-Struktur zu gelangen (trotz des Namens ist es nicht mehr optional).
  4. Folge DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] zu einem Array von IMAGE_IMPORT_DESCRIPTOR-Strukturen. Es gibt einen Eintrag pro importierter DLL. Der letzte Eintrag in diesem Array wird auf Null gesetzt.
  5. Das Name-Feld in jedem Eintrag ist ein RVA, das auf den Namen der DLL verweist. Das FirstThunk-Feld ist ein RVA, das auf das IAT dieser DLL zeigt, das ein Array von IMAGE_THUNK_DATA-Strukturen ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X