
IDA-Pro-Plugin, das zur Laufzeit aufgelöste Symbole in .NET-Native-Binärdateien importiert, SharedLibrary.dll und ihre PDB parst, um fehlende Importe für die Analyse wiederherzustellen.

.NIET ist ein IDA-Pro-Plugin. Sein Zweck ist es, fehlende Symbole (normalerweise einige tausend) zu importieren, die zur Laufzeit von mit .NET Native kompilierten Binärdateien aufgelöst werden. Diese Symbole liegen in SharedLibrary.dll und werden von dieser nicht exportiert.
.NIET wurde auf IDA Pro 7.5 mit Python 3.8 auf den folgenden Plattformen getestet:
Dieses Plugin unterstützt derzeit die folgenden .NET-Native-Framework-Versionen:
Bitte erstelle ein Issue, wenn du auf eine andere Version stößt.
Kopiere diese Elemente in dein IDA-Pro-Plugin-Verzeichnis:
dotNIET_plugin.py
dotNIET\
.NIET verwendet pefile, um Ressourcenverzeichnisse zu parsen.
pefile kann wie folgt installiert werden:
pip install pefile
Da Symbole aus SharedLibrary.dll importiert werden, muss diese .NIET zusammen mit ihrer pdb zur Verfügung gestellt werden (deren Speicherort wird vom Plugin innerhalb von _NT_SYMBOL_PATH gesucht).
Es sind Hilfsfunktionen implementiert, um .NET-Native-Framework-Versionen zu identifizieren und zu überprüfen, ob die pdb der SharedLibrary.dll im konfigurierten Symbolpfad vorhanden ist.

.NIET kann über die Tastenkombination Alt-Shift-N oder über das Menü Edit/Plugins gestartet werden.
Beim Start versucht das Plugin, die aktuelle .NET-Native-Framework-Version der Binärdatei zu identifizieren. Alles, was du tun musst, ist, SharedLibrary.dll in der richtigen Version auszuwählen und dann auf Run zu klicken.
.NIET identifiziert die .NET-Native-Framework-Version der Ziel-DLL und zeigt eine Meldung an, wenn die Versionen nicht übereinstimmen. Normalerweise sind nur die Haupt- und Nebenversionsnummern (Major- und Minor-Version) relevant.
.NIET sucht nach der Tabelle der benutzerdefinierten Importdeskriptoren (custom import descriptors) für .NET Native im Abschnitt .rdata. Dazu liest es an bestimmten Offsets einer Custom Header-Struktur und parst anschließend ein Ordinalarray.
Dieses Ordinalarray zeigt auf verschiedene Stellen in den benutzerdefinierten Tabelleneinträgen einer SharedLibrary.dll.
Die Symbolauflösung wird erreicht, indem eine IDA-Pro-Headless-Instanz über ihre Binärdatei idat gestartet wird, um die pdb der SharedLibrary.dll zu parsen.
Symbole werden nach Möglichkeit unverändert importiert, aber einige Sonderfälle können auftreten:
jmpstubs-Symbole auf Offsets oder einzelne jmp-Anweisungen auf Symbole. Deren Symbolname wird von .NIET durch den Namen der Zielfunktion mit vorangestelltem jmp_ ersetzt.deref_X wird an diesen Symbolnamen angehängt, sofern eines gefunden wird, wobei X die Anzahl der Dereferenzierungen ist.EETableSection-Tabelle. Da ich neu bei .NET Native bin, habe ich (noch?) keine Ahnung, was das ist. Daher werden diese Adressen als EETableSection_XXX bezeichnet, wobei XXX Offsets von EETableSection innerhalb von SharedLibrary.dll sind.pdb recht großer Binärdateien erfordertSharedLibrary.dll, obwohl die ursprüngliche Routine, die für die Symbolauflösung zuständig ist, vermutlich die Möglichkeit bietet, andere Module zu parsen (ich weiß nicht, ob dies außerhalb des Moduls SharedLibrary.dll tatsächlich vorkommt).Das Logfile von idat ist unter %tmpdir%/dotNIETlogs.txt definiert.
Weil das Reversen von .NET Native ein Albtraum ist.