У меня есть вопрос, касающийся программирования ETW (трассировка событий для Windows). Когда мой драйвер загружается, он может перехватить запуск каждого приложения, используя pssetCreateProcessNotifyRoutineex , записать путь программы и выполнить некоторые дополнительные проверки. Я позаимствовал кусок кода на форуме переполнения стека (не получал событий Microsoft-Windows-Kernel-Process от потребителя ETW в реальном времени), но после составления и запуска ( с разрешением администратора n) она никогда не перехватывает запуск программы. Информация < /strong>.
Чтобы проверить, я открываю текстовый редактор, новый браузер, музыкальный проигрыватель и т. Д. Пожалуйста, помогите мне определить проблему. < /P>
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#pragma comment(lib, "Advapi32.lib")
#define LOGSESSION_GUID "{b2bcc945-9eb9-4231-883c-d6455cf4d86b}"
#define LOGSESSION_NAME L"Testing ETW Consumer"
static const GUID SessionGuid =
{ 0xb2bcc945, 0x9eb9, 0x4231,{ 0x88, 0x3c, 0xd6, 0x45, 0x5c, 0xf4, 0xd8, 0x6b } };
TRACEHANDLE sessionHandle;
TRACEHANDLE traceHandle;
GUID guid;
int bufferSize = sizeof(EVENT_TRACE_PROPERTIES) + sizeof(LOGSESSION_NAME) + sizeof(WCHAR);
auto pSessionProperties = static_cast(malloc(bufferSize));
// Microsoft-Windows-Kernel-Process
// {22FB2CD6-0E7B-422B-A0C7-2FAD1FD0E716}
static const GUID MSKRNL_PROVIDER_GUID =
{ 0x22fb2cd6, 0x0e7b, 0x422b,{ 0xa0, 0xc7, 0x2f, 0xad, 0x1f, 0xd0, 0xe7, 0x16 } };
VOID WINAPI EventRecordCallback(EVENT_RECORD* pEventRecord) {
fprintf(stdout, "Event Record Received\n");
return;
}
ULONG WINAPI BufferCallback(EVENT_TRACE_LOGFILE* pLogFile) {
fprintf(stdout, "in BufferCallback...\n");
return TRUE;
}
static DWORD WINAPI Win32TracingThread(LPVOID Parameter)
{
fprintf(stdout, "processing trace...\n");
auto ptStatus = ProcessTrace(&traceHandle, 1, NULL, NULL);
if (ptStatus != ERROR_SUCCESS && ptStatus != ERROR_CANCELLED)
{
wprintf(L"ProcessTrace exit status: %lu\n", ptStatus);
}
return(0);
}
int main(void)
{
fprintf(stdout, "entering main program...\n");
// Set the session properties. You only append the log file name
// to the properties structure; the StartTrace function appends
// the session name for you.
ZeroMemory(pSessionProperties, bufferSize);
pSessionProperties->Wnode.BufferSize = bufferSize;
pSessionProperties->Wnode.Flags = WNODE_FLAG_TRACED_GUID;
pSessionProperties->Wnode.ClientContext = 1; //QPC clock resolution
pSessionProperties->Wnode.Guid = SessionGuid;
pSessionProperties->FlushTimer = 0;
pSessionProperties->EnableFlags = EVENT_TRACE_FLAG_PROCESS | EVENT_TRACE_FLAG_PROCESS_COUNTERS;
pSessionProperties->LogFileMode = EVENT_TRACE_REAL_TIME_MODE;
pSessionProperties->LogFileNameOffset = 0;
pSessionProperties->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
StringCbCopy((STRSAFE_LPWSTR)((char*)pSessionProperties + pSessionProperties->LoggerNameOffset), sizeof(LOGSESSION_NAME), LOGSESSION_NAME);
// stop any previous session
auto stopStatus = ControlTrace(0, LOGSESSION_NAME, pSessionProperties, EVENT_TRACE_CONTROL_STOP);
fprintf(stdout, "starting trace...\n");
auto sTrStatus = StartTrace(static_cast(&sessionHandle), LOGSESSION_NAME, pSessionProperties);
fprintf(stdout, "enabling trace...\n");
auto eTrExstatus = EnableTraceEx2(sessionHandle, &MSKRNL_PROVIDER_GUID, EVENT_CONTROL_CODE_ENABLE_PROVIDER, TRACE_LEVEL_VERBOSE, 1, 0, 0, nullptr);
EVENT_TRACE_LOGFILE loggerInfo = {0};
loggerInfo.ProcessTraceMode = EVENT_TRACE_REAL_TIME_MODE | PROCESS_TRACE_MODE_EVENT_RECORD;
loggerInfo.BufferCallback = BufferCallback;
// provide a callback whenever we get an event record
loggerInfo.EventRecordCallback = (PEVENT_RECORD_CALLBACK) EventRecordCallback;
loggerInfo.Context = nullptr;
// LoggerName is the sessionName that we had provided in StartTrace
// For consuming events from ETL file we will provide path to ETL file.
loggerInfo.LoggerName = LOGSESSION_NAME;
loggerInfo.LogFileName = NULL;
loggerInfo.LogFileMode = EVENT_TRACE_REAL_TIME_MODE;
fprintf(stdout, "opening trace...\n");
traceHandle = OpenTrace(&loggerInfo);
// calling thread will be blocked until BufferCallback returns FALSE or all events are delivered or CloseTrace is called
DWORD ThreadID;
HANDLE ThreadHandle = CreateThread(0, 0, Win32TracingThread, 0, 0, &ThreadID);
// Waiting for you to press the ESC key....
bool exit2 = false;
while (exit2 == false)
{
if (GetAsyncKeyState(VK_ESCAPE))
{
exit2 = true;
fprintf(stdout, "escape pressed, exiting loop...\n");
}
}
CloseHandle(ThreadHandle);
if ((TRACEHANDLE)INVALID_HANDLE_VALUE != traceHandle)
{
fprintf(stdout, "in cleanup...\n");
fprintf(stdout, "closing trace...\n");
auto ctStatus = CloseTrace(traceHandle);
}
auto cTrStatus = ControlTrace(sessionHandle, nullptr, pSessionProperties, EVENT_TRACE_CONTROL_STOP);
auto eTrStatus = EnableTraceEx2(sessionHandle, &MSKRNL_PROVIDER_GUID, EVENT_CONTROL_CODE_DISABLE_PROVIDER, 0, 0, 0, 0, nullptr);
free(pSessionProperties);
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... pplication
Проблемы с захватом процесса событий запуска с ETW в приложении пользовательского режима ⇐ C++
Программы на C++. Форум разработчиков
1744597713
Anonymous
У меня есть вопрос, касающийся программирования ETW (трассировка событий для Windows). Когда мой драйвер загружается, он может перехватить запуск каждого приложения, используя [b] pssetCreateProcessNotifyRoutineex [/b] , записать путь программы и выполнить некоторые дополнительные проверки. Я позаимствовал кусок кода на форуме переполнения стека (не получал событий Microsoft-Windows-Kernel-Process от потребителя ETW в реальном времени), но после составления и запуска ([b] с разрешением администратора [/b] n) она никогда не перехватывает запуск программы. Информация < /strong>.
Чтобы проверить, я открываю текстовый редактор, новый браузер, музыкальный проигрыватель и т. Д. Пожалуйста, помогите мне определить проблему. < /P>
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#pragma comment(lib, "Advapi32.lib")
#define LOGSESSION_GUID "{b2bcc945-9eb9-4231-883c-d6455cf4d86b}"
#define LOGSESSION_NAME L"Testing ETW Consumer"
static const GUID SessionGuid =
{ 0xb2bcc945, 0x9eb9, 0x4231,{ 0x88, 0x3c, 0xd6, 0x45, 0x5c, 0xf4, 0xd8, 0x6b } };
TRACEHANDLE sessionHandle;
TRACEHANDLE traceHandle;
GUID guid;
int bufferSize = sizeof(EVENT_TRACE_PROPERTIES) + sizeof(LOGSESSION_NAME) + sizeof(WCHAR);
auto pSessionProperties = static_cast(malloc(bufferSize));
// Microsoft-Windows-Kernel-Process
// {22FB2CD6-0E7B-422B-A0C7-2FAD1FD0E716}
static const GUID MSKRNL_PROVIDER_GUID =
{ 0x22fb2cd6, 0x0e7b, 0x422b,{ 0xa0, 0xc7, 0x2f, 0xad, 0x1f, 0xd0, 0xe7, 0x16 } };
VOID WINAPI EventRecordCallback(EVENT_RECORD* pEventRecord) {
fprintf(stdout, "Event Record Received\n");
return;
}
ULONG WINAPI BufferCallback(EVENT_TRACE_LOGFILE* pLogFile) {
fprintf(stdout, "in BufferCallback...\n");
return TRUE;
}
static DWORD WINAPI Win32TracingThread(LPVOID Parameter)
{
fprintf(stdout, "processing trace...\n");
auto ptStatus = ProcessTrace(&traceHandle, 1, NULL, NULL);
if (ptStatus != ERROR_SUCCESS && ptStatus != ERROR_CANCELLED)
{
wprintf(L"ProcessTrace exit status: %lu\n", ptStatus);
}
return(0);
}
int main(void)
{
fprintf(stdout, "entering main program...\n");
// Set the session properties. You only append the log file name
// to the properties structure; the StartTrace function appends
// the session name for you.
ZeroMemory(pSessionProperties, bufferSize);
pSessionProperties->Wnode.BufferSize = bufferSize;
pSessionProperties->Wnode.Flags = WNODE_FLAG_TRACED_GUID;
pSessionProperties->Wnode.ClientContext = 1; //QPC clock resolution
pSessionProperties->Wnode.Guid = SessionGuid;
pSessionProperties->FlushTimer = 0;
pSessionProperties->EnableFlags = EVENT_TRACE_FLAG_PROCESS | EVENT_TRACE_FLAG_PROCESS_COUNTERS;
pSessionProperties->LogFileMode = EVENT_TRACE_REAL_TIME_MODE;
pSessionProperties->LogFileNameOffset = 0;
pSessionProperties->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
StringCbCopy((STRSAFE_LPWSTR)((char*)pSessionProperties + pSessionProperties->LoggerNameOffset), sizeof(LOGSESSION_NAME), LOGSESSION_NAME);
// stop any previous session
auto stopStatus = ControlTrace(0, LOGSESSION_NAME, pSessionProperties, EVENT_TRACE_CONTROL_STOP);
fprintf(stdout, "starting trace...\n");
auto sTrStatus = StartTrace(static_cast(&sessionHandle), LOGSESSION_NAME, pSessionProperties);
fprintf(stdout, "enabling trace...\n");
auto eTrExstatus = EnableTraceEx2(sessionHandle, &MSKRNL_PROVIDER_GUID, EVENT_CONTROL_CODE_ENABLE_PROVIDER, TRACE_LEVEL_VERBOSE, 1, 0, 0, nullptr);
EVENT_TRACE_LOGFILE loggerInfo = {0};
loggerInfo.ProcessTraceMode = EVENT_TRACE_REAL_TIME_MODE | PROCESS_TRACE_MODE_EVENT_RECORD;
loggerInfo.BufferCallback = BufferCallback;
// provide a callback whenever we get an event record
loggerInfo.EventRecordCallback = (PEVENT_RECORD_CALLBACK) EventRecordCallback;
loggerInfo.Context = nullptr;
// LoggerName is the sessionName that we had provided in StartTrace
// For consuming events from ETL file we will provide path to ETL file.
loggerInfo.LoggerName = LOGSESSION_NAME;
loggerInfo.LogFileName = NULL;
loggerInfo.LogFileMode = EVENT_TRACE_REAL_TIME_MODE;
fprintf(stdout, "opening trace...\n");
traceHandle = OpenTrace(&loggerInfo);
// calling thread will be blocked until BufferCallback returns FALSE or all events are delivered or CloseTrace is called
DWORD ThreadID;
HANDLE ThreadHandle = CreateThread(0, 0, Win32TracingThread, 0, 0, &ThreadID);
// Waiting for you to press the ESC key....
bool exit2 = false;
while (exit2 == false)
{
if (GetAsyncKeyState(VK_ESCAPE))
{
exit2 = true;
fprintf(stdout, "escape pressed, exiting loop...\n");
}
}
CloseHandle(ThreadHandle);
if ((TRACEHANDLE)INVALID_HANDLE_VALUE != traceHandle)
{
fprintf(stdout, "in cleanup...\n");
fprintf(stdout, "closing trace...\n");
auto ctStatus = CloseTrace(traceHandle);
}
auto cTrStatus = ControlTrace(sessionHandle, nullptr, pSessionProperties, EVENT_TRACE_CONTROL_STOP);
auto eTrStatus = EnableTraceEx2(sessionHandle, &MSKRNL_PROVIDER_GUID, EVENT_CONTROL_CODE_DISABLE_PROVIDER, 0, 0, 0, 0, nullptr);
free(pSessionProperties);
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79572266/trouble-capturing-process-start-events-with-etw-in-user-mode-application[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия