
PE-sieve機能のネイティブDelphi実装。再利用可能なライブラリ、CLI、およびHollowsHunter統合用のPE-sieve互換DLLを提供します。
NativeMirrorは、hasherezadeによるPE-sieveを基に適応させた、PE-sieve機能の独立したObject Pascal実装です。プロセスメモリをスキャンし、改変または注入されたコードを検出し、PEファイルをダンプします。
この実装はDelphiネイティブAPIと、PEエンジンとしてNativePeを使用しています。Delphiライブラリとして直接、CLI経由で、またはPE-sieve互換のDLLインターフェース経由で使用できます。これら3つはすべて同じスキャナーコアを共有しています。互換性の目標はPE-sieve 0.4.1.5の外部から観測可能な動作です。完全な動作の等価性は確立されていません。
../NativePeとして配置するか、Delphiの検索パスを調整してください。NativeMirrorScan.NativeAsm.dprojプロジェクトでUSE_NATIVEASMを有効にします。これがない場合、NativeMirrorはDelphi/LDEのフォールバックを使用します。NativeASMの検索パスをインストール環境に合わせて調整してください。pyランチャー付きPython 3: DLLのビルド後ステップとPythonテストに必要です。スクリプトはPython標準ライブラリを使用します。一部のプロジェクト構成にはローカルの依存関係パスが含まれています。別のマシンでビルドする前に検索パスを確認してください。
DelphiでNativeMirror.groupprojを開き、必要なプロジェクト、プラットフォーム、構成を選択します。
| プロジェクト | 出力 |
|---|---|
tools/NativeMirrorScan/NativeMirrorScan.dproj | NativeMirrorScan.exe |
tools/NativeMirrorDll/pe-sieve.dproj | pe-sieve.dll |
tests/ScannerIntegration/NativeMirrorTestTarget.dproj | Win64テストターゲット |
tests/ScannerIntegration/NativeMirrorTestTarget32.dproj | Win32テストターゲット |
tests/ScannerIntegration/NativeMirrorScannerTests.dproj | Win64スキャナーテストランナー |
tests/HollowsHunterIntegration/NativeMirrorHollowsHunterTests.dproj | Win64 HollowsHunterテストランナー |
必要に応じてCLIとDLLをWin32およびWin64向けにビルドします。統合テストを実行する前に両方のテストターゲットをビルドしてください。テストランナーはWin64向けにビルドします。
出力はbin/<Platform>/<Config>に生成されます。以下の例ではDebugを使用しています。コンパイラユニットはdcu/に出力されます。実行ファイルはtools/の外に置いてください。
以下のコマンドはプロジェクトルートから実行してください。1234はスキャンするプロセスIDに置き換えてください。
.\bin\Win64\Debug\NativeMirrorScan.exe /help
.\bin\Win64\Debug\NativeMirrorScan.exe /pid 1234
.\bin\Win64\Debug\NativeMirrorScan.exe /pid 1234 /json /quiet /ofilter 2
.\bin\Win64\Debug\NativeMirrorScan.exe /pid 1234 /dir output
/ofilter 2 はダンプ出力を無効にします。/dir output はレポートとダンプの出力ディレクトリを選択します。必要に応じて bin/Win32/Debug にある Win32 実行ファイルを使用してください。ターゲットプロセスへのアクセスは、お使いの Windows の権限に依存します。
src/ とそのユニットサブディレクトリ、および NativePe をプロジェクトの検索パスに追加します。TNativeMirrorOptions を指定して ScanAndDump を呼び出します。ライブラリはアプリケーションにコンパイルされるため、この使用方法では NativeMirrorScan.exe も pe-sieve.dll も不要です。Python が必要なのは、別途行う DLL ビルドと Python テストのみです。
このコンソールの例では、PID 1234 をスキャンし、そのレポートを JSON として出力します:
program ScanExample;
{$APPTYPE CONSOLE}
uses
System.JSON,
NativeMirror.Core.Types,
NativeMirror.Core.Options,
NativeMirror.Core.Engine;
var
Options: TNativeMirrorOptions;
Report: TNativeMirrorReportEx;
Json: TJSONObject;
begin
Options := TNativeMirrorOptions.Default;
Options.Pid := 1234;
Options.Quiet := True;
Options.OutputFilter := nmOutNoDir;
Report := ScanAndDump(Options);
try
Json := Report.ToJson(Options.ResultsFilter, Options.JsonLevel);
try
Writeln(Json.ToJSON);
finally
Json.Free;
end;
finally
Report.Free;
end;
end.
PID を対象のものに置き換えてください。nmOutNoDir はレポートファイルとダンプを無効にします。スキャンエラーについては Report.ErrorReport を、スキャン結果については Report.ScanReport を確認してください。返されたレポートの所有権は呼び出し元にあり、呼び出し元が解放する必要があります。
PE-sieve releases から pe-sieve32.exe と pe-sieve64.exe をダウンロードしてください。既存の比較スクリプトは v0.4.1.1 の実行ファイルを使用しています。両方を bin/Win64/Debug に配置してください。Win64 のテストスクリプトはそこにある参照スキャナを探します。32 の実行ファイルは元の Win32 参照実装であり、Win64 のテストツールと並べて保存されていますが、その点は変わりません。
Debug のセットアップは次のようになります:
bin/
Win64/Debug/
NativeMirrorScan.exe
pe-sieve.dll
pe-sieve.dll.exports.json
pe-sieve32.exe
pe-sieve64.exe
NativeMirrorTestTarget.exe
NativeMirrorScannerTests.exe
NativeMirrorHollowsHunterTests.exe
hollows_hunter.exe
Win32/Debug/
NativeMirrorScan.exe
pe-sieve.dll
pe-sieve.dll.exports.json
NativeMirrorTestTarget32.exe
NativeMirror は CLI、DLL、エクスポートレコード、ターゲット、テストランナーを生成します。PE-sieve と HollowsHunter の実行ファイルは別途ダウンロードが必要です。HollowsHunter は統合テストまたは手動での DLL 使用にのみ必要です。
HollowsHunter のリリースから hollows_hunter64_dll.zip, v0.4.1.1 をダウンロードしてください。DLL パッケージを使用します。ホストのアーキテクチャと API 契約が一致していれば、NativeMirror が最終生成した pe-sieve.dll が HollowsHunter で使用される元の PE-sieve DLL を置き換えます。スタンドアロンの静的実行ファイルは置き換え用 DLL を使用できません。付属の統合テストは v0.4.1.1 Win64 DLL ホストを対象としています。
手動で実行するには、パッケージ内の hollows_hunter.exe を bin/Win64/Debug にコピーし、NativeMirror でビルドした pe-sieve.dll の隣に置きます。パッケージ元の DLL を NativeMirror の DLL に上書きコピーしないでください。ホストと DLL の両方が Win64 である必要があります。
.\bin\Win64\Debug\hollows_hunter.exe /pid 1234 /quiet /hooks /ofilter 2 /json /report 7
自動比較のために、同じパッケージから変更されていない元の EXE と DLL を以下に展開します:
tests/HollowsHunterIntegration/fixtures/Win64/pe-sieve-C/
hollows_hunter.exe
pe-sieve.dll
manifest.json
既存の manifest.json を保持します。このファイルには、想定されるバージョンと SHA-256 ハッシュが記録されています。ランナーはこれらのファイルを検証し、同じホストを別々の reference ディレクトリと NativeMirror ディレクトリにコピーし、各 DLL を制御されたテストプロセスに対してテストします。ファイルのダウンロードや bin 内のビルドの上書きは行いません。
PE-sieve は PESieve_version を 32 ビットのデータ値としてエクスポートします。バージョン 0.4.1.5 の場合、その値は 0x00040105 です。呼び出し側は、エクスポートアドレスが数値を返す関数ではなく、この 4 バイトを指していることを期待します。
このプロジェクトで使用されている Delphi 12 のコンパイラ/リンカーは、exports 句を通じて変数を直接エクスポートしません。そのため、DLL にはマークされたバージョン値が含まれ、初期状態では必要な名前でヘルパー関数をエクスポートします。
リンク後、プロジェクトのビルド後イベントが以下を実行します:
py tools/NativeMirrorDll/finalize_exports.py bin/Win64/Debug/pe-sieve.dll
スクリプトは PESieve_version エクスポートエントリを保存された番号に向け、PE チェックサムを更新します。スキャナコードやその他のエクスポートターゲットは変更しません。このステップは pe-sieve.dproj のビルド時に自動的に実行され、スクリプトが失敗するとビルドも失敗します。
スクリプトはまた、バックアップとして pe-sieve.dll.before-version-export を、確定したエクスポート情報と DLL ハッシュを含む pe-sieve.dll.exports.json を作成します。テストランナー用に JSON ファイルを保持してください。通常の DLL クライアントには完成した DLL のみが必要です。Python はビルド/テストマシンで必要であり、完成した DLL の使用時には不要です。
必要なプロジェクトをビルドし、上記の参照ファイルをインストールした後、プロジェクトルートからコマンドを実行してください。
.\bin\Win64\Debug\NativeMirrorScannerTests.exe
.\bin\Win64\Debug\NativeMirrorHollowsHunterTests.exe
py tests/CLIOutput/test_source_contract.py
py tests/CLIOutput/test_cli_arguments.py
py tests/ParityAudit/run_module_cases.py
スキャナーランナーは、自身と同じ場所の bin/Win64/<Config> 内で CLI と pe-sieve64.exe を検出します。Python 比較スクリプトはデフォルトで bin/Win64/Debug を使用します。サポートされている箇所では明示的な上書きが可能です:
$env:NATIVEMIRROR_SCAN_EXE = "$PWD\bin\Win64\Debug\NativeMirrorScan.exe"
$env:PESIEVE_EXE = "$PWD\bin\Win64\Debug\pe-sieve64.exe"
$env:NATIVEMIRROR_TARGET32_EXE = "$PWD\bin\Win32\Debug\NativeMirrorTestTarget32.exe"
Source-contract テストでは、固定された PE-sieve 0.4.1.5 のソースツリーが pe-sieve-master/pe-sieve-master に必要です。C++ DLL テストでは、include/ にある元のヘッダーを使用します。これらの参照ソースは公開プロジェクトには含まれていません。
C++ DLL コントラクトテストをビルドして実行するには:
cmake -S tests/PeSieveDll -B parity-work/dll-contract-build-x64 -G "Visual Studio 17 2022" -A x64
cmake --build parity-work/dll-contract-build-x64 --config Debug
cmake -S tests/PeSieveDll -B parity-work/dll-contract-build-x86 -G "Visual Studio 17 2022" -A Win32
cmake --build parity-work/dll-contract-build-x86 --config Debug
py -m unittest discover -s tests/PeSieveDll -p test_version_export.py -v
py tests/PeSieveDll/run_contract.py --arch both
最後のコマンドには、完成した Win32 および Win64 の NativeMirror DLL、両方の CLI ビルド、および両方のテストターゲットが必要です。テスト成果物は parity-work/ の下に書き込まれ、スキャナーの診断情報はスキャナーのテストランナーの隣に書き込まれます。
ダウンロードされた参照バイナリは 0.4.1.1 です。これらとの比較はそれらのテストケースを対象とするものであり、0.4.1.5 のソース参照との完全な互換性を確立するものではありません。