通过 ETW(Windows 事件跟踪)在实时消费者中使用“Microsoft Windows 安全审核”提供程序

2023-12-20

我的任务是使用“Microsoft Windows 安全审核”提供的事件创建 ETW 实时消费者。

我基于这个例子制作了一个简单的控制器和消费者应用程序http://msdn.microsoft.com/en-us/library/windows/desktop/ee441325%28v=vs.85%29.aspx 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()”点的应用程序应等待传入事件并将其元数据写入标准输出。但事实并非如此。我生成的所有事件(即我打开详细跟踪 - 进程创建并运行应用程序)都显示在 EventViewer 中,但我的程序没有显示任何内容。

我认为这可能是一些权限问题,并使用这个例子http://msdn.microsoft.com/en-us/library/windows/desktop/aa446619%28v=vs.85%29.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/aa446619%28v=vs.85%29.aspx我设置了 SE_SECURITY_NAME 权限,当然还以管理员模式运行应用程序。但一切都没有改变。

另一种尝试是会话名称。也许这与“Windows Kernel Trace”有同样的问题,它只能记录到系统会话“NT Kernel Logger”。我发现的唯一一件事是“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 安全审核”提供商的事件?

谢谢你的帮助!

EDIT正如我在评论中所写,如果我们将会话名称设置为事件日志安全,应用程序被缩短为打开跟踪() and 进程跟踪().

