
この Rust ライブラリおよび CLI ツールは、プロセス環境ブロック (PEB) ウォークを使用せずに、読み込まれた DLL のベースアドレスを検出する代替手法を示します。この手法は、PEB ウォークが検出またはブロックされる可能性があるシナリオで特に有用です。
このリポジトリには、異なるアプローチを持つ 2 つのブランチが含まれています:
winapi クレートと VirtualQuery を使用lib.rs) には、クリーンな統合のための print ステートメントなしmain.rs) には、概念実証のためのデバッグ出力が含まれるVirtualQuery の代わりに例外処理を伴う直接メモリアクセスを使用どちらのブランチも安全に使用できますが、OPSEC ブランチは、API 呼び出しが監視またはブロックされる可能性があるシナリオに対して、追加の運用セキュリティ上の利点を提供します。
このプログラムは、スタックウォーキング方式を使用して DLL を特定します:
スレッド環境ブロック (TEB) へのアクセス:
スタックウォーキング:
VirtualQuery を使用してメモリ領域を検証するモジュールの特定:
検証:
DLL を検出する従来の方法では、多くの場合 PEB のモジュールリストを走査します。効果的ではありますが、このアプローチは以下の可能性があります:
このスタックウォーキング方式は、以下の代替手段を提供します:
winapi クレートCargo.toml に追加します:
メインブランチ:
[dependencies]
moonwalk = { git = "https://github.com/Teach2Breach/moonwalk.git" }
OPSEC ブランチ:
[dependencies]
moonwalk = { git = "https://github.com/Teach2Breach/moonwalk.git", branch = "opsec" }
コードでの使用例:
use moonwalk::find_dll_base;
fn main() {
// Find ntdll.dll
if let Some(ntdll_base) = find_dll_base("ntdll.dll") {
println!("ntdll.dll base: 0x{:X}", ntdll_base);
}
// Case-insensitive, .dll extension optional
if let Some(kernel32_base) = find_dll_base("KeRNEl32") {
println!("kernel32.dll base: 0x{:X}", kernel32_base);
}
}
ビルド:
cargo build --release
実行:
# Find ntdll.dll (default)
cargo run --release
# Find specific DLL (case insensitive, .dll extension optional)
cargo run --release kernel32.dll
cargo run --release KeRNEl32
cargo run --release USER32
print ステートメントは含まれなくなりました。この画像は教育目的で含まれています。

VirtualQuery を使用します