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

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

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

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

工具目录

分类

查看所有分类
Loading categories
STrace — A DTrace on Windows Reimplementation | Kitploit
工具/GitHubGitHub/mandiant/strace
Dynamic Code Analysis (DAST)Reverse EngineeringDebuggersMalware AnalysisIncident Response
GitHubmandiant/strace

STrace

A DTrace on Windows Reimplementation

查看仓库
375522个月前Kitploit 审核通过

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

STrace

Steve's Tracer。DTrace on Windows 系统调用钩子的重新实现。可以将其看作一个兼容 PatchGuard 的 SSDT 钩子,但无需任何破解手段。它不支持 SSSDT(win32k API),因为 DTrace 系统调用 API 本身就不支持这个附加表。除了所有用户态 SSDT 系统调用之外,还可以跟踪 Zw* 内核 API。

如果你正在为 STrace 开发新插件,请务必读完整篇 README!

功能

Windows 上的 DTrace 支持多种探针类型,包括 syscall、fbt、etw、profile 等。此重新实现只重新实现了 syscall 和 etw 探针类型。所有其他探针类型都被视为完全不在本项目范围内,并且将永远不会被支持。如果你想添加其他探针类型,请随意 fork 本项目。范围仅限于 syscall 和 etw 探针,是因为其他探针类型及其所涉及的系统过于复杂。

此重新实现完全抛弃了 D 脚本语言(注意:不是更流行的现代语言 DLang)。像原始 DTrace 实现那样在内核中构建一个 VM,其复杂度不适合本项目。相反,本实现直接暴露了接入 DTrace Windows 内核接口所需的相关 C 回调。为了实现脚本的“热加载”,本项目使用了一个基于 DLL 的插件系统,以替代原始 DTrace 的 VM + 脚本环境。该插件系统接受一个“普通”的用户态 DLL,不启用任何安全检查,也没有外部依赖,并将其手动映射到内核地址空间。plugin dll 带有导出函数,在内核系统调用回调发生时被调用。内核 API 通过 DLL 正常的导入表(IAT)解析。插件 DLL 链接 ntoskrnl.lib,驱动在加载时解析这些 API,从而允许在插件 DLL 中像平常一样调用任何系统 API。这个插件系统的性能非常出色,因为在 syscall ENTRY 与 RETURN 之间直接执行的是原生代码,而不是脚本解释器或 JIT。与微软提供的 DTrace 实现相比,这种设计提升了性能。

