
.NIET 是一个 IDA Pro 插件。其目的是导入缺失的符号(通常有数千个),这些符号由 .NET Native 编译的二进制文件在运行时解析。这些符号位于 SharedLibrary.dll 中,但并未被该文件导出。
.NIET 已在以下平台上通过 IDA Pro 7.5(使用 python 3.8)进行了测试:
该插件目前支持以下 .NET Native 框架版本:
如果你遇到其他版本,请创建一个 issue。
将这些文件复制到你的 IDA Pro 插件目录:
dotNIET_plugin.py
dotNIET\
.NIET 依赖 pefile 来解析资源目录。
pefile 可以通过以下方式安装:
pip install pefile
由于符号是从 SharedLibrary.dll 导入的,因此必须将该文件 连同其 pdb 一起提供给 .NIET(插件会在 _NT_SYMBOL_PATH 中搜索其位置)。
已实现了辅助功能来识别 .NET Native 框架版本,并验证 SharedLibrary.dll 的 pdb 是否存在于已配置的符号路径中。

.NIET 可以使用快捷键 Alt-Shift-N 启动,或通过 Edit/Plugins 菜单启动。
启动后,插件会尝试识别当前二进制的 .NET Native 框架版本。你只需选择正确版本的 SharedLibrary.dll,然后点击 Run 即可。
.NIET 会识别目标 dll 的 .NET Native 框架版本,如果版本不一致则会弹出提示信息。通常只有主版本号和次版本号才是最重要的。
.NIET 会在 .rdata 节中查找 .NET Native 自定义导入描述符表。为此,它读取 Custom Header 结构中特定偏移位置的数据,然后解析一个序号数组。
该序号数组指向 SharedLibrary.dll 自定义表条目中的各个位置。
通过其二进制文件 idat 启动 IDA Pro 无头(headless)实例来解析 SharedLibrary.dll 的 pdb,从而实现符号解析。
符号在可能的情况下会按原样导入,但可能会遇到一些特殊情况:
jmpstubs 符号,或指向符号的单个 jmp 指令。.NIET 会将这些符号名称替换为目标函数名,并在前面加上 jmp_deref_X,其中 X 是解引用的次数。EETableSection 表内的偏移量。由于我尚未深入了解 .NET Native,我(暂时)不知道这是什么,因此这些地址会被标记为 EETableSection_XXX,其中 XXX 是 SharedLibrary.dll 中相对于 EETableSection 的偏移量。pdbSharedLibrary.dll 模块解析符号,尽管负责符号解析的原始例程很可能提供了解析其他模块的可能性(除了 SharedLibrary.dll 模块之外是否真的会发生,我不确定)。idat 的 日志文件 定义为 %tmpdir%/dotNIETlogs.txt
因为逆向 .NET Native 是一场噩梦