我们有一个系统,其中一些恶意代码可能通过调用 Win32 API 中的 Beep() 函数来发出任意蜂鸣声
我需要找出哪个可执行文件执行此操作,并希望使用 ETW 来实现此目的。到目前为止,我可以发现实际的蜂鸣声是由 Windows taskhostw.exe 执行的,这让我不知道哪个应用程序最初启动了蜂鸣声。
有什么方法可以找出是谁首先调用了 Beep() 吗?这是在客户系统上,因此禁止与 UI 进行任何交互,它必须是一些后台跟踪收集...
我正在使用一个非常小的测试程序 TestBeep.exe 进行测试,我想在我的 ETW 数据中看到 TestBeep.exe 开始发出蜂鸣声...
#include <iostream>
#include <windows.h>
#include <utilapiset.h>
int main()
{
std::cout << "Beeping now...\n";
Beep(440, 1000);
std::cout << "done.\n";
return 0;
}
您可以检查谁打开了 Beep Device (\Device\Beep),这是一个文件。您可以启用句柄跟踪并可能按句柄类型进行过滤。但是,通过在没有任何堆栈的情况下启用句柄跟踪来查找谁打开了 Beep 设备,您应该可以走得更远。我最新版本的 ETWController 还可以按句柄类型进行过滤:https://github.com/Alois-xx/etwcontroller/releases/tag/2.5.2这是一个独特的功能。
这些设置应该在 ETWController 内起作用:
如果无法按句柄类型进行过滤,则应删除堆栈遍历事件,以至少了解何时以及哪个进程调用了蜂鸣声。通过稍后添加一些 CPU 采样,您应该能够知道该进程在该时间点正在做什么。