Страница: 1 |
Страница: 1 |
Вопрос: EnumProcesses,EnumProcessModules с кучей юзерофф..
Добавлено: 13.11.09 00:53
Автор вопроса: Morpheus | Web-сайт:
Изначально, задача стояла так: найти все процессы юзающие длл-ку и прибить их из под какого-нить консольного приложения. выбрал с++, но вопрос не в этом..
короче, 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
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #1
Добавлено: 13.11.09 07:49
Думаю ключевое слово SeDebugPrivilege. Вообще вызывай GetLastError чтобы понять причину проблем. Эффективнее телепатии в разы.
Номер ответа: 2
Автор ответа:
VerhoLom
Вопросов: 20
Ответов: 285
Профиль | | #2
Добавлено: 13.11.09 11:43
process explorer перебирает структуры EPROCESS и им подобные в ядре!
Номер ответа: 3
Автор ответа:
VerhoLom
Вопросов: 20
Ответов: 285
Профиль | | #3
Добавлено: 13.11.09 11:46
Кстати, вот скачайте и изучите MS-REMовский ProcessHunter: http://xakssoft.narod.ru/download/phunter.rar. принцип работы у него тот же. Зато с исходником!
Номер ответа: 4
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #4
Добавлено: 13.11.09 16:58
GetLastError даёт ошибку 299, но у нас нету ничего 64-битного! Зато установлен File Based Write Filter -- можнт он виноват..
А как юзать SeDebugPrivilege и для чего?
Номер ответа: 5
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #5
Добавлено: 13.11.09 17:48
чё то нашёл на expert-sex-change, но проверить не могу на прямую, хотя на kernel32.dll под localboot кажись пашет.. не подумал про дебаг... потом отпишусь 100% если что!
Номер ответа: 6
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #6
Добавлено: 17.11.09 19:33
Урааа! Сделал! Спасибо всем дебаг привилегии -- это весчъ