【问题标题】:Recording Syscalls in windows在 Windows 中记录系统调用
【发布时间】:2025-12-14 00:10:01
【问题描述】:

我一直在寻找在 Windows 上实时获取系统调用的方法。我已经在 * 和其他地方查看了几篇文章,但找不到任何容易理解的内容。我看过 procmon 但它的输出非常不稳定。两个系统上的相同二进制文件生成了不同数量的条目。也许我缺乏做这些事情的先决条件。欢迎任何帮助/建议。

我之前看过这些链接:

问候

【问题讨论】:

  • 你到底想做什么?您想调用 NT 子系统,还是监视活动?如果是前者,那么您提供的三个链接是一个很好的起点。如果是后者,那么我会建议procmon。我希望它在不同的系统上提供不同的输出,甚至在同一系统上多次运行同一程序时提供不同的输出,具体取决于系统的状态和运行它时的程序。
  • 其实我想监控/记录系统调用。 Procmon 是出色的工具,但正如您所提到的,它的输出再次不稳定。我想知道为什么它不稳定,我怎样才能让它稳定。此外,为了让图片更清晰,我正在尝试将 printf、getche 等 C 函数映射到 Windows 生成的系统调用。
  • 要真正监控系统调用,您需要在内核模式下修补系统调用条目表。这是危险和困难的,尤其是在 64 位版本的 Windows 中,以阻止 ISV 这样做。像 printf 这样的 C 函数在用户模式下处理,并且在它们到达输出之前不涉及系统调用,这可能是对 CSRSS 的进程外 LPC 调用或文件写入,具体取决于是否连接了真正的控制台。这将更有帮助知道你想要完成什么。

标签: windows winapi system-calls


【解决方案1】:

根据您使用的 Windows 版本,您的问题的答案可能是 Windows 事件跟踪 (ETW),它可以进行系统调用日志记录 [link]

【讨论】:

    【解决方案2】:

    如果您对抽样方法感到满意,那么您可以试试这个:

    typedef struct _THREAD_LAST_SYSCALL_INFORMATION
    {
        PVOID FirstArgument;
        USHORT SystemCallNumber;
    
    } THREAD_LAST_SYSCALL_INFORMATION, *PTHREAD_LAST_SYSCALL_INFORMATION;
    
    THREAD_LAST_SYSCALL_INFORMATION lastSystemCall;
    NtQueryInformationThread(
        hThread,
        ThreadLastSystemCall,
        &lastSystemCall,
        sizeof(THREAD_LAST_SYSCALL_INFORMATION),
        NULL
    );
    

    在哪里ThreadLastSystemCall = 21

    【讨论】: