
Módulo de PowerShell para la detección automática de P/Invoke, Dynamic P/Invoke y D/Invoke en ensamblados .NET. Revela llamadas a API no administradas, MDTokens y ubicaciones de exportaciones a marcadores de DnSpy para análisis de malware.
Get-PDInvokeImports es una herramienta (módulo de PowerShell) capaz de realizar la detección automática del uso de P/Invoke, Dynamic P/Invoke y D/Invoke en un ensamblado. Muestra todas las ubicaciones desde donde se hace referencia a ellos y exporta todo a DnSpy_Bookmarks.xml
Este módulo de PS puede ser útil y de ayuda durante la ingeniería inversa de ensamblados .NET para revelar rápidamente llamadas a funciones de API no administradas utilizadas en el ensamblado. A veces, los ensamblados de malware están llenos de código basura donde la funcionalidad principal se implementa mediante llamadas directas a WIN API o NTAPI.
Get-PDInvokeImports le permite obtener una visión rápida de qué P/Invoke, Dynamic P/Invoke y D/Invoke se utilizan en el ensamblado: le mostrará qué funciones se utilizan + MDTokens, dónde se declaran y todas las ubicaciones donde se utilizan desde el código.
Permite exportar todas las ubicaciones donde se detectan referencias de P/Invoke, Dynamic P/Invoke y D/Invoke desde el código a DnSpy Bookmarks.xml
Ejemplo: Imagine un ensamblado de 1 MB lleno de código basura + ofuscación CF donde la funcionalidad principal se alcanza mediante llamadas a WinAPI\NTAPI no administradas.
Este módulo de PS está escrito en PowerShell y es totalmente compatible con Windows PowerShell (.NET Framework) y PowerShell Core (basado en .NET, .NET Core). Utiliza dnlib para analizar el ensamblado y la reflexión de .NET para cargar dnlib. Dnlib está disponible para .NET Framework y .NET Standard; esto simplemente significa que se puede usar este módulo de PS dependiendo de dnlib en Windows y también en Linux.
Bueno, dicho muy brevemente, estas son posibles implementaciones de cómo se puede llamar a código no administrado desde código administrado (simplificado: se pueden usar para llamar directamente a WinAPI/NTAPI desde .NET).
Algunas son más fáciles de implementar, otras son mejores para evitar la detección de AV y el hooking.
Más información:
P/Invoke - [PInvoke]
D/Invoke - [DInvoke]
Dynamic P/Invoke - [Dynamic PInvoke]
[Releases] contiene dnlib ya compilado para la plataforma especificada + el script Get-PDInvokeImports.ps1.
Windows – Descargue [release] (Úselo desde Windows PowerShell o PowerShell Core)
Linux – Descargue [release] (Úselo desde PowerShell Core)
Si es necesario, compile dnlib por su cuenta (Windows – .NET Framework, Linux-netstandard)
Parámetro obligatorio.
Especifica la ruta del ensamblado a escanear.
Parámetro opcional.
Ruta del sistema a dnlib.dll.
Si PowerShell se está ejecutando desde la ubicación de dnlib.dll, este parámetro se puede omitir; de lo contrario, especifique este parámetro.
Parámetro opcional.
Se utiliza para exportar todas las ubicaciones detectadas de P/Invoke, Dynamic P/Invoke y D/Invoke referenciadas desde el código a un archivo XML de marcadores de DnSpy (DnSpy_Bookmarks.xml)
Similar a DnSpy-Analyze-UsedBy (una buena visión general de dónde se utilizan todos los PInvoke y DInvoke en todo el código)
Por lo tanto, es posible importarlo a DnSpy a través de la ventana de marcadores (DnSpy -> Ver -> Marcadores -> Ventana de marcadores -> Importar marcadores desde archivo -> seleccionar 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




La detección debería ser lo suficientemente robusta como para superar algunas ofuscaciones comunes..
Probado con los ofuscadores más comunes como SmartAssembly, ConfuserEx, etc.
Detección interna: P/Invoke se detecta mediante el atributo PinvokeImpl que debe estar siempre presente.
D/Invoke se detecta mediante el atributo "UnmanagedFunctionPointerAttribute" y "CallingConvention" (Esto podría ser superado bajo ciertas circunstancias, pero lo dejo a la imaginación del RedTeam (de todas formas te ganaré)
La detección de Dynamic P/Invoke se basa en encontrar methodX que haga referencia a DefinePInvokeMethod() + todos los methodsY que hagan referencia a methodX.
[dnlib] (lector/escritor de metadatos .NET que también puede leer ensamblados ofuscados)
[DnSpyEx - opcional]