最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)ETW進(jìn)行進(jìn)程變動(dòng)監(jiān)控詳解

 更新時(shí)間:2022年07月12日 16:03:25   作者:Icys  
ETW提供了一種對用戶層應(yīng)用程序和內(nèi)核層驅(qū)動(dòng)創(chuàng)建的事件對象的跟蹤記錄機(jī)制。為開發(fā)者提供了一套快速、可靠、通用的一系列事件跟蹤特性。本文將利用ETW進(jìn)行進(jìn)程變動(dòng)監(jiān)控,需要的可以參考一下

何為Etw

ETW(Event Tracing for Windows)提供了一種對用戶層應(yīng)用程序和內(nèi)核層驅(qū)動(dòng)創(chuàng)建的事件對象的跟蹤記錄機(jī)制。為開發(fā)者提供了一套快速、可靠、通用的一系列事件跟蹤特性。

前言

一直想研究一種監(jiān)控進(jìn)程的方法,但wmi/枚舉進(jìn)程的方法,要么反應(yīng)太慢,要么占用高。最近看到有人用易語言易語言完成了Etw對進(jìn)程變動(dòng)監(jiān)控的實(shí)現(xiàn)。

但是一直沒看到C++的實(shí)現(xiàn),于是決定將易語言易語言翻譯為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://創(chuàng)建進(jìn)程
        cout << "創(chuàng)建進(jìn)程!進(jìn)行創(chuàng)建進(jìn)行的進(jìn)程ID:" <<
            EventRecord->EventHeader.ProcessId <<
            ",線程ID:" <<
            EventRecord->EventHeader.ThreadId <<
            ",進(jìn)程SessionID:" <<
            *(ULONG*)(((PUCHAR)EventRecord->UserData)+32)<<
            ",創(chuàng)建的進(jìn)程ID:"<<
            *(ULONG*)(((PUCHAR)EventRecord->UserData) + 0) <<
            ",創(chuàng)建的進(jìn)程路徑:"<<
            Unicode_To_Ansi(  wstring((wchar_t*)(((PUCHAR)EventRecord->UserData) + 60)))
            <<endl;
        break;
    case 2://進(jìn)程退出
        cout << "進(jìn)程退出!進(jìn)程ID:" <<
            EventRecord->EventHeader.ProcessId <<
            ",線程ID:" <<
            EventRecord->EventHeader.ThreadId <<
            ", 進(jìn)程名:"<<
            ((LPSTR)EventRecord->UserData) + 84
            <<endl;
        break;
        cout << "進(jìn)程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失??!原因:無管理員權(quán)限!" << endl;
        return 0;
    }
    else if (m_hSessionHandle == NULL && l_result == ERROR_ALREADY_EXISTS)
    {

     m_hSessionHandle = 44;//輸入上一次終止時(shí)候的句柄
        CloseEtw();
     
        cout << "StartTraceA失??!原因:已經(jīng)有Etw事件進(jìn)行數(shù)據(jù)跟蹤!請使用上方屏蔽代碼關(guān)閉事件或者使用 計(jì)算機(jī)管理 停用事件: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其實(shí)是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;//隨便輸入一個(gè)數(shù)就好了
    SetLastError(0);
    m_hTraceHandle = OpenTraceA(&m_Logfile);

    cout << "開始監(jiān)視!" << 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;
}

注意事項(xiàng)

必須給管理員權(quán)限

請正常退出(按任意鍵),否則Trace不會自己關(guān)

