这个 Rust 库和 CLI 工具演示了一种无需遍历进程环境块(PEB)即可查找已加载 DLL 基址的替代方法。该技术特别适用于 PEB 遍历可能被检测或阻止的场景。
本仓库包含两个采用不同方法的分支:
winapi crate 和 VirtualQuery 进行内存验证lib.rs)没有打印语句,便于干净集成main.rs)包含用于概念验证的调试输出VirtualQuery两个分支都可以安全使用,但 OPSEC 分支在 API 调用可能被监控或阻止的场景中提供了额外的操作安全性优势。
该程序通过堆栈遍历方法来定位 DLL:
访问线程环境块(TEB):
堆栈遍历:
VirtualQuery 验证内存区域模块识别:
验证:
传统查找 DLL 的方法通常涉及遍历 PEB 的模块列表。虽然有效,但这种方法可能:
这种堆栈遍历方法提供了一种替代方案,它:
winapi crate添加到你的 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
已不再包含打印语句。此图片仅用于教学目的。

VirtualQuery 进行安全的内存访问验证