
Module PowerShell pour la détection automatique de P/Invoke, Dynamic P/Invoke et D/Invoke dans les assemblys .NET. Révèle les appels API non managés, les MDTokens et exporte les emplacements vers les signets DnSpy pour l'analyse de malwares.
Get-PDInvokeImports est un outil (module PowerShell) capable d'effectuer une détection automatique de l'utilisation de P/Invoke, Dynamic P/Invoke et D/Invoke dans un assembly. Il montre tous les emplacements à partir desquels ils sont référencés et exporte le tout vers DnSpy_Bookmarks.xml
Ce module PowerShell peut être utile et pratique lors du reverse engineering d'assemblies .NET pour révéler rapidement les appels aux fonctions API non managées utilisées dans l'assembly. Parfois, les assemblies malveillants sont remplis de code indésirable où la fonctionnalité principale est implémentée par des appels directs WIN API ou NTAPI.
Get-PDInvokeImports vous permet d'obtenir un aperçu rapide des P/Invoke, Dynamic P/Invoke et D/Invoke utilisés dans l'assembly - Il vous montrera quelles fonctions sont utilisées + MDTokens, où elles sont déclarées, et tous les emplacements où elles sont utilisées dans le code.
Il permet d'exporter tous les emplacements où des P/Invoke, Dynamic P/Invoke et D/Invoke sont détectés comme étant référencés depuis le code vers DnSpy Bookmarks.xml
Exemple : Imaginez un assembly de 1 Mo rempli de code indésirable + d'obfuscation CF où la fonctionnalité principale est atteinte via des appels WinAPI\NTAPI non managés.
Ce module PS est écrit en PowerShell et est entièrement compatible avec Windows PowerShell (.NET Framework) et PowerShell Core (basé sur .NET, .NET Core). Il utilise dnlib pour analyser l'assembly et la réflexion .NET pour charger dnlib. Dnlib est disponible pour .NET Framework et .NET Standard - cela signifie simplement que l'on peut utiliser ce module PS en fonction de dnlib sur Windows ainsi que sur Linux.
En très bref, ce sont des implémentations possibles permettant d'appeler du code non managé à partir de code managé (simplifié - peut être utilisé pour appeler directement WinAPI/NTAPI depuis .NET)
Certaines sont plus faciles à implémenter, d'autres sont meilleures pour éviter la détection AV et le hooking.
Plus d'informations :
P/Invoke -
[PInvoke]
D/Invoke - [DInvoke]
Dynamic P/Invoke - [Dynamic
PInvoke]
[Releases] contient déjà dnlib compilé pour la plateforme spécifiée + le script Get-PDInvokeImports.ps1.
Windows – Télécharger [release] (Utiliser depuis Windows PowerShell ou PowerShell Core)
Linux – Télécharger [release] (Utiliser depuis PowerShell Core)
Si nécessaire - compilez dnlib vous-même (Windows – .NET Framework, Linux-netstandard)
Paramètre obligatoire.
Spécifie le chemin de l'assembly à analyser.
Paramètre optionnel.
Chemin système vers dnlib.dll.
Si PowerShell est exécuté depuis l'emplacement de dnlib.dll - ce paramètre peut être ignoré, sinon spécifiez ce paramètre.
Paramètre optionnel.
Utilisé pour exporter tous les emplacements détectés de P/Invoke, Dynamic P/Invoke et D/Invoke référencés depuis le code vers un fichier XML DnSpy Bookmarks (DnSpy_Bookmarks.xml)
Similaire à DnSpy-Analyze-UsedBy (Aperçu agréable de l'endroit où tous les PInvoke et DInvoke sont utilisés dans l'ensemble du code)
Il est donc possible de l'importer dans DnSpy via la fenêtre Bookmarks (DnSpy -> Affichage -> Bookmarks -> Fenêtre Bookmarks -> Importer les signets depuis un fichier -> sélectionner 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 détection devrait être suffisamment robuste pour déjouer certaines obfuscations courantes..
Testé avec les obfuscateurs les plus courants comme SmartAssembly, ConfuserEx, etc.
Fonctionnement interne de la détection : P/Invoke est détecté via l'attribut PinvokeImpl qui doit toujours être présent.
D/Invoke est détecté via l'attribut "UnmanagedFunctionPointerAttribute" et "CallingConvention" (Cela pourrait être contourné dans certaines circonstances – mais je laisse cela à l'imagination de la RedTeam (je vous battrai de toute façon)
La détection de Dynamic P/Invoke est basée sur la recherche de methodX référençant DefinePInvokeMethod() + toutes les méthodesY référençant methodX.
[dnlib] (lecteur/écrivain de métadonnées .NET qui peut également lire des assemblies obfusqués)
[DnSpyEx - optionnel]