
リバースエンジニアリングに特化したPowerShellモジュール
ネイティブコードおよびマネージドコードを逆アセンブルします。
Get-CSDisassemblyCapstone Engine 逆アセンブリフレームワークを使用して、バイト配列を逆アセンブルします。
Get-ILDisassemblyMethodInfo オブジェクトから渡された生の MSIL バイト配列を、Ildasm と同様の方法で逆アセンブルします。
マルウェア解析時に役立つツールです。
New-FunctionDelegateX86 または X86_64 関数の実行可能なラッパーを提供します。
Invoke-LoadLibrary現在の PowerShell プロセスに DLL を読み込みます。
New-DllExportFunctionアンマネージドエクスポート関数を囲む実行可能なラッパーデリゲートを作成します。
Get-HostsFileHOSTS ファイルを解析します。
New-HostsFileEntryHOSTS ファイルのエントリを置換または追加します。
Remove-HostsFileEntryHOSTS ファイルからエントリまたは一連のエントリを削除します。
Get-AssemblyStrings.NET 実行可能ファイルからすべての文字列を出力します。
Get-AssemblyResources.NET アセンブリからマネージドリソースを抽出します。
Remove-AssemblySuppressIldasmAttribute.NET アセンブリから SuppressIldasmAttribute 属性を削除します。
Get-AssemblyImplementedMethodsアセンブリ内で MSIL で実装されているすべてのメソッドを返します。
プロセスメモリの検査と分析を行います。
Get-ProcessStringsプロセスのユーザーモードメモリから印刷可能なすべての文字列を出力します。
Get-VirtualMemoryInfokernel32!VirtualQueryEx のラッパーです。
Get-ProcessMemoryInfoユーザーメモリ内の一意なページセットごとに仮想メモリ情報を取得します。この関数は WinDbg の !vadump コマンドに似ています。
Get-StructFromMemory任意のプロセス内のアンマネージドメモリブロックから、指定された型の新しく割り当てられたマネージドオブジェクトにデータをマーシャリングします。
ファイル形式およびインメモリ構造を解析します。
Get-PEディスク上およびメモリ内の PE パーサーおよびプロセスのダンパーです。
Find-ProcessPEs正規の方法で読み込まれたかどうかに関係なく、メモリ内のポータブル実行可能ファイルを検出します。
Get-LibSymbolsWindows LIB ファイルからシンボル情報を表示します。
Get-ObjDumpWindows オブジェクト(OBJ)ファイルに関する情報を表示します。
低レベルの Windows OS 情報を取得および分析します。
Get-NtSystemInformationntdll!NtQuerySystemInformation 関数を呼び出し、その出力を解析するユーティリティです。このユーティリティは、通常ユーザーには表示されない内部 OS 情報を照会するために使用できます。
Get-PEBプロセスのプロセス環境ブロック(PEB)を返します。
Register-ProcessModuleTrace読み込まれたプロセスモジュールのトレースを開始します。
Get-ProcessModuleTraceRegister-ProcessModuleTrace の呼び出し以降に読み込まれたプロセスモジュールを表示します。
Unregister-ProcessModuleTrace実行中のプロセスモジュールトレースを停止します。
Get-SystemInfokernel32!GetSystemInfo のラッパーです。
その他のヘルパー関数
Get-Member組み込みの Get-Member コマンドレットを拡張するプロキシ関数です。'-Private' パラメータを追加し、非パブリックな .NET メンバーを表示できるようにします。
Get-StringsUnicode および Ascii の両方でファイルから文字列をダンプします。このコマンドレットは Sysinternals の strings.exe の機能を再現します。
ConvertTo-Stringファイルのバイトを、元のファイルのバイトと1対1で対応する文字列に変換します。ConvertTo-String はバイナリ正規表現の実行に便利です。
Get-Entropyファイルまたはバイト配列のエントロピーを計算します。
一部の RE 関数で必要とされるライブラリです。
CapstoneCapstone 逆アセンブリエンジンの C# バインディングです。
De4dot強力な .NET 難読化解除および .NET PE 解析ライブラリです。
PSReflectメモリ内の enum、struct、Win32 関数を簡単に定義するために使用されるモジュールです。
FormattersPowerShellArsenal のさまざまな関数の出力を書式設定するために使用される ps1xml ファイルです。
PowerShellArsenal モジュールおよび個々のスクリプトはすべて、特に明記されていない限り、BSD 3-Clause ライセンス の下にあります。
詳細な使用法については、各スクリプトのコメントベースのヘルプを参照してください。
このモジュールをインストールするには、PowerShellArsenal フォルダ全体をモジュールディレクトリのいずれかに配置します。PowerShell のデフォルトのモジュールパスは $Env:PSModulePath 環境変数にリストされています。
ユーザーごとのデフォルトのモジュールパスは: "$Env:HomeDrive$Env:HOMEPATH\Documents\WindowsPowerShell\Modules" コンピューターレベルのデフォルトのモジュールパスは: "$Env:windir\System32\WindowsPowerShell\v1.0\Modules"
モジュールを使用するには、Import-Module PowerShellArsenal と入力します。
インポートされたコマンドを表示するには、Get-Command -Module PowerShellArsenal と入力します。
PowerShell v3 を実行していて、厄介な「インターネットからダウンロードしたスクリプトを本当に実行しますか?」という警告を削除したい場合は、PowerShellArsenal をモジュールパスに配置した後、次のワンライナーを実行します:
$Env:PSModulePath.Split(';') | % { if ( Test-Path (Join-Path $_ PowerShellArsenal) ) {Get-ChildItem $_ -Recurse | Unblock-File} }
各コマンドのヘルプについては、Get-Help が役立ちます。
注: このモジュールに含まれているツールはすべて、個別に実行できるように設計されています。それらをモジュールに含めることは、移植性を高めるためです。
PowerShellArsenal へのすべてのコントリビューターおよび将来のコントリビューターの方へ、スクリプト/モジュールを作成する際にはこのスタイルガイドに従っていただくようお願いします。
何があっても Write-Host を使用しないでください。PowerShell の関数/コマンドレットはコマンドラインユーティリティではありません! Write-Host を含むコードのプルリクエストは検討されません。代わりにカスタムオブジェクトを出力してください。カスタムオブジェクトの作成についての詳細は、以下の記事をお読みください:
画面に関連するデバッグ情報を表示したい場合は、Write-Verbose を使用してください。ユーザーは単に '-Verbose' を追加すれば済みます。
すべてのスクリプトに、説明的なコメントベースのヘルプを必ず提供してください。また、あなたの名前と BSD 3-Clause ライセンス(BSD ライセンスの適用を妨げる特別な事情がない限り)を含めてください。
すべての関数が適切な PowerShell の動詞-名詞の規則に従っていることを確認してください。PowerShell で使用されるデフォルトの動詞を一覧表示するには Get-Verb を使用します。サポートされている動詞の例外は、ケースバイケースで検討されます。
変数名は大文字にし、できるだけ説明的にすることを推奨します。
コードの間に論理的なスペースを入れてください。コードを読みやすくするためにインデントを付けてください。
コードを繰り返している場合は、関数を作成してください。
予想されるすべてのエラーをキャッチし、意味のある出力を提供してください。スクリプトの実行を停止する必要があるエラーがある場合は 'Throw' を使用してください。実行を停止する必要がないエラーがある場合は Write-Error を使用してください。
Win32 API とやり取りするスクリプトを作成する場合は、Add-Type を使用した C# のインラインコンパイルを避けてください。可能な場合は PSReflect モジュールを使用してください。
ハードコードされたパスは使用しないでください。スクリプトは箱から出してすぐに使用できるようにしてください。ユーザーがコードを修正する必要はないはずです。
PowerShell v2 との互換性が強く望まれます。
位置パラメータを使用し、パラメータを必須にするのが理にかなっている場合はそうしてください。例えば、以下のようなものを想定しています:
[Parameter(Position = 0, Mandatory = $True)]パイプライン入力を受け取る場合を除き、エイリアスは使用しないでください。エイリアスは、特定のエイリアスに慣れていない人にとってコードを読みにくくします。
コマンドが長くなりすぎないようにしてください。例えば、パイプラインは自然な改行の場所です。
インラインコメントを使いすぎないでください。コードの特定の側面が読者にとって混乱を招く可能性がある場合にのみ使用してください。
Out-Null を使用して不要な/無関係な出力を抑制する代わりに、不要な出力を $null に保存してください。これにより、わずかにパフォーマンスが向上します。
パラメータにデフォルト値を使用するのが理にかなっている場合はそうしてください。理想的には、パラメータを必要とせずに動作するスクリプトを目指してください。
関数のコメントベースのヘルプに、すべての必須およびオプションの依存関係を明示的に記載してください。すべてのライブラリの依存関係は 'Lib' フォルダに配置する必要があります。
スクリプトが複雑なカスタムオブジェクトを作成する場合は、オブジェクトの出力を適切に書式設定する ps1xml ファイルを含めてください。ps1xml ファイルは Lib\Formatters に保存されています。