
Модуль PowerShell для автоматического обнаружения P/Invoke, Dynamic P/Invoke и D/Invoke в сборках .NET. Раскрывает вызовы неуправляемых API, MDTokens и расположения экспортов в закладках DnSpy для анализа вредоносного ПО.
Get-PDInvokeImports — это инструмент (модуль PowerShell), способный выполнять автоматическое обнаружение использования P/Invoke, Dynamic P/Invoke и D/Invoke в сборке. Показывает все места, откуда они вызываются, и экспортирует все в DnSpy_Bookmarks.xml.
Этот PS-модуль может быть полезен и удобен при реверс-инжиниринге .NET-сборок для быстрого выявления вызовов неуправляемых API-функций, используемых в сборке. Иногда вредоносные сборки содержат много мусорного кода, где основная функциональность реализована с помощью прямых вызовов WIN API или NTAPI.
Get-PDInvokeImports позволяет быстро получить обзор того, какие P/Invoke, Dynamic P/Invoke и D/Invoke используются в сборке — он покажет, какие функции используются, их MDToken, где они объявлены и все места, где они вызываются из кода.
Он позволяет экспортировать все места, где обнаружены ссылки на P/Invoke, Dynamic P/Invoke и D/Invoke из кода, в файл DnSpy_Bookmarks.xml.
Пример: Представьте сборку размером 1 МБ, полную мусорного кода и CF-обфускации, где основная функциональность реализована через вызовы неуправляемых WinAPI\NTAPI.
Этот PS-модуль написан на PowerShell и полностью совместим с Windows PowerShell (.NET Framework) и PowerShell Core (на основе .NET, .NET Core). Он использует dnlib для разбора сборки и .NET reflection для загрузки dnlib. Dnlib доступен для .NET Framework и .NET Standard — это означает, что можно использовать этот PS-модуль с dnlib как в Windows, так и в Linux.
Если очень кратко, это возможные способы вызова неуправляемого кода из управляемого (упрощённо — можно напрямую вызывать WinAPI/NTAPI из .NET).
Некоторые из них проще в реализации, некоторые лучше позволяют избегать обнаружения AV и перехвата.
Подробнее:
P/Invoke — [PInvoke]
D/Invoke — [DInvoke]
Dynamic P/Invoke — [Dynamic PInvoke]
[Releases] содержит уже скомпилированный dnlib для указанной платформы + скрипт Get-PDInvokeImports.ps1.
Windows — Скачать [релиз] (использовать в Windows PowerShell или PowerShell Core)
Linux — Скачать [релиз] (использовать в PowerShell Core)
При необходимости — скомпилировать dnlib самостоятельно (Windows — .NET Framework, Linux — netstandard)
Обязательный параметр.
Указывает путь к сборке для сканирования.
Необязательный параметр.
Системный путь к dnlib.dll.
Если PowerShell запущен из папки, где находится dnlib.dll, этот параметр можно игнорировать; в противном случае укажите его.
Необязательный параметр.
Используется для экспорта всех обнаруженных мест P/Invoke, Dynamic P/Invoke и D/Invoke, на которые есть ссылки из кода, в XML-файл закладок DnSpy (DnSpy_Bookmarks.xml).
Похоже на DnSpy-Analyze-UsedBy (удобный обзор, где все PInvoke и DInvoke используются во всём коде).
Таким образом, его можно импортировать в DnSpy через окно закладок (DnSpy -> View -> Bookmarks -> Bookmark Window -> Import bookmarks from file -> выберите 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" (при определённых условиях это можно обойти, но я оставляю это на усмотрение RedTeam (я всё равно вас переиграю).
Обнаружение Dynamic P/Invoke основано на поиске методаX, ссылающегося на DefinePInvokeMethod(), и всех методовY, ссылающихся на методX.
[dnlib] (читатель/писатель метаданных .NET, способный также читать обфусцированные сборки)
[DnSpyEx - опционально]