Get-PDInvokeImports 是一个工具(PowerShell 模块),能够自动检测程序集中 P/Invoke、动态 P/Invoke 和 D/Invoke 的使用情况。它显示所有引用这些调用的位置,并将所有内容导出为 DnSpy_Bookmarks.xml。
该 PS 模块在逆向 .NET 程序集时非常有用,可快速揭示程序集中使用的非托管 API 函数调用。有时恶意软件程序集充满垃圾代码,其主要功能通过直接调用 WIN API 或 NTAPI 实现。
Get-PDInvokeImports 让您快速概览程序集中使用了哪些 P/Invoke、动态 P/Invoke 和 D/Invoke——它会显示使用了哪些函数 + MDToken、声明位置以及代码中所有使用的地方。
它能够将所有检测到的 P/Invoke、动态 P/Invoke 和 D/Invoke 引用位置导出到 DnSpy Bookmarks.xml 中。
示例:想象一个 1MB 的程序集,充满垃圾代码和 CF 混淆,其主要功能通过非托管 WinAPI\NTAPI 调用实现。
此 PS 模块使用 PowerShell 编写,完全兼容 Windows PowerShell(.NET Framework)和 PowerShell Core(基于 .NET、.NET Core)。它使用 dnlib 解析程序集,并通过 .NET 反射加载 dnlib。Dnlib 适用于 .NET Framework 和 .NET Standard——这意味着您可以在 Windows 和 Linux 上根据 dnlib 使用此 PS 模块。
简单来说,这些是从托管代码调用非托管代码的可能实现方式(简化来说——可用于直接从 .NET 调用 WinAPI/NTAPI)。
其中一些实现起来更容易,另一些则更擅长规避 AV 检测和钩子(Hook)。
更多信息:
P/Invoke -
[PInvoke]
D/Invoke - [DInvoke]
动态 P/Invoke - [Dynamic
PInvoke]
[Releases] 包含已为指定平台编译好的 dnlib 以及脚本 Get-PDInvokeImports.ps1。
Windows – 下载 [release](在 Windows PowerShell 或 PowerShell Core 中使用)
Linux – 下载 [release](在 PowerShell Core 中使用)
如果需要,可以自行编译 dnlib(Windows – .NET Framework,Linux – netstandard)
必需参数。
指定要扫描的程序集路径。
可选参数。
dnlib.dll 的系统路径。
如果 PowerShell 正在从 dnlib.dll 所在位置运行,则可忽略此参数;否则请指定此参数。
可选参数。
用于将所有检测到的 P/Invoke、动态 P/Invoke 和 D/Invoke 引用位置导出到 DnSpy Bookmarks XML 文件(DnSpy_Bookmarks.xml)
类似于 DnSpy 的 Analyze-UsedBy 功能(可清晰概览所有 PInvoke 和 DInvoke 在整个代码中的使用位置)
因此,您可以通过书签窗口将其导入 DnSpy(DnSpy -> 视图 -> 书签 -> 书签窗口 -> 从文件导入书签 -> 选择 DnSpy_Bookmarks.xml)
PS> Import-Module .\Get-PDInvokeImports.ps1
PS> Get-PDInvokeImports -PathToAssembly 'C:\testfiles\malware.exe'
PS> Get-PDInvokeImports -PathToAssembly .\malware.exe –ExportDnSpyBookmarks
PS> Get-PDInvokeImports -PathToAssembly 'C:\testfiles\malware.exe' -PathToDnlib "C:\dnlib.dll" –ExportDnSpyBookmarks




检测机制应足够强大以应对某些常见的混淆手段。
已使用最常见的混淆器(如 SmartAssembly、ConfuserEx 等)进行测试。
检测原理:P/Invoke 通过必须始终存在的 PinvokeImpl 属性检测。
D/Invoke 通过 "UnmanagedFunctionPointerAttribute" 属性和 "CallingConvention" 检测(在某些情况下可能被绕过——但留给红队自行想象(我反正会打败你们))
动态 P/Invoke 检测基于查找引用了 DefinePInvokeMethod() 的方法X,以及所有引用方法X 的方法Y。
[dnlib](.NET 元数据读写器,也可读取混淆后的程序集)
[DnSpyEx - 可选]