EDIT 2正如卢克在评论中建议的那样,我使用本地系统权限运行我的应用程序,一切都开始工作。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 ETW(Windows 事件跟踪)在实时消费者中使用“Microsoft Windows 安全审核”提供程序 的相关文章

  • 我的 win32 程序应该在哪里保存其文件?

    我们的 win32 应用程序 用 C 编写 已经存在了 10 多年 并且尚未更新以遵循文件保存位置方面的 良好实践 应用程序默认安装在 C AppName 文件夹中 并将应用程序生成的文件 配置文件 下载的文件和保存的用户文档保存在该文件夹
  • 重叠 I/O 的 GetOverlappedResult(bWait=TRUE) 与 WaitForSingleObject()

    当我在 Win32 api 上以重叠方式打开和读取文件时 我有几种方法来完成 IO 请求 包括等待文件句柄 或重叠结构中的事件 WaitForSingleObject GetOverlappedResultbWait TRUE 这两个函数似
  • MINIDUMP_TYPE 枚举值的哪种组合将为我提供最“完整”的小型转储?

    我希望我的应用程序创建一个小型转储以帮助调试未处理的异常 在创建转储之前 我可能不知道我需要什么类型的小型转储 那么什么组合小型转储类型 http msdn microsoft com en us library ms680519 28v
  • 如何在 Spring-Security 中重命名表 persist_logins

    Spring Security 中管理 记住我 身份验证的默认表名称是 persistent logins 由于数据库命名约定 我需要重命名该表 持久登录 to T PERSISTENT LOGINS 请提供任何帮助 您需要编写自己的实现J
  • std::unique_ptr 带有 win32 LocalFree 的自定义删除器

    我有 win32 APICommandLineToArgvW它返回一个LPWSTR 和 警告我 CommandLineToArgvW分配一块连续的内存 指向参数字符串的指针 以及参数字符串的指针 他们自己 调用应用程序必须释放所使用的内存
  • 如何获取 std::wstring 的字节大小?

    我在用std wstring作为我的 Unicode 样式字符串 现在我想得到 a 的字节大小wstring 如果我使用size 的方法wstring 我只得到字符总数 在我的wstring 但字节应该是 size 2 有没有官方的方法来获
  • 从最终用户处获取 Internet Explorer 安全设置

    据报告 我们的网络应用程序存在问题 这些问题似乎只发生在一个客户的站点上 出于诊断目的 有什么方法可以让客户向您发送他们的 IE 安全自定义设置吗 例如在 IE 8 中 工具 gt Internet 选项 gt 安全选项卡 对于 Inter
  • Spring安全盐

    我试图在添加新用户 密码时添加盐 但文档似乎缺少如何执行此操作 这是一个基本示例
  • OS 和 SYS 等容易混淆的 Python 类的命名背后的原因是什么?

    我注意到 SO 中与 Python 相关的大量问题都是关于人们搞乱 Sys 类 操作系统类和无类 例如 一个容易混淆的情况是 os open something open something and sys open something 我
  • 如何以编程方式移动 Windows 任务栏?

    我想知道任何类型的 API 或解决方法 例如脚本或注册表 来将 Windows 任务栏移动 或调整大小 到另一个位置 包括另一个显示器 如果是双显示器 当然 我们可以使用鼠标来移动任务栏 但我想通过程序或某种自动化方式来移动它 我试图找到
  • 应用程序网关前面的 Azure 前门

    我已在应用程序网关的前面部署了 Azure Front Door 现在 我想通过 Front Door 路由所有流量 并限制对应用程序网关的公共 IP 地址的直接访问 怎么做 这就是我想做的 https i stack imgur com
  • ColdFusion 管理员登录和密码恢复

    我最近接手了 CF 网站的开发 但在获取 CF 管理员的登录名和密码时遇到了一些问题 我希望另一个 StackOverflower 能够对获取访问权限有一些见解 我们可以访问 FTP 和任何其他托管相关详细信息 任何有用的见解将不胜感激 打
  • PHP 5 - 保护站点管理区域的安全

    我目前正在使用 Kohana 作为框架编写几个 MVC 站点 每个都有一个简单的管理区域 管理员可以在其中上传和编辑内容 我目前正在将管理员的用户模型存储在会话中 并使用以下方法检查他们是否是管理员 private function che
  • malloc() 与 HeapAlloc()

    malloc 和 HeapAlloc 有什么区别 据我了解malloc从堆中分配内存 就像HeapAlloc一样 对吧 那么区别是什么呢 实际上 malloc 和其他 C 运行时堆函数 是模块相关的 这意味着如果您在一个模块 即 DLL 的
  • 如何检查 Windows 文件索引是否打开或关闭

    C 中是否有一个 API 可用于检查文件索引是否打开或关闭 代码受到赞赏 WMI 在 C 中是一个痛苦 但本机服务 API 非常干净 SC HANDLE hSCManager OpenSCManager NULL NULL SC MANAG
  • 打开 Access 2007 文件

    我正在尝试打开受我们客户端保护的 Access 2007 文件 当我双击它时 它显示以下错误 错误 您没有使用该对象所需的权限 让您的系统管理员或创建此对象的人员为您建立适当的权限 错误3033 在我搜索此解决方案时 我了解到它受 Wind
  • 应用程序错误:故障地址0x00012afb(专家)

    我需要一些 光 来找到解决方案 可能有很多事情会导致这个问题 但也许有人可以帮助我 场景 Windows 服务器 24 7 运行 PostgreSQL 数据库和其他服务器应用程序 用于处理数据库上的任务等 有不同的服务器场景 30 具有不同
  • ulimit -r 返回不同的值

    我将以下两行添加到系统范围的 etc security limits conf 中 soft rtprio 55 hard rtprio 55 系统重新启动后 根据我在计算机上访问用户帐户的方式 我会得到两个不同的结果 user clien
  • 从 java 反射中隐藏我的安全密钥

    下面的类是我用于加密的安全密钥提供程序 public class MySecretKey private String key 2sfdsdf7787fgrtdfg cj5 Some Util methods goes on Here 首先
  • 为什么我应该使用 $_GET 和 $_POST 而不是 $_REQUEST? [复制]

    这个问题在这里已经有答案了 除此之外 REQUEST从 cookie 读取 有什么理由我应该使用 GET and POST代替 REQUEST 这样做的理论和实践理由是什么 当我只想让用户的某些数据返回某些数据时 我使用 REQUEST 当

随机推荐