我的任务是使用“Microsoft Windows安全审计”提供的事件建立一个ETW实时消费者。
我基于这个例子制作了一个简单的控制器和消费者应用程序http://msdn.microsoft.com/en-us/library/windows/desktop/ee441325%28v=vs.85%29.aspx 并更改标志以在实时模式下工作。
主要功能看起来像这样:
LPTSTR SessionName = L"hahahaaa";
ULONG status = ERROR_SUCCESS;
PEVENT_TRACE_PROPERTIES pSessionProperties = NULL;
EVENT_TRACE_LOGFILE trace;
TRACEHANDLE hTrace = 0;
TRACEHANDLE hSession = 0;
const GUID providerId = { 0x54849625, 0x5478, 0x4994, { 0xA5, 0xBA, 0x3E, 0x3B, 0x03, 0x28, 0xC3, 0x0D } };
//const GUID providerId = { 0xA68CA8B7, 0x004F, 0xD7B6, { 0xA6, 0x98, 0x07, 0xE2, 0xDE, 0x0F, 0x1F, 0x5D } };
HANDLE hToken = NULL;
HANDLE hProcess = NULL;
hProcess = GetCurrentProcess();
if (OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken) == FALSE) {
printf("Error: Couldn't open the process token\n");
goto cleanup;
}
if(!SetPrivilege(hToken, SE_SECURITY_NAME, TRUE)) goto cleanup;
if (!pSessionProperties) {
const size_t buffSize = sizeof(EVENT_TRACE_PROPERTIES)+(_tcslen(SessionName) + 1) * sizeof(TCHAR);
pSessionProperties = reinterpret_cast<EVENT_TRACE_PROPERTIES *>(malloc(buffSize));
ZeroMemory(pSessionProperties, buffSize);
pSessionProperties->Wnode.BufferSize = buffSize;
pSessionProperties->Wnode.ClientContext = 1;
pSessionProperties->Wnode.Flags = WNODE_FLAG_TRACED_GUID;
pSessionProperties->LogFileMode = EVENT_TRACE_REAL_TIME_MODE;
pSessionProperties->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
}
// Create the trace session.
status = StartTrace(&hSession, SessionName, pSessionProperties);
if (ERROR_SUCCESS != status) {
wprintf(L"StartTrace() failed with %lu\n", status);
goto cleanup;
}
status = EnableTraceEx2(hSession, &providerId, EVENT_CONTROL_CODE_ENABLE_PROVIDER, TRACE_LEVEL_VERBOSE, 0, 0, 0, NULL);
if (ERROR_SUCCESS != status) {
wprintf(L"EnableTrace() failed with %lu\n", status);
goto cleanup;
}
ZeroMemory(&trace, sizeof(EVENT_TRACE_LOGFILE));
trace.LogFileName = NULL;
trace.LoggerName = SessionName;
trace.CurrentTime = 0;
trace.BuffersRead = 0;
trace.BufferSize = 0;
trace.Filled = 0;
trace.EventsLost = 0;
trace.Context = NULL;
trace.ProcessTraceMode = PROCESS_TRACE_MODE_REAL_TIME | PROCESS_TRACE_MODE_EVENT_RECORD;
trace.EventRecordCallback = (PEVENT_RECORD_CALLBACK)(ProcessEvent);
hTrace = OpenTrace(&trace);
if (INVALID_PROCESSTRACE_HANDLE == hTrace)
{
wprintf(L"OpenTrace failed with %lu\n", GetLastError());
goto cleanup;
}
status = ProcessTrace(&hTrace, 1, 0, 0);
if (status != ERROR_SUCCESS && status != ERROR_CANCELLED)
{
wprintf(L"ProcessTrace failed with %lu\n", status);
goto cleanup;
}
'ProcessTrace()'点的应用程序应该等待传入的事件并写入stdout他们的元数据。但它根本就没有。我在EventViewer中显示了所有由我生成的事件(即我打开详细跟踪 - 进程创建并运行应用程序),但我的程序没有显示任何内容。
我认为这可能是某些特权问题,并且使用此示例http://msdn.microsoft.com/en-us/library/windows/desktop/aa446619%28v=vs.85%29.aspx我设置了SE_SECURITY_NAME权限,当然还是以管理员模式运行应用程序。但没有改变。
另一个尝试是会话名称。也许它与“Windows内核跟踪”的问题相同,它只能记录到系统会话“NT内核记录器”。我发现的只是“Microsoft Windows安全审计”与“Eventlog-Security”会话相关联,但是当我设置会话名称时,我收到了“拒绝访问”错误。我不知道应该设置哪个额外的权限来处理这个问题。
最后一次尝试是使用'logman'并将事件收集到一个文件中,但一切都是一样的。当我通过'Eventlog-Security'设置会话名称时,我收到了“拒绝访问”。另一方面,当我通过其他东西设置它时,我只收到一个由'MSNT_SystemTrace'提供的事件,这是其他事件的抽象类。
如果我将提供者更改为“Microsoft Windows Kernel General”(评论GUID)并生成事件(更新系统时钟),一切正常(在我的应用程序中并使用“logman”)。
我在Windows 7 Professional x64和Visual Studio Ultimate 2013中工作。
我的问题是,如何从“Microsoft Windows安全审核”提供商处接收活动?
感谢您的帮助!
修改 正如我在评论中写的那样,如果我们在 Eventlog-Security 上设置SessionName,则应用程序将缩短为 OpenTrace()和 ProcessTrace()。< / p>
编辑2 正如Luke在评论中建议的那样,我使用LocalSystem权限运行我的应用程序,一切都开始工作了。