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

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

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

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

工具目录

分类

查看所有分类
Loading categories
SilentMoonwalk — 完全动态调用栈欺骗器的PoC实现 | Kitploit
工具/GitHubGitHub/klezvirus/silentmoonwalk
漏洞利用逆向工程二进制分析红队Payload 开发
GitHubklezvirus/silentmoonwalk

SilentMoonwalk

完全动态调用栈欺骗器的PoC实现

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

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

SilentMoonwalk

完全动态调用栈欺骗器的 PoC 实现

概要

SilentMoonwalk 是一个完全动态调用栈欺骗器的 PoC 实现,它实现了一种技术,用于从调用栈中移除原始调用者, 并使用 ROP 使栈展开与控制流不同步。

作者

本 PoC 是有关栈欺骗主题的联合研究成果。该研究的作者是:

  • KlezVirus
  • Waldo-IRC
  • Trickster0

我想强调,如果没有 Waldo-IRC 和 Trickster0 的工作,这项工作将不可能完成,他们两人都 为 PoC 的早期阶段以及背后的研究做出了贡献。

概述

该仓库演示了一个 PoC 实现,用于在调用任意 Windows API 时欺骗调用栈。

此尝试受到 这条 Twitter 帖子 和 这条 Twitter 帖子 的启发,大师 namazso 在其中展示并建议 使用 ROP 链扩展栈展开方法,从而使展开与实际控制流不同步,并在之后恢复原始栈。

本 PoC 尝试实现与上述类似的功能,并使用一个不同步栈来完全隐藏原始 调用栈,同时从中移除 EXE 映像基址。返回时,会调用一个 ROP gadget 来恢复原始栈。 在代码中,此过程在循环中重复 10 次,每次迭代使用不同的帧,以证明稳定性。

支持的模式

该工具当前支持两种模式,其中一种实际上是对已识别出的无法工作的 pop RBP 帧的错误修补,它通过偏移当前 RSP 并向调用栈添加两个虚假帧来工作。由于它使用合成帧操作,我将这种模式称为“合成(SYNTHETIC)”模式。

当选择通过从栈中弹出 RBP 寄存器来展开的帧时,工具可能会选择一个不合适的帧,导致调用栈被 突然截断,如下所示。

Windows 10 调用栈 - 截断

合成调用栈模式

针对该问题的一个简单解决方案是创建两个虚假帧,并将它们链接回被截断的调用栈。这将创建一种看似合法的调用栈, 即使没有合适的通过调用 POP RBP 来展开的帧,但:

  • 你会失去不同步技术的优势
  • 栈仍然可以被展开
  • 生成的调用栈乍一看可能看起来合法,但很可能无法通过严格检查

_合成欺骗的结果如下图所示:

Windows 10 调用栈 - 看似合法,不可展开 - getchar

图 1:Windows 10 - 看似合法、不可展开的调用栈,其中 EXE 模块已被完全移除(调用无参数的函数 getchar)

注意:此操作模式默认禁用。要启用此模式,请将 CALLSTACK_TYPE 更改为 1

不同步栈模式

该模式是上述问题的正确解决方案,即不合适的帧被另一个合适的帧替换。

Windows 10 调用栈 - 合法,可展开 - MessageBoxExA

图 2:Windows 10 - 合法、可展开的调用栈,其中 EXE 模块已被完全移除(调用带 4 个参数的函数 MessageBoxA)

工具

在仓库中,您还可以找到一个检查运行时函数的小工具,它可能对分析运行时函数条目有用。

root@kitploit:~
UnwindInspector.exe -h

 Unwind Inspector v0.100000

 必需参数:
   -m <模块>: 目标 DLL
   -f <函数>: 目标函数
   -a <函数地址>: 目标函数地址

示例输出:

root@kitploit:~
UnwindInspector.exe -m kernelbase -a 0x7FFAAE12182C
[*] 使用函数地址 0x7ffaae12182c

  运行时函数 (0x000000000000182C, 0x00000000000019ED)
  展开信息地址: 0x000000000026AA88
    版本: 0
    版本 + 标志: 00000000
    SizeOfProlog: 0x1f
    CountOfCodes: 0xc
    FrameRegister: 0x0
    FrameOffset: 0x0
    展开码:
    [00h] 帧: 0x741f - 0x04  - UWOP_SAVE_NONVOL     (RDI, 0x001f)
    [01h] 帧: 0x0015 - 0x00  - UWOP_PUSH_NONVOL     (RAX, 0x0015)
    [02h] 帧: 0x641f - 0x04  - UWOP_SAVE_NONVOL     (RSI, 0x001f)
    [03h] 帧: 0x0014 - 0x00  - UWOP_PUSH_NONVOL     (RAX, 0x0014)
    [04h] 帧: 0x341f - 0x04  - UWOP_SAVE_NONVOL     (RBX, 0x001f)
    [05h] 帧: 0x0012 - 0x00  - UWOP_PUSH_NONVOL     (RAX, 0x0012)
    [06h] 帧: 0xb21f - 0x02  - UWOP_ALLOC_SMALL     (R11, 0x001f)
    [07h] 帧: 0xf018 - 0x00  - UWOP_PUSH_NONVOL     (R15, 0x0018)
    [08h] 帧: 0xe016 - 0x00  - UWOP_PUSH_NONVOL     (R14, 0x0016)
    [09h] 帧: 0xd014 - 0x00  - UWOP_PUSH_NONVOL     (R13, 0x0014)
    [0ah] 帧: 0xc012 - 0x00  - UWOP_PUSH_NONVOL     (R12, 0x0012)
    [0bh] 帧: 0x5010 - 0x00  - UWOP_PUSH_NONVOL     (RBP, 0x0010)

构建

为了构建 PoC 并观察到与图片中类似的行为,请确保:

  • 禁用 GS 安全缓冲(/GS-)
  • 禁用代码优化(/Od)
  • 禁用全程序优化(移除 /GL)
  • 禁用大小和速度优化(移除 /Os、/Ot)
  • 启用 内联函数(如果尚未禁用)(/Oi)

先前工作

值得提及在此主题上的先前工作,这些工作奠定了本项目的基础。

  • 返回地址欺骗:原始技术与想法,由 Namaszo 提出。我所知的每一个其他 PoC 都建立在此基础上。
  • YouMayPasser:Arash 的出色工作,是 Namaszo 返回地址欺骗 PoC 的第一个正确扩展。
  • VulcanRaven:一个调用栈欺骗器,通过合成创建线程栈并镜像另一个真实调用栈来进行欺骗。
  • Unwinder:一个非常棒的 Rust PoC 实现,通过解析展开代码信息来替换调用栈中的帧。

致谢

  • 特别感谢 waldo-irc 和 trickster0,他们与我合作进行了这项研究。我的一切都归功于他们。
  • 所有创意的功劳归功于 namaszo,我个人认为他是一位天才。他还在发布前交叉检查了这个 PoC,因此非常感谢他。

注意事项

  • [仅合成栈]:由于我定位 gadgets 的方式存在限制,目前最大参数数量为 8(修改并添加更多参数非常简单,但我懒得做)。
  • [仅不同步栈]:由于我设置欺骗器的方式存在限制,目前支持的最大参数数量为 4。
  • 对此的测试非常有限。可能存在我现在尚未意识到的异常。
  • 涉及 128 位寄存器的展开尚未测试。
  • 不支持调用使用 128 位寄存器的函数。
下载工具