我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

本篇内容介绍了“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

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

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

python守护进程监控子进程怎么实现

在Python中,可以使用multiprocessing模块来创建子进程并监控它们。具体实现方法如下:导入multiprocessing模块。import multiprocessing创建一个子进程的函数。def child_proces
2023-10-23

Shell中怎么利用memcached实现进程监控

这期内容当中小编将会给大家带来有关Shell中怎么利用memcached实现进程监控,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。WEB服务器使用memcached,但是不知道为什么memcached老是
2023-06-09

java进度条怎么实现实时监控

实现实时监控的进度条可以使用Java的Swing库来实现。下面是一个简单的示例代码:```javaimport javax.swing.*;import java.awt.*;import java.awt.event.ActionEven
2023-09-01

FormData+Ajax怎么实现上传进度监控

小编给大家分享一下FormData+Ajax怎么实现上传进度监控,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!什么是FormData?FormData对象可以组装一组用 XMLHttpRequest发送请求的键/值对。它可
2023-06-08

怎么对Java 线程池的运行状态进行监控

怎么对Java 线程池的运行状态进行监控?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。总线程数 = 排队线程数 + 活动线程数 + 执行完成的线程数下面给出一个线程池使用示
2023-06-06

使用shell脚本怎么实现服务器进程监控

使用shell脚本怎么实现服务器进程监控?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。程序说明:1)通过将系统定义的进程(timer)配置到配置文件proces
2023-06-09

如何用Shell脚本实现监控Squid运行进程数并自动重启

本篇内容介绍了“如何用Shell脚本实现监控Squid运行进程数并自动重启”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代码如下:#!/bi
2023-06-09

linux进程监控与自动重启的简单实现方法

目的: linux 下服务器程序会因为各种原因dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能。 实现原理: 由定时任务crontab调用脚本,脚本用ps检查进程是否存在,如果不存在则重启并写入日志。 crontab修改#
2022-06-04

Linux怎么安装使用pidstat命令以对进程数据进行监控

本篇内容介绍了“Linux怎么安装使用pidstat命令以对进程数据进行监控”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  Linux系统
2023-06-13

python监控日志中的报错并进行邮件报警怎么实现

今天小编给大家分享一下python监控日志中的报错并进行邮件报警怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实现思
2023-07-02

怎么用VBS调用程序并对程序的运行情况进行监控

这篇文章将为大家详细讲解有关怎么用VBS调用程序并对程序的运行情况进行监控,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。有同时要用一个CAE软件调用外部程序,但是,通过这个CAE软件调用外部程序以后,因为
2023-06-08

Qt怎么实现一个进程运行另一个进程

这篇“Qt怎么实现一个进程运行另一个进程”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Qt怎么实现一个进程运行另一个进程”文
2023-06-30

Android应用中怎么对GIF动图进行播放控制与监听

今天就跟大家聊聊有关Android应用中怎么对GIF动图进行播放控制与监听,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android 中 GIF 动图处理与监听刚开始第一个想到的便
2023-05-31

C#进度条中怎么实现控制台显示

这篇文章主要介绍“C#进度条中怎么实现控制台显示”,在日常操作中,相信很多人在C#进度条中怎么实现控制台显示问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#进度条中怎么实现控制台显示”的疑惑有所帮助!接下来
2023-06-17

k8s监控数据组件Pod自动化进行扩缩容HPA怎么用

这篇文章主要介绍“k8s监控数据组件Pod自动化进行扩缩容HPA怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“k8s监控数据组件Pod自动化进行扩缩容HPA怎么用”文章能帮助大家解决问题。自动
2023-06-29

C#多线程控制进度条的异步调用怎么实现

这篇文章主要讲解了“C#多线程控制进度条的异步调用怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#多线程控制进度条的异步调用怎么实现”吧!看看具体的步骤和实现:在上面的代码中,我们
2023-06-17

C语言怎么实现对文件进行操作

这篇“C语言怎么实现对文件进行操作”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言怎么实现对文件进行操作”文章吧。文件指
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录