
PowerShell-Modul zur automatischen Erkennung von P/Invoke, Dynamic P/Invoke und D/Invoke in .NET-Assemblys. Zeigt Aufrufe nicht verwalteter APIs, MDTokens und Exportpositionen in DnSpy-Lesezeichen für die Malware-Analyse an.
Get-PDInvokeImports ist ein Tool (PowerShell-Modul), das in der Lage ist, die Verwendung von P/Invoke, Dynamic P/Invoke und D/Invoke in einer Assembly automatisch zu erkennen. Es zeigt alle Stellen an, von denen sie referenziert werden, und exportiert alle in DnSpy_Bookmarks.xml.
Dieses PS-Modul kann beim Reversen von .NET-Assemblies nützlich und hilfreich sein, um schnell Aufrufe von nicht verwalteten API-Funktionen in der Assembly aufzudecken. Manchmal sind Schadsoftware-Assemblies voller Junk-Code, während die Hauptfunktionalität durch direkte WIN-API- oder NTAPI-Aufrufe implementiert wird.
Get-PDInvokeImports ermöglicht Ihnen einen schnellen Überblick darüber, welche P/Invoke, Dynamic P/Invoke und D/Invoke in der Assembly verwendet werden - Es zeigt Ihnen, welche Funktionen verwendet werden + MDTokens, wo sie deklariert sind, und alle Stellen, an denen sie im Code verwendet werden.
Es ermöglicht den Export aller Stellen, an denen P/Invoke, Dynamic P/Invoke und D/Invoke aus dem Code referenziert werden, in DnSpy Bookmarks.xml.
Beispiel: Stellen Sie sich eine 1 MB große Assembly voller Junk-Code + CF-Verschleierung vor, bei der die Hauptfunktionalität über nicht verwaltete WinAPI\NTAPI-Aufrufe erreicht wird.
Dieses PS-Modul ist in PowerShell geschrieben und vollständig kompatibel mit Windows PowerShell (.NET Framework) und PowerShell Core (basiert auf .NET, .NET Core). Es verwendet dnlib, um Assemblys zu parsen, und .NET-Reflection, um dnlib zu laden. Dnlib ist für .NET Framework und .NET Standard verfügbar - das bedeutet, dass man dieses PS-Modul abhängig von dnlib unter Windows und auch Linux verwenden kann.
Nun, ganz kurz gesagt, dies sind mögliche Implementierungen, wie man nicht verwalteten Code aus verwaltetem Code aufrufen kann (vereinfacht – können verwendet werden, um direkt WinAPI/NTAPI aus .NET aufzurufen)
Einige sind einfacher zu implementieren, andere eignen sich besser, um AV-Erkennung und Hooking zu umgehen.
Weitere Informationen:
P/Invoke - [PInvoke]
D/Invoke - [DInvoke]
Dynamic P/Invoke - [Dynamic PInvoke]
[Releases] enthält bereits kompiliertes dnlib für die angegebene Plattform + Skript Get-PDInvokeImports.ps1.
Windows – Download [release] (Verwendung mit Windows PowerShell oder PowerShell Core)
Linux – Download [release] (Verwendung mit PowerShell Core)
Bei Bedarf - kompilieren Sie dnlib selbst (Windows – .NET Framework, Linux-netstandard)
Erforderlicher Parameter.
Gibt den zu überprüfenden Assembly-Pfad an.
Optionaler Parameter.
Systempfad zu dnlib.dll.
Wenn PowerShell vom Speicherort von dnlib.dll aus ausgeführt wird, kann dieser Parameter ignoriert werden, andernfalls geben Sie diesen Parameter an.
Optionaler Parameter.
Wird verwendet, um alle erkannten P/Invoke-, Dynamic P/Invoke- und D/Invoke-Stellen, die im Code referenziert werden, in eine DnSpy-Lesezeichen-XML-Datei zu exportieren (DnSpy_Bookmarks.xml)
Ähnlich wie DnSpy-Analyze-UsedBy (Nützliche Übersicht, wo alle PInvoke und DInvoke im gesamten Code verwendet werden)
So ist es möglich, es über das Lesezeichenfenster in DnSpy zu importieren (DnSpy -> View -> Bookmarks -> Bookmark Window -> Import bookmarks from file -> DnSpy_Bookmarks.xml auswählen)
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




Die Erkennung sollte robust genug sein, um einige gängige Verschleierungen zu überwinden..
Getestet mit den gängigsten Obfuskatoren wie SmartAssembly, ConfuserEx usw.
Erkennungsinterna: P/Invoke wird über das PinvokeImpl-Attribut erkannt, das immer vorhanden sein muss.
D/Invoke wird über das Attribut "UnmanagedFunctionPointerAttribute" und "CallingConvention" erkannt (Dies könnte unter bestimmten Umständen umgangen werden – aber ich überlasse es der Fantasie des RedTeams (ich werde dich trotzdem schlagen))
Die Erkennung von Dynamic P/Invoke basiert auf dem Auffinden von methodX, das DefinePInvokeMethod() referenziert, + allen methodY, die methodX referenzieren.
[dnlib] (.NET metadata reader/writer which can also read obfuscated assemblies)
[DnSpyEx - optional]