另见 http://rogerorr.github.io/NtTrace/
您需要 64 位或 32 位版本的 NtTrace(或两者),具体取决于您的目标应用程序
scripts\build-vs-x64.bat 或 scripts\build-vs-x86.bat 分别生成 64 位或 32 位版本。或者
nmake /f NtTrace.mak或者
nmake /f NtTrace.makNtTrace 设计为从命令行运行。
它可以用于执行一个程序,并在需要时传递参数。
例如:
NtTrace -filter File cmd /c echo hello
或通过按 PID 附加到现有进程,或使用 -a 选项按名称附加。
例如:
NtTrace 1234
或
NtTrace -a notepad
运行 NtTrace -h 查看完整的选项列表。
默认情况下,NtTrace 针对通过 NtDll.dll 公开的 Windows 原生 API。
还提供了许多支持 Windows 图形界面的入口点的配置文件:
Gdi32Trace.cfg 用于图形设备接口
User32Trace.cfg 用于用户界面
您可以通过使用 -config 命令行参数来选择其中之一,而不是默认的 NtTrace.cfg。
Windows 在 system32 目录中附带了 DbgHelp.dll。 然而,Microsoft 有时会在其 SDK 中提供此 DLL 的更新版本。
随操作系统安装的 DLL 版本往往优先于可能下载的新版本。
如果您发现需要比系统目录中安装的版本更新的版本,您只需将较新的 DbgHelp.dll 复制到 NtTrace.exe 所在的同一目录中。
(您还需要复制 SymSrv.dll 和 SrcSrv.dll)
NtTrace 通过使用 Windows 调试接口在 NtDll 中围绕进入内核的原生 Windows 调用设置断点来工作。 每次命中断点时,NtTrace 会读取传递给关联调用的参数/返回值。
它在用户级别工作,仅影响特定进程(及其子进程)。不尝试进入内核。 这是一个有意的设计决策,因为这意味着该工具可以在无需管理员权限或安装设备驱动程序许可的情况下使用。 然而,这也意味着该工具不会捕获:
NtTrace 默认还会跟踪初始进程的子进程,-pid 选项会向每行输出添加进程 ID,以帮助识别哪个进程进行了哪些调用。-only 选项会抑制对子进程的跟踪。
它还处理多线程应用程序(-tid 选项有助于识别哪个线程在进行每个调用)。
但是请注意,由于 Windows 调试接口是基于事件的,如果多个线程同时进行调用,跟踪将被序列化。
默认情况下,跟踪 NtDll 中的调用;Gdi32 和 User32 的配置文件会选择不同的目标 DLL。 NtTrace 目前不支持同时跟踪不同类型的系统调用。
原生调用的配置保存在 NtTrace.cfg 中,该文件在程序启动时被解析。 请注意,不同版本的 Windows 支持不同的调用集。
部分原生函数由 Microsoft 正式记录,但许多未记录。 (几乎)完整的列表是通过对函数的侦查工作以及从 ReactOS 等网站的组合得出的。
每个函数被分配到一个类别,可以通过函数名(部分匹配)和函数类别进行过滤。
默认情况下,NtTrace 在系统调用返回时进行跟踪,但可以使用 -pre 选项在调用之前也进行跟踪。
例如,当同一个结构体用于请求和响应缓冲区时,这可能会很有用。