
Plugin per IDA Pro che importa i simboli risolti a runtime nei binari .NET Native, analizzando SharedLibrary.dll e il relativo PDB per ripristinare gli import mancanti per l'analisi.

.NIET è un plugin per IDA Pro. Il suo scopo è importare i simboli mancanti (di solito poche migliaia) che vengono risolti a runtime da binari compilati con .NET Native. Questi simboli risiedono in SharedLibrary.dll e non vengono esportati da quest'ultimo.
.NIET è stato testato su IDA Pro 7.5 usando python 3.8 sulle seguenti piattaforme:
Questo plugin supporta attualmente le seguenti versioni del framework .NET Native:
Per favore, apri una issue se incontri un'altra versione.
Copia questi elementi nella directory dei plugin di IDA Pro:
dotNIET_plugin.py
dotNIET\
.NIET si basa su pefile per analizzare le directory delle risorse.
pefile può essere installato come segue:
pip install pefile
Poiché i simboli vengono importati da SharedLibrary.dll, questo deve essere fornito a .NIET insieme al suo pdb (la sua posizione viene cercata dal plugin all'interno di _NT_SYMBOL_PATH).
Sono implementati helper per identificare le versioni del framework .NET Native e per verificare che il pdb di SharedLibrary.dll esista all'interno del percorso dei simboli configurato.
.NIET può essere avviato usando la scorciatoia Alt-Shift-N o tramite il menu Edit/Plugins.
All'avvio, il plugin tenta di identificare la versione corrente del framework .NET Native del binario. Tutto quello che devi fare è selezionare SharedLibrary.dll nella versione giusta e poi fare clic su Run.
.NIET identificherà la versione del framework .NET Native della dll di destinazione e mostrerà un messaggio se le versioni non sono le stesse. Di solito solo i numeri di versione Major e Minor sono quelli che contano.
.NIET cerca la tabella dei descrittori di importazione personalizzati di .NET Native all'interno della sezione .rdata. Per farlo, legge a offset specifici di una struttura Custom Header e poi analizza un array di ordinali.
Questo array di ordinali punta a varie posizioni all'interno delle voci della tabella personalizzata di SharedLibrary.dll.
La risoluzione dei simboli viene ottenuta avviando un'istanza headless di IDA Pro tramite il suo binario idat per analizzare il pdb di SharedLibrary.dll.
I simboli vengono importati così come sono, se possibile, ma possono presentarsi alcuni casi particolari:
jmpstubs verso offset o singole istruzioni jmp verso simboli. Il loro nome simbolico viene sostituito da .NIET con il nome della funzione di destinazione preceduto da jmp_deref_X viene aggiunto al nome di questo simbolo, se trovato, con X che indica il numero di dereferenze.EETableSection. Essendo nuovo a .NET Native, non ho idea di cosa sia (ancora?), quindi questi indirizzi vengono etichettati come EETableSection_XXX, dove XXX sono gli offset da EETableSection all'interno di SharedLibrary.dll.pdb di binari piuttosto grandiSharedLibrary.dll, sebbene la routine originale incaricata della risoluzione dei simboli offra probabilmente la possibilità di analizzare altri moduli (non so se questo avvenga realmente oltre al modulo SharedLibrary.dll).Il file di log di idat è definito in %tmpdir%/dotNIETlogs.txt
Perché fare reverse engineering di .NET Native è un incubo.