Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
moonwalk — 无需PEB遍历即可查找DLL基地址 | Kitploit
工具/GitHubGitHub/teach2breach/moonwalk
后渗透利用二进制分析学习与教育红队Payload 开发
GitHubteach2breach/moonwalk

moonwalk

无需PEB遍历即可查找DLL基地址

查看仓库
170211年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

moonwalk:DLL 基址查找器

这个 Rust 库和 CLI 工具演示了一种无需遍历进程环境块(PEB)即可查找已加载 DLL 基址的替代方法。该技术特别适用于 PEB 遍历可能被检测或阻止的场景。

分支差异

本仓库包含两个采用不同方法的分支:

主分支

  • 使用 winapi crate 和 VirtualQuery 进行内存验证
  • 库函数(lib.rs)没有打印语句,便于干净集成
  • CLI 工具(main.rs)包含用于概念验证的调试输出
  • 适合学习和理解该技术

OPSEC 分支

  • 无外部依赖 - 完全自包含
  • 不调用 Windows API - 使用带异常处理的直接内存访问,而不是 VirtualQuery
  • 库函数中没有打印语句
  • 增强隐蔽性 - 不进行任何 API 调用
  • 更适合植入体/工具 - 留下更少痕迹,更难被检测

两个分支都可以安全使用,但 OPSEC 分支在 API 调用可能被监控或阻止的场景中提供了额外的操作安全性优势。

工作原理

该程序通过堆栈遍历方法来定位 DLL:

  1. 访问线程环境块(TEB):

    • 使用内联汇编从 GS 段寄存器(GS:[0x30])读取 TEB 指针
    • 从 TEB 获取堆栈基址(GS:[0x08])和堆栈限制(GS:[0x10])
  2. 堆栈遍历:

    • 从当前堆栈指针(RSP)开始
    • 向上遍历堆栈查找返回地址
    • 检查每个地址是否为可执行内存
    • 主分支:使用 VirtualQuery 验证内存区域
    • OPSEC 分支:使用带异常处理的直接内存访问
  3. 模块识别:

    • 对每个潜在的返回地址,检查其是否指向可执行内存
    • 找到可执行内存后,向前回溯以查找 PE 头
    • 通过检查以下内容验证模块:
      • MZ 签名(DOS 头)
      • PE 签名
      • DLL 特征
      • 64 位架构
      • 导出目录中的模块名称
  4. 验证:

    • 通过检查导出目录中的名称,验证模块是否为目标 DLL
    • 确认所有 PE 头结构均有效

为什么采用这种方法?

传统查找 DLL 的方法通常涉及遍历 PEB 的模块列表。虽然有效,但这种方法可能:

  • 被安全软件检测到
  • 在某些环境中被阻止

这种堆栈遍历方法提供了一种替代方案,它:

  • 不依赖 PEB
  • 可在 PEB 遍历被阻止的环境中工作
  • OPSEC 分支:不进行任何 API 调用

要求

  • Rust(nightly 工具链)
  • Windows x64
  • 主分支:winapi crate
  • OPSEC 分支:无外部依赖

使用方法

作为库使用

添加到你的 Cargo.toml:

主分支:

root@kitploit:~
[dependencies]
moonwalk = { git = "https://github.com/Teach2Breach/moonwalk.git" }

OPSEC 分支:

root@kitploit:~
[dependencies]
moonwalk = { git = "https://github.com/Teach2Breach/moonwalk.git", branch = "opsec" }

在你的代码中的示例用法:

root@kitploit:~
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);
    }
}

作为 CLI 工具使用

构建:

root@kitploit:~
cargo build --release

运行:

root@kitploit:~
# 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

示例

已不再包含打印语句。此图片仅用于教学目的。

Moonwalk DLL Base Address Finder Demo

注意事项

  • DLL 名称不区分大小写,.dll 扩展名可省略
  • 仅适用于调用堆栈中的 DLL
  • 主分支:使用 VirtualQuery 进行安全的内存访问验证
  • OPSEC 分支:使用带异常处理的直接内存访问以获得最大隐蔽性
  • 两个分支都具有干净的库接口,无调试输出
下载工具