
Plugin para IDA Pro que importa símbolos resueltos en tiempo de ejecución en binarios .NET Native, analizando SharedLibrary.dll y su PDB para restaurar las importaciones que faltan para el análisis.

.NIET es un plugin de IDA Pro. Su propósito es importar símbolos faltantes (normalmente unos pocos miles) que son resueltos en tiempo de ejecución por binarios compilados con .NET Native. Estos símbolos se encuentran en SharedLibrary.dll y no son exportados por esta.
.NIET ha sido probado en IDA Pro 7.5 usando python 3.8 en las siguientes plataformas:
Este plugin actualmente soporta las siguientes versiones del framework .NET Native:
Por favor, abre un issue si encuentras otra versión.
Copia estos elementos en el directorio de plugins de tu IDA Pro:
dotNIET_plugin.py
dotNIET\
.NIET depende de pefile para analizar los directorios de recursos.
pefile se puede instalar de la siguiente manera:
pip install pefile
Debido a que los símbolos se importan desde SharedLibrary.dll, este debe ser proporcionado a .NIET junto con su pdb (el plugin busca su ubicación dentro de _NT_SYMBOL_PATH).
Se han implementado funciones auxiliares para identificar las versiones del framework .NET Native y verificar que el pdb de SharedLibrary.dll existe dentro de la ruta de símbolos configurada.

.NIET se puede lanzar usando el atajo Alt-Shift-N o a través del menú Edit/Plugins.
Al iniciarse, el plugin intenta identificar la versión del framework .NET Native del binario actual. Todo lo que tienes que hacer es seleccionar SharedLibrary.dll en la versión correcta y luego hacer clic en Run.
.NIET identificará la versión del framework .NET Native de la dll objetivo y mostrará un mensaje si las versiones no son las mismas. Normalmente, los números de versión Major y Minor son los únicos que importan.
.NIET busca la tabla de descriptores de importación personalizados de .NET Native dentro de la sección .rdata. Para ello, lee en desplazamientos específicos de una estructura Custom Header y luego analiza un array de ordinales.
Este array de ordinales apunta a varias ubicaciones dentro de las entradas de la tabla personalizada de SharedLibrary.dll.
La resolución de símbolos se logra lanzando una instancia headless de IDA Pro mediante su binario idat para analizar el pdb de SharedLibrary.dll.
Los símbolos se importan tal cual si es posible, pero pueden encontrarse algunos casos especiales:
jmpstubs hacia desplazamientos o instrucciones jmp individuales hacia símbolos. Su nombre de símbolo es reemplazado por .NIET por el nombre de la función objetivo precedido por jmp_deref_X se añade a este nombre de símbolo, si se encuentra, siendo X el número de desreferencias.EETableSection. Siendo nuevo en .NET Native, no tengo idea de qué es esto (¿todavía?), por lo que estas direcciones se etiquetan como EETableSection_XXX, siendo XXX los desplazamientos desde EETableSection dentro de SharedLibrary.dllpdb de binarios bastante grandesSharedLibrary.dll, aunque la rutina original encargada de la resolución de símbolos probablemente ofrece la posibilidad de analizar otros módulos (no sé si esto ocurre realmente aparte del módulo SharedLibrary.dll)El archivo de registro de idat está definido en %tmpdir%/dotNIETlogs.txt
Porque hacer reversing de .NET Native es una pesadilla