
Modulo PowerShell per il rilevamento automatico di P/Invoke, Dynamic P/Invoke e D/Invoke in assembly .NET. Rivela chiamate API non gestite, MDToken e posizioni di esportazione nei segnalibri di DnSpy per l'analisi malware.
Get-PDInvokeImports è uno strumento (modulo PowerShell) in grado di eseguire il rilevamento automatico dell'uso di P/Invoke, Dynamic P/Invoke e D/Invoke in un assembly. Mostra tutte le posizioni da cui vengono referenziati ed esporta tutto in DnSpy_Bookmarks.xml.
Questo modulo PS può essere utile e d'aiuto durante il reversing di assembly .NET per rivelare rapidamente le chiamate a funzioni API non gestite utilizzate nell'assembly. A volte gli assembly malware sono pieni di codice spazzatura dove la funzionalità principale è implementata tramite chiamate dirette WIN API o NTAPI.
Get-PDInvokeImports ti consente di ottenere una rapida panoramica di quali P/Invoke, Dynamic P/Invoke e D/Invoke sono utilizzati nell'assembly – Mostrerà quali funzioni sono usate + MDTokens, dove sono dichiarate, e tutte le posizioni in cui sono usate dal codice.
Consente di esportare tutte le posizioni in cui vengono rilevati P/Invoke, Dynamic P/Invoke e D/Invoke referenziati dal codice in DnSpy Bookmarks.xml.
Esempio: Immagina un assembly da 1MB pieno di codice spazzatura + offuscamento CF dove la funzionalità principale è raggiunta tramite chiamate WinAPI\NTAPI non gestite.
Questo modulo PS è scritto in PowerShell ed è pienamente compatibile con Windows PowerShell (.NET Framework) e PowerShell Core (basato su .NET, .NET Core). Utilizza dnlib per analizzare l'assembly e .NET reflection per caricare dnlib. Dnlib è disponibile per .NET framework e .NET standard – significa semplicemente che si può usare questo modulo PS a seconda di dnlib su Windows e anche su sistemi Linux.
In breve, queste sono possibili implementazioni per chiamare codice non gestito da codice gestito (semplificato – possono essere usati per chiamare direttamente WinAPI/NTAPI da .NET)
Alcuni sono più facili da implementare, altri sono migliori per evitare il rilevamento AV e l'hooking.
Maggiori informazioni:
P/Invoke –
[PInvoke]
D/Invoke – [DInvoke]
Dynamic P/Invoke – [Dynamic
PInvoke]
[Releases] contiene già dnlib compilato per la piattaforma specificata + lo script
Get-PDInvokeImports.ps1.
Windows – Scarica [release] (Usa da Windows PowerShell o PowerShell Core)
Linux – Scarica [release] (Usa da PowerShell Core)
Se necessario – compila dnlib autonomamente (Windows – .NET Framework,
Linux-netstandard)
Parametro obbligatorio.
Specifica il percorso dell'assembly da analizzare.
Parametro opzionale.
Percorso di sistema a dnlib.dll.
Se PowerShell viene eseguito dalla posizione di dnlib.dll – questo parametro può
essere ignorato, altrimenti specificare questo parametro.
Parametro opzionale.
Utilizzato per esportare tutte le posizioni rilevate di P/Invoke, Dynamic P/Invoke e D/Invoke
referenziate dal codice in un file XML di segnalibri DnSpy (DnSpy_Bookmarks.xml)
Simile a DnSpy-Analyze-UsedBy (Buona panoramica su dove tutti i PInvoke e DInvoke sono
utilizzati nell'intero codice)
Quindi è possibile importarlo in DnSpy tramite la finestra Segnalibri (DnSpy -> Visualizza ->
Segnalibri -> Finestra segnalibri -> Importa segnalibri da file -> seleziona
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




Il rilevamento dovrebbe essere abbastanza robusto da sconfiggere alcuni offuscamenti comuni.
Testato con gli offuscatori più comuni come SmartAssembly, ConfuserEx, ecc.
Dettagli interni del rilevamento: P/Invoke viene rilevato tramite l'attributo PinvokeImpl che deve essere sempre presente.
D/Invoke viene rilevato tramite l'attributo "UnmanagedFunctionPointerAttribute" e "CallingConvention" (Questo
potrebbe essere sconfitto in determinate circostanze – ma lo lascio all'immaginazione del RedTeam (ti batterò comunque))
Il rilevamento di Dynamic P/Invoke si basa sulla ricerca di un metodoX che referenzia DefinePInvokeMethod() + tutti i metodiY che referenziano methodX.
[dnlib] (lettore/scrittore di metadati .NET in grado di
leggere anche assembly offuscati)
[DnSpyEx - opzionale]