Windows ETW 无法记录清除日志事件 (1102)

问题描述

在 Windows10 19042 和 Windows Server 2012 上测试,我想使用 etw 来记录清除日志事件 (1102),但它不起作用。 我使用的项目叫krabsetw,属于微软。

目标提供程序是Microsoft-Windows-Eventlog,对应GUID {FC65DDD8-D6EF-4962-83D5-6E5CFE9CE148},这里是我的源代码

void user_trace_001::start()
{
    krabs::user_trace trace;
    krabs::provider<> provider(krabs::guid(L"{FC65DDD8-D6EF-4962-83D5-6E5CFE9CE148}"));
    provider.any(0xf8200000001e0000);
    provider.add_on_event_callback([](const EVENT_RECORD &record,const krabs::trace_context &trace_context) {
        krabs::schema schema(record,trace_context.schema_locator);
        std::wcout << L"Event " << schema.event_id();
        std::wcout << L"(" << schema.event_name() << L") received." << std::endl;
    });
    trace.enable(provider);
    trace.start();
}

它应该在获取日志时打印事件 ID 和事件名称。 到目前为止,它可以记录事件 ID 100、201、202、203、204、205,但不是我的目标 1102。

我过去清除日志的方式是使用 wevtutil 的事件查看器和命令行。

event viewer

命令行:for /F "tokens=*" %1 in ('wevtutil.exe el') DO wevtutil.exe cl "%1"

我也尝试使用 logman 来记录来自 Microsoft-Windows-Eventlog 提供程序的事件,但它也无法记录 1102。

任何建议将不胜感激!

解决方法

在逆向wevtsvc.dll后,我发现它在触发日志清除事件时没有调用任何ETW函数。 它只是尝试创建记录并将其写入 C:\Windows\System32\winevt\Logs\Security.evtx,所以这就是我们在使用 logman 或 krabsetw 时无法记录 1102 事件的原因

其实我们在ida中可以看到Channel::ClearChannelLog函数中有EventWrite、EventWriteTransfer等ETW函数。 但是,当我使用 x64dbg 附加到进程时,它并没有走到 ETW 函数的地址。