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

Windows ETW cannot log clear log event (1102)

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

目标提供者是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后发现在触发log clear事件的时候并没有调用任何ETW函数。 它只是尝试创建一条记录并将其写入 C:\Windows\System32\winevt\Logs\Security.evtx,这就是为什么我们在使用 logman 或 krabsetw

时无法记录 1102 事件的原因

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