设置钩子非常简单:你有一个按 API 名称注册/注销钩子的例程,并带有系统调用前(pre)和系统调用后(post)回调。回调的参数和返回值以只读形式访问。返回值可以在 return 探针中被伪造,参数可以在 entry 探针中被修改,但通常无法替换或“取消”原始系统调用——这个 API 充当观察者。不过,确实存在一个与 (https://github.com/everdox/InfinityHook 和 https://github.com/everdox/InfinityHook/raw/master/resources/perf.png) 中记载的类似缺陷,它允许替换栈上的系统调用指针。借助这个缺陷,可以完全替换一个系统调用,改为指向你所控制例程的指针。当事件发生、你的钩子回调被触发时,你想做什么都可以。回调是同步的,也就是说,如果你在 entry 回调中延迟执行(例如在 while 循环中空转),那么系统调用的时间也会被延迟同样的时长。系统调用的执行发生在 entry 回调返回之后、进入 return 回调之前。该系统与 PatchGuard 完全兼容,但必须禁用 DSE,因为微软不幸地将此类内核扩展视为 NT 内核的一部分,因此会验证根签名者是否为 Windows。这_不_适用于启用自定义内核签名者之类的技巧,DSE 必须在内核启动期间确实处于关闭状态。

root@kitploit:~
ValidationFlags=IMGP_LATEST_MS_ROOT_REQUIRED | IMGP_WINDOWS_ROOT_REQUIRED | IMGP_MS_SIGNATURE_REQUIRED 
Scenario=ImgSigningScenarioWindows

Rust 驱动抛弃了 C++ 驱动使用的基于 DLL 的插件系统,而是尝试使用 WebAssembly 解释器在 Windows 内核中托管 wasm 脚本。这是为了更接近原始 DTrace 实现(其使用 VM),但使用比 DLang 更好的语言。这提供了沙箱和其他不错的好处。POC 已完成并且可以工作,但遗憾的是,由于使用 WASMI 解释 WASM 存在性能问题,目前尚不可用。要让这种替代设计可行,需要一款兼容 NT 内核、基于 JIT 的 wasm 引擎。它作为一个有趣的新奇玩意儿被包含在内,稍加改造或许还能用于其他用途。

项目结构

本项目主要分为 C++ 和 Rust 组件两部分。C 驱动功能完备,应优先选用。从高层次看,项目包含以下组件:

  • 基于 DLL 插件的 C++ 驱动
  • 基于 wasm 脚本插件的 Rust 驱动
  • 用于监视文件删除的 C++ DLL 插件
  • 用于记录所有系统调用及其参数的 C++ DLL 插件
  • 用于测试 wasm 在 NT 内核中 POC 的 Rust Wasm 脚本插件
  • 用于在用户态模拟执行 wasm 插件的 Rust Wasm 脚本测试器
  • 用于对 C++ 驱动栈跟踪进行符号化的 Rust 日志符号化器。不使用 DIA SDK。

安装与设置

设置带 DDK 的 Visual Studio

  • 按顺序安装 VS2022 + Windows SDK + Windows DDK,且 SDK 与 WDK 的构建号要匹配。参见 https://learn.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk#download-icon-for-visual-studio-step-1-install-visual-studio-2022
  • 将 STrace 驱动项目的 Windows SDK 设置改为已安装的 WDK 版本。STrace->Properties->General->Windows SDK Version(你的 WDK 构建号)。

构建驱动和 CLI,将文件移动到与脚本相同的文件夹中,然后以管理员身份运行 install 文件夹中的 PowerShell 脚本:

root@kitploit:~
./install_as_admin.ps1

重启后,选择 STrace 启动项,然后在该屏幕上按 F8(不是回车!):

f8

这应该会显示此屏幕,选择禁用 DSE 的启动项:

DSE

成功启动后,可以使用 CLI 加载和卸载插件 DLL 以开始跟踪。提供了两个示例插件。如果遇到问题,请仔细阅读下面的详细信息。第一次使用时,你可能需要再次重启,并且可能需要使用 Process Hacker 之类的工具手动将 STrace 服务设置为 at boot 自动启动。

安装细节

原始 DTrace 的安装说明在这里:https://techcommunity.microsoft.com/t5/windows-kernel-internals/dtrace-on-windows-20h1-updates/ba-p/1127929。原始 DTrace 需要配置安全启动(Secure Boot)和基于虚拟化的安全(Virtualized Based Security),STrace 则不需要,因为它没有实现需要这些功能的探针类型(FBT)。

本项目执行与安装程序相同的操作,但通过一个简单的 PowerShell 脚本而不是 MSI 来完成。过程很简单。首先将一个 apiset DLL 复制到 system32,以激活内核扩展。然后安装一个驱动入口,使驱动主程序在系统启动时被执行,用于用户态通信。ApiSet DLL 都是数字签名的,因此按要求使用了微软原始的 apiset。该文件仅以二进制形式提供,除了将扩展导入指向实现驱动 ext-ms-win-ntos-trace-l1-1-0 -> dtrace.sys 之外,不包含任何逻辑。有关此机制的详细信息,请参见 https://www.geoffchappell.com/studies/windows/win32/apisetschema/index.htm(ApiSetSchemaExtensions)。

STrace 在内核初始化期间很早就被加载,在启动配置数据库(BCD)中启用测试签名(Test Signing)_并不_足够。为了 STrace 能成功加载,必须禁用驱动程序签名强制(DSE),而且每次启动都必须手动操作。为方便起见,安装脚本创建了一个易于选择的启动菜单项。没有 BCD 标志可以允许在重启后永久禁用 DSE,内核明确禁止这样做。

启动时忘记禁用 DSE,重启后就会进入自动修复菜单。你可以无风险地再试一次;如果启动持续失败,则需要手动从 drivers 文件夹中删除 STrace 驱动。请注意,启动失败可能导致 Windows 禁用 STrace 服务的自动运行标志*,如果任何时候发生启动失败,你可能需要将其重新设为自动运行。

插件

要开发自己的插件,最好以现有插件之一作为基础项目。Visual Studio 项目设置了大量非常特定的选项,以生成没有依赖关系的独立二进制文件。非默认设置太多,无法一一列举,因此只需复制其中一个项目,然后修改代码以添加你自己的逻辑即可(https://stackoverflow.com/questions/884255/visual-studio-copy-project)。**如果你创建了有用的插件,请提交 PR**!插件越多,这个系统对每个人都越有用!

下载工具