Страница: 1 |
Вопрос: EnumProcesses,EnumProcessModules с кучей юзерофф.. | Добавлено: 13.11.09 00:53 |
Автор вопроса: ![]() |
Изначально, задача стояла так: найти все процессы юзающие длл-ку и прибить их из под какого-нить консольного приложения. выбрал с++, но вопрос не в этом..
короче, EnumProcesses, с помощью которой я получаю инфу о процессах и что они используют, не может доступисться к данным процессов, которые бегут под другим пользователем (точнее: EnumProcesses то может получить номер процесса, а вот EnumProcessModules не может получить список длл-ок) Но! я знаю что в принципе это возможно -- process explorer их видит все! кто-нибудь делал что-нибудь подобное? заранее благодарен! вот код, если что... // xenocide.cpp : does lots of freaky stuff // #include "stdafx.h" #include <iostream> #include <windows.h> #include <tchar.h> #include <stdio.h> #include <psapi.h> #pragma comment(lib, "Psapi") using namespace std; void PrintModules( DWORD processID ) { HMODULE hMods[1024]; HANDLE hProcess; DWORD cbNeeded; unsigned int i; // Print the process identifier. //printf( "\nProcess ID: %u\n", processID ); // Get a list of all the modules in this process. hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID ); if (NULL == hProcess) return; if( EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded)) { for ( i = 0; i < (cbNeeded / sizeof(HMODULE)); i++ ) { TCHAR szModName[MAX_PATH]; // Get the full path to the module's file. if ( GetModuleFileNameEx( hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR))) { // Print the module name and handle value. std::wstring ws (szModName); string s(ws.begin(), ws.end()); s.assign(ws.begin(), ws.end()); string::size_type loc = s.find("<some name>adll" ); if(loc != string::npos) { printf( "\nProcess ID: %u\n", processID ); _tprintf( TEXT("\t%s (0x%08X)\n"), szModName, hMods[i] ); } } } } CloseHandle( hProcess ); } void main( ) { // Get the list of process identifiers. DWORD aProcesses[1024], cbNeeded, cProcesses; unsigned int i; if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) return; // Calculate how many process identifiers were returned. cProcesses = cbNeeded / sizeof(DWORD); // Print the name of the modules for each process. for ( i = 0; i < cProcesses; i++ ) PrintModules( aProcesses[i] ); } |
Ответы | Всего ответов: 6 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 8068014 Вопросов: 18 Ответов: 817 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 13.11.09 07:49 |
Думаю ключевое слово SeDebugPrivilege. Вообще вызывай GetLastError чтобы понять причину проблем. Эффективнее телепатии в разы. |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 20 Ответов: 285 |
Профиль | Цитата | #2 | Добавлено: 13.11.09 11:43 |
process explorer перебирает структуры EPROCESS и им подобные в ядре! |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 20 Ответов: 285 |
Профиль | Цитата | #3 | Добавлено: 13.11.09 11:46 |
Кстати, вот скачайте и изучите MS-REMовский ProcessHunter: http://xakssoft.narod.ru/download/phunter.rar. принцип работы у него тот же. Зато с исходником! |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 224 Ответов: 3777 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 13.11.09 16:58 |
GetLastError даёт ошибку 299, но у нас нету ничего 64-битного! Зато установлен File Based Write Filter -- можнт он виноват..
А как юзать SeDebugPrivilege и для чего? |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 224 Ответов: 3777 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 13.11.09 17:48 |
чё то нашёл на expert-sex-change, но проверить не могу на прямую, хотя на kernel32.dll под localboot кажись пашет.. не подумал про дебаг... потом отпишусь 100% если что! ![]() |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 224 Ответов: 3777 |
Web-сайт: Профиль | Цитата | #6 | Добавлено: 17.11.09 19:33 |
Урааа! Сделал! Спасибо всем ![]() |
Страница: 1 |
|