
Módulo PowerShell para detecção automática de P/Invoke, Dynamic P/Invoke e D/Invoke em assemblies .NET. Revela chamadas de API não gerenciadas, MDTokens e locais de exportações para marcadores do DnSpy para análise de malware.
O Get-PDInvokeImports é uma ferramenta (módulo PowerShell) capaz de realizar a detecção automática do uso de P/Invoke, Dynamic P/Invoke e D/Invoke em assemblies. Mostra todos os locais de onde são referenciados e exporta tudo para DnSpy_Bookmarks.xml
Este módulo PS pode ser útil e auxiliar durante a engenharia reversa de assemblies .NET para
revelar rapidamente chamadas a funções não gerenciadas da API usadas no assembly. Às vezes,
assemblies de malware estão cheios de código lixo onde a funcionalidade principal é
implementada por chamadas diretas à WIN API ou NTAPI.
O Get-PDInvokeImports permite que você tenha uma visão geral rápida de quais P/Invoke, Dynamic
P/Invoke e D/Invoke são usados no assembly – Ele mostrará quais funções são
usadas + MDTokens, onde são declaradas e todos os locais de onde são usadas no código.
Permite exportar todos os locais onde são detectados P/Invoke, Dynamic P/Invoke
e D/Invoke referenciados no código para DnSpy Bookmarks.xml
Exemplo: Imagine um assembly de 1 MB cheio de código lixo + ofuscação CF onde a funcionalidade principal é alcançada por chamadas não gerenciadas à WinAPI\NTAPI.
Este módulo PS é escrito em PowerShell e é totalmente compatível com Windows PowerShell (.NET Framework) e PowerShell Core (baseado em .NET, .NET Core). Ele usa dnlib para analisar o assembly e .NET reflection para carregar dnlib. O Dnlib está disponível para .NET framework e .NET standard – simplesmente significa que é possível usar este módulo PS dependente de dnlib no Windows e também no Linux.
Bem, de forma muito resumida, são implementações possíveis de como chamar
código não gerenciado a partir do código gerenciado (simplificado – pode ser usado para chamar diretamente
WinAPI/NTAPI a partir do .NET)
Algumas são mais fáceis de implementar, outras são melhores para evitar detecção
por AV e hooking.
Mais informações:
P/Invoke -
[PInvoke]
D/Invoke - [DInvoke]
Dynamic P/Invoke - [Dynamic
PInvoke]
[Releases] contém dnlib já compilado para a plataforma especificada + o script
Get-PDInvokeImports.ps1.
Windows – Baixe o [release] (Use no Windows PowerShell ou PowerShell Core)
Linux – Baixe o [release] (Use no PowerShell Core)
Se necessário – compile o dnlib por conta própria (Windows – .NET Framework,
Linux – netstandard)
Parâmetro obrigatório.
Especifica o caminho do assembly a ser analisado.
Parâmetro opcional.
Caminho do sistema para dnlib.dll.
Se o PowerShell estiver sendo executado no local do dnlib.dll – este parâmetro pode
ser ignorado; caso contrário, especifique este parâmetro.
Parâmetro opcional.
Usado para exportar todos os locais de P/Invoke, Dynamic P/Invoke e D/Invoke detectados
referenciados no código para o arquivo XML de Bookmarks do DnSpy (DnSpy_Bookmarks.xml)
Similar ao DnSpy-Analyze-UsedBy (Boa visão geral de onde todos os PInvoke e DInvoke são
usados em todo o código)
Assim, é possível importá-lo para o DnSpy através da janela de Bookmarks (DnSpy -> View ->
Bookmarks -> Bookmark Window -> Import bookmarks from file -> selecione
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




A detecção deve ser robusta o suficiente para derrotar algumas ofuscações comuns..
Testada com ofuscadores mais comuns como SmartAssembly, ConfuserEx etc.
Detalhes da detecção: P/Invoke é detectado através do atributo PinvokeImpl, que deve estar
sempre presente.
D/Invoke é detectado através do atributo "UnmanagedFunctionPointerAttribute" e "CallingConvention" (Isso
pode ser derrotado em certas circunstâncias – mas deixo para a imaginação da RedTeam (de qualquer forma, vou derrotá-los)
A detecção de Dynamic P/Invoke é baseada na localização do métodoX que faz referência a DefinePInvokeMethod() + todos os métodosY que referenciam methodX.
[dnlib] (leitor/gravador de metadados .NET que também pode
ler assemblies ofuscados)
[DnSpyEx - opcional]