
PowerShellモジュールで、.NETアセンブリ内のP/Invoke、Dynamic P/Invoke、D/Invokeを自動検出します。アンマネージAPI呼び出し、MDToken、エクスポート場所をDnSpyブックマークに出力し、マルウェア解析に役立てます。
Get-PDInvokeImportsは、アセンブリ内でのP/Invoke、Dynamic P/Invoke、D/Invokeの使用を自動検出できるツール(PowerShellモジュール)です。それらが参照されているすべての場所を表示し、すべてをDnSpy_Bookmarks.xmlにエクスポートします。
このPSモジュールは、.NETアセンブリのリバースエンジニアリング中に、アセンブリで使用されているアンマネージAPI関数への呼び出しを迅速に明らかにするのに役立ちます。マルウェアアセンブリにはジャンクコードが大量に含まれ、メイン機能が直接WIN APIまたはNTAPI呼び出しによって実装されている場合があります。
Get-PDInvokeImportsを使用すると、アセンブリで使用されているP/Invoke、Dynamic P/Invoke、D/Invokeをすばやく把握できます。使用されている関数、MDToken、宣言場所、コード内で使用されているすべての場所が表示されます。
検出されたP/Invoke、Dynamic P/Invoke、D/Invokeがコードから参照されているすべての場所をDnSpy Bookmarks.xmlにエクスポートできます。
例:ジャンクコードとCF難読化でいっぱいの1MBのアセンブリを想像してください。メイン機能はアンマネージWinAPI\NTAPI呼び出しを介して実現されています。
このPSモジュールはPowerShellで記述されており、Windows PowerShell(.NET Framework)およびPowerShell Core(.NET、.NET Coreベース)と完全に互換性があります。dnlibを使用してアセンブリを解析し、.NETリフレクションを使用してdnlibをロードします。dnlibは.NET Frameworkおよび.NET Standardで利用可能です。つまり、このPSモジュールはWindowsおよびLinux OSでdnlibに依存して使用できます。
簡単に言うと、これらはマネージコードからアンマネージコードを呼び出すための可能な実装方法です(簡略化すると、.NETから直接WinAPI/NTAPIを呼び出すために使用できます)。
実装が容易なものもあれば、AV検出やフッキングを回避するのに適したものもあります。
詳細情報:
P/Invoke -
[PInvoke]
D/Invoke - [DInvoke]
Dynamic P/Invoke - [Dynamic
PInvoke]
[Releases]には、指定されたプラットフォーム用にコンパイル済みのdnlibとスクリプトGet-PDInvokeImports.ps1が含まれています。
Windows – [release]をダウンロード(Windows PowerShellまたはPowerShell Coreから使用)
Linux – [release]をダウンロード(PowerShell Coreから使用)
必要に応じて、dnlibを自分でコンパイルすることもできます(Windows – .NET Framework、Linux – netstandard)
必須パラメーター。
スキャンするアセンブリのパスを指定します。
オプションパラメーター。
dnlib.dllへのシステムパス。
PowerShellがdnlib.dllの場所から実行されている場合、このパラメーターは無視できます。それ以外の場合は指定してください。
オプションパラメーター。
検出されたすべてのP/Invoke、Dynamic P/Invoke、D/Invokeの場所をコードからDnSpy Bookmarks XMLファイル(DnSpy_Bookmarks.xml)にエクスポートするために使用します。
DnSpyの「Analyze-UsedBy」と似ています(コード全体でPInvokeとDInvokeがどこで使用されているかを概要表示)。
そのため、DnSpyのブックマークウィンドウからインポートできます(DnSpy → 表示 → ブックマーク → ブックマークウィンドウ → ファイルからブックマークをインポート → 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




検出は一般的な難読化を打ち破るのに十分な堅牢性を持つはずです。
SmartAssembly、ConfuserExなどの一般的な難読化ツールでテスト済みです。
検出の内部動作:P/Invokeは常に存在する必要があるPinvokeImpl属性を介して検出されます。
D/Invokeは「UnmanagedFunctionPointerAttribute」属性と「CallingConvention」を介して検出されます(特定の条件下で回避される可能性がありますが、それはRedTeamの想像力に任せます(いずれにせよ打ち負かします)。
Dynamic P/Invokeの検出は、DefinePInvokeMethod()を参照するmethodXと、methodXを参照するすべてのmethodYを見つけることに基づいています。
[dnlib](.NETメタデータリーダー/ライター。難読化されたアセンブリも読み取れます)
[DnSpyEx - オプション]