C++怎么实现ETW进行进程变动监控
短信预约 -IT技能 免费直播动态提醒
本篇内容介绍了“C++怎么实现ETW进行进程变动监控”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
何为Etw
ETW(Event Tracing for Windows)提供了一种对用户层应用程序和内核层驱动创建的事件对象的跟踪记录机制。为开发者提供了一套快速、可靠、通用的一系列事件跟踪特性。
前言
一直想研究一种监控进程的方法,但wmi/枚举进程的方法,要么反应太慢,要么占用高。最近看到有人用易语言易语言完成了Etw对进程变动监控的实现。
但是一直没看到C++的实现,于是决定将易语言易语言翻译为C++。
代码
直接上翻译的代码
#include <iostream>#include <string>#include <cstring>#include <windows.h>#include <evntrace.h>#include <psapi.h>#include <direct.h>#include <evntcons.h>using namespace std;char SESSION_NAME_FILE[] = "Sample_Process";const UCHAR _Flag[] = { 173, 74, 129, 158, 4, 50, 210, 17, 154, 130, 0, 96, 8, 168, 105, 57 };EVENT_TRACE_PROPERTIES m_TraceConfig;UCHAR m_pTraceConfig[2048];char m_File[256];BOOL m_DoWhile;TRACEHANDLE m_hTraceHandle;ULONG64 m_hTraceHandle_econt[1];TRACEHANDLE m_hSessionHandle;string Unicode_To_Ansi(wstring strValue){ static CHAR sBuff[1024] = { 0 }; int iRet = WideCharToMultiByte(CP_ACP, 0, strValue.c_str(), -1, sBuff, sizeof(sBuff), NULL, NULL); if (iRet > 0) { return string(sBuff); } return "";}VOID WINAPI MyProcessRecordEvents(PEVENT_RECORD EventRecord){ switch (EventRecord->EventHeader.EventDescriptor.Id) { case 1://创建进程 cout << "创建进程!进行创建进行的进程ID:" << EventRecord->EventHeader.ProcessId << ",线程ID:" << EventRecord->EventHeader.ThreadId << ",进程SessionID:" << *(ULONG*)(((PUCHAR)EventRecord->UserData)+32)<< ",创建的进程ID:"<< *(ULONG*)(((PUCHAR)EventRecord->UserData) + 0) << ",创建的进程路径:"<< Unicode_To_Ansi( wstring((wchar_t*)(((PUCHAR)EventRecord->UserData) + 60))) <<endl; break; case 2://进程退出 cout << "进程退出!进程ID:" << EventRecord->EventHeader.ProcessId << ",线程ID:" << EventRecord->EventHeader.ThreadId << ", 进程名:"<< ((LPSTR)EventRecord->UserData) + 84 <<endl; break; cout << "进程ID:" << EventRecord->EventHeader.ProcessId << ",未知的行为:0x"<<hex<<EventRecord->EventHeader.EventDescriptor.Id << endl; default: break; }}void CloseEtw(){ ULONG l_result = StopTraceA(m_hSessionHandle, SESSION_NAME_FILE, (PEVENT_TRACE_PROPERTIES)(m_pTraceConfig + 8)); if (m_hTraceHandle != NULL) { CloseTrace(m_hTraceHandle); }}DWORD WINAPI OpenEtw(LPVOID lpThreadParameter){ m_DoWhile = TRUE; _getcwd(m_File, sizeof(m_File)); strcat(m_File, "\\MyFile.etl"); m_TraceConfig.Wnode.BufferSize = 1024; m_TraceConfig.Wnode.Flags = WNODE_FLAG_TRACED_GUID; m_TraceConfig.Wnode.ClientContext = 3; m_TraceConfig.BufferSize = 1; m_TraceConfig.MinimumBuffers = 16; m_TraceConfig.LogFileMode = EVENT_TRACE_REAL_TIME_MODE; m_TraceConfig.LoggerNameOffset = 120; m_TraceConfig.FlushTimer = 1; RtlMoveMemory(m_pTraceConfig + 8, &m_TraceConfig, 120); RtlCopyMemory(m_pTraceConfig + 128, SESSION_NAME_FILE, sizeof(SESSION_NAME_FILE)); RtlCopyMemory(m_pTraceConfig + 128 + sizeof(SESSION_NAME_FILE), m_File, strlen(m_File)); RtlCopyMemory(m_pTraceConfig + 28, _Flag, sizeof(_Flag)); ULONG l_result = StartTraceA(&m_hSessionHandle, SESSION_NAME_FILE, (PEVENT_TRACE_PROPERTIES)(m_pTraceConfig + 8)); if (m_hSessionHandle == NULL && l_result == ERROR_ACCESS_DENIED) { cout << "StartTraceA失败!原因:无管理员权限!" << endl; return 0; } else if (m_hSessionHandle == NULL && l_result == ERROR_ALREADY_EXISTS) { m_hSessionHandle = 44;//输入上一次终止时候的句柄 CloseEtw(); cout << "StartTraceA失败!原因:已经有Etw事件进行数据跟踪!请使用上方屏蔽代码关闭事件或者使用 计算机管理 停用事件:Sample_Process" << endl; ControlTraceA(m_hSessionHandle, SESSION_NAME_FILE, (PEVENT_TRACE_PROPERTIES)(m_pTraceConfig + 8), 1); return 0; } cout << "hSessionHandle: " << m_hSessionHandle << endl; const UCHAR m_ProcessGUID[] = { 214, 44, 251, 34, 123, 14, 43, 66, 160, 199, 47, 173, 31, 208, 231, 22 }; // PsProvGuid l_result = EnableTraceEx((LPCGUID)(m_ProcessGUID), 0, m_hSessionHandle, 1, 0, 16, 0, 0, 0); //这里MatchAnyKeyword的64其实是0x40,表示 #KERNEL_KEYWORDS_IMAGE EVENT_TRACE_LOGFILEA m_Logfile; ZeroMemory(&m_Logfile, sizeof(m_Logfile)); m_Logfile.LoggerName = SESSION_NAME_FILE; *((ULONG*)((PUCHAR)&m_Logfile + 20)) = 268439808; m_Logfile.EventRecordCallback = MyProcessRecordEvents; m_Logfile.Context = (PVOID)0x114514;//随便输入一个数就好了 SetLastError(0); m_hTraceHandle = OpenTraceA(&m_Logfile); cout << "开始监视!" << endl; m_hTraceHandle_econt[0] = m_hTraceHandle; ULONG rc = ProcessTrace(m_hTraceHandle_econt, 1, 0, 0); return 0;}int main(){ CreateThread(NULL, NULL, OpenEtw, NULL, NULL, NULL); //Sleep(10000); system("pause"); CloseEtw(); return 0;}
注意事项
必须给管理员权限
请正常退出(按任意键),否则Trace不会自己关
“C++怎么实现ETW进行进程变动监控”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341