返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++怎么实现ETW进行进程变动监控
  • 720
分享到

C++怎么实现ETW进行进程变动监控

2023-07-02 17:07:40 720人浏览 薄情痞子
摘要

本篇内容介绍了“c++怎么实现ETW进行进程变动监控”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!何为EtwETW(Event Tracin

本篇内容介绍了“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进行进程变动监控”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: C++怎么实现ETW进行进程变动监控

本文链接: https://lsjlt.com/news/343352.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++怎么实现ETW进行进程变动监控
    本篇内容介绍了“C++怎么实现ETW进行进程变动监控”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!何为EtwETW(Event Tracin...
    99+
    2023-07-02
  • C++实现ETW进行进程变动监控详解
    目录何为Etw前言代码何为Etw ETW(Event Tracing for Windows)提供了一种对用户层应用程序和内核层驱动创建的事件对象的跟踪记录机制。为开发者提供了一套快...
    99+
    2024-04-02
  • python守护进程监控子进程怎么实现
    在Python中,可以使用multiprocessing模块来创建子进程并监控它们。具体实现方法如下: 导入multiproces...
    99+
    2023-10-23
    python
  • Linux中pstree怎么监控进程活动
    在Linux中,您可以使用pstree命令来监控进程活动。pstree命令可以显示当前系统中所有进程的层次结构,以及它们之间的关系。...
    99+
    2024-04-02
  • golang进程监控如何实现
    在Golang中,可以使用一些库来实现进程监控,如Prometheus和Gin等。下面是一个使用Gin和Prometheus库实现进...
    99+
    2023-10-26
    golang
  • Shell中怎么利用memcached实现进程监控
    这期内容当中小编将会给大家带来有关Shell中怎么利用memcached实现进程监控,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。WEB服务器使用memcached,但是不知道为什么memcached老是...
    99+
    2023-06-09
  • java进度条怎么实现实时监控
    实现实时监控的进度条可以使用Java的Swing库来实现。下面是一个简单的示例代码:```javaimport javax.swin...
    99+
    2023-09-01
    java
  • 怎么对docker内存进行监控
    怎么对docker内存进行监控?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一直运行的docker容器显示内存已经耗尽,并且容器内存耗尽也没出现重启情况,通过后台查看发现进程没...
    99+
    2023-06-14
  • Shell脚本实现的memcached进程监控
    WEB服务器使用memcached,但是不知道为什么memcached老是挂掉(基本20分钟~50分钟左右),导致部分网站页面在访问的时候出错;定义日志后,查看日志也未能发现什么;初步判定由于之前更新lib...
    99+
    2022-06-04
    脚本 进程 Shell
  • FormData+Ajax怎么实现上传进度监控
    小编给大家分享一下FormData+Ajax怎么实现上传进度监控,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!什么是FormData?FormData对象可以组装一组用 XMLHttpRequest发送请求的键/值对。它可...
    99+
    2023-06-08
  • 使用zabbix怎么对mysql进行监控
    今天就跟大家聊聊有关使用zabbix怎么对mysql进行监控,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。zabbix 监控 mysql1、监控规划...
    99+
    2024-04-02
  • 怎么对Java 线程池的运行状态进行监控
    怎么对Java 线程池的运行状态进行监控?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。总线程数 = 排队线程数 + 活动线程数 + 执行完成的线程数下面给出一个线程池使用示...
    99+
    2023-06-06
  • CSS怎么控制动画行进
    本文小编为大家详细介绍“CSS怎么控制动画行进”,内容详细,步骤清晰,细节处理妥当,希望这篇“CSS怎么控制动画行进”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。拆解分析需求动画控制要完成的效果是:页面 rend...
    99+
    2023-07-04
  • 如何使用vbs+bat实现进程监控
    这篇文章给大家分享的是有关如何使用vbs+bat实现进程监控的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。运行后会在%windir%\system32\目录下生成jk.vbs, 并且自动添加注册表启动项,另外在D...
    99+
    2023-06-08
  • 使用shell脚本怎么实现服务器进程监控
    使用shell脚本怎么实现服务器进程监控?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。程序说明:1)通过将系统定义的进程(timer)配置到配置文件proces...
    99+
    2023-06-09
  • 如何用Shell脚本实现监控Squid运行进程数并自动重启
    本篇内容介绍了“如何用Shell脚本实现监控Squid运行进程数并自动重启”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代码如下:#!/bi...
    99+
    2023-06-09
  • 数据库表空间怎么进行监控
    这篇文章给大家分享的是有关数据库表空间怎么进行监控的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。对数据库中表空间的表的属性进行判断,所有的表空间的查询方法如下:selec ...
    99+
    2024-04-02
  • Zabbix中怎么添加主机进行监控
    要在Zabbix中添加主机进行监控,可以按照以下步骤操作: 登录到Zabbix的Web界面,进入主页后点击左侧菜单栏中的“Con...
    99+
    2024-04-09
    Zabbix
  • linux进程监控与自动重启的简单实现方法
    目的: linux 下服务器程序会因为各种原因dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能。 实现原理: 由定时任务crontab调用脚本,脚本用ps检查进程是否存在,如果不存在则重启并写入日志。 ...
    99+
    2022-06-04
    linux 进程监控 Linux监控某个进程 linux自动重启命令
  • Linux怎么安装使用pidstat命令以对进程数据进行监控
    本篇内容介绍了“Linux怎么安装使用pidstat命令以对进程数据进行监控”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  Linux系统...
    99+
    2023-06-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作