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


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

    文章地址:https://www.cnblogs.com/Icys/p/EtwProcess.html

    何为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;
    }
    
    折叠

    注意事项

    1. 必须给管理员权限

    2. 请正常退出(按任意键),否则Trace不会自己关

    其他

    作者(本人)水平有限,部分翻译可能有误,代码有问题可以直接回复我。

    以后有时间可能会考虑翻译一下这个作者其他的关于Etw的例子,毕竟Etw实现的这些功能都很有意思,并且都比较高级。


    __EOF__

  • 本文作者: Ice
  • 本文链接: https://www.cnblogs.com/Icys/p/EtwProcess.html
  • 关于博主: I am a student.
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    Unity游戏开发基础组件
    windows和linux可以共用的端口连通性是否丢包测试工具paping
    Java底层总结(未完善)
    RabbitMQ安装(Mac版本)
    【超详细Vue2教程】超详细的Vue2入门教程,让你的开发效率大大提高(自己整理的笔记,超详细!)
    怎么绕过CDN查找真实IP
    MyBioSource抗 CD31/PECAM-1 抗体解决方案
    git撤回多个push到远程仓库的commit
    PCIe总线的序
    亚马逊日本站养号测评需要哪些资源和注意点,如何确保账号的稳定性和纯净环境?
  • 原文地址:https://www.cnblogs.com/Icys/p/EtwProcess.html