以上就是C++實(shí)現(xiàn)ETW進(jìn)行進(jìn)程變動(dòng)監(jiān)控詳解的詳細(xì)內(nèi)容,更多關(guān)于C++進(jìn)程監(jiān)控的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言各種變量的初始化方式

    C語言各種變量的初始化方式

    這篇文章主要介紹了C語言各種變量的初始化方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • C++實(shí)現(xiàn)LeetCode(41.首個(gè)缺失的正數(shù))

    C++實(shí)現(xiàn)LeetCode(41.首個(gè)缺失的正數(shù))

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(41.首個(gè)缺失的正數(shù)),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言解3元1次方程組 用初中學(xué)的最基本的聯(lián)合消元法

    C語言解3元1次方程組 用初中學(xué)的最基本的聯(lián)合消元法

    最近就想自己能不能先寫個(gè)算線性方程組的程序呢?后來就想了這么個(gè)方法,暫時(shí)只能算3元的,任意元的接下來繼續(xù)想。有太多硬編碼,希望有興趣的讀者可以給點(diǎn)修改建議
    2013-11-11
  • C++從零配置ffmpeg的詳細(xì)過程

    C++從零配置ffmpeg的詳細(xì)過程

    本博文源于筆者正在做的任務(wù),將視頻mp4每幀轉(zhuǎn)換成jpg格式,前提是需要配置ffmpeg,因此本文從0下載教讀者如何配置ffmpeg,文中通過圖文結(jié)合的方式給大家介紹得非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • C++ WideCharToMultiByte()函數(shù)案例詳解

    C++ WideCharToMultiByte()函數(shù)案例詳解

    這篇文章主要介紹了C++ WideCharToMultiByte()函數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++詳細(xì)講解模擬實(shí)現(xiàn)位圖和布隆過濾器的方法

    C++詳細(xì)講解模擬實(shí)現(xiàn)位圖和布隆過濾器的方法

    位圖(bitset)是一種常用的數(shù)據(jù)結(jié)構(gòu),常用在給一個(gè)很大范圍的數(shù),判斷其中的一個(gè)數(shù)是不是在其中。在索引、數(shù)據(jù)壓縮方面有很大的應(yīng)用。布隆過濾器是由布隆提出的,它實(shí)際上是一個(gè)很長的二進(jìn)制向量和一系列隨機(jī)映射函數(shù)。布隆過濾器可以用于檢索一個(gè)元素是否在一個(gè)集合中
    2022-06-06
  • 從C語言過渡到C++之基本變化

    從C語言過渡到C++之基本變化

    在之前的C++代碼訓(xùn)練營系列中,我試圖用完成具體項(xiàng)目的方式給大家介紹C++,但后來大家反饋說這樣從C過渡到C++有點(diǎn)跟不上。于是我又專門設(shè)計(jì)了這個(gè)《從C到C++》的過渡專題,我準(zhǔn)備通過10篇文章介紹一下C++和C的重要區(qū)別。
    2017-07-07
  • C語言圣誕樹的實(shí)現(xiàn)示例

    C語言圣誕樹的實(shí)現(xiàn)示例

    本篇主要介紹了C語言圣誕樹的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C語言運(yùn)用函數(shù)指針數(shù)組實(shí)現(xiàn)計(jì)算器功能

    C語言運(yùn)用函數(shù)指針數(shù)組實(shí)現(xiàn)計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了C語言運(yùn)用函數(shù)指針數(shù)組實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • static關(guān)鍵字的作用詳解

    static關(guān)鍵字的作用詳解

    在C語言中,static的字面意思很容易把我們導(dǎo)入歧途,其實(shí)它的作用有三條。
    2013-04-04

最新評論

屯昌县| 灵台县| 宿州市| 海阳市| 西和县| 临潭县| 阳东县| 永兴县| 涟水县| 濮阳县| 万年县| 萨嘎县| 依安县| 精河县| 台州市| 新营市| 马龙县| 宝清县| 新蔡县| 古浪县| 贵南县| 钟山县| 镇远县| 徐闻县| 利川市| 邳州市| 会东县| 宣城市| 章丘市| 河北区| 随州市| 夏河县| 辽宁省| 平舆县| 满洲里市| 怀集县| 内黄县| 衡山县| 明光市| 麻阳| 哈尔滨市|