Здравствуйте уважаемые.
Сейчас работаю над списком процессов, у меня есть список PID, по PID узнаю имя процесса и адрес файла, но тут большая проблема с системными файлами типа lsass.exe, которые выдают 5 ошибку (Аксесс Дениед).
Пробовал через поднятие привилегий, не помогло.
Вот так поднимаем привилегии:
function EnableDebugPrivilege(const Value: Boolean): Boolean;
const
SE_DEBUG_NAME = 'SeDebugPrivilege';
var
hToken: THandle;
tp: TOKEN_PRIVILEGES;
d: DWORD;
begin
Result := False;
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken) then
begin
tp.PrivilegeCount := 1;
LookupPrivilegeValue(nil, SE_DEBUG_NAME, tp.Privileges[0].Luid);
if Value then
tp.Privileges[0].Attributes := $00000002
else
tp.Privileges[0].Attributes := $80000000;
AdjustTokenPrivileges(hToken, False, tp, SizeOf(TOKEN_PRIVILEGES), nil, d);
if GetLastError = ERROR_SUCCESS then
begin
Result := True;
end else halt;//o(GetLastError);
CloseHandle(hToken);
end;
end;
Узнаю имя файла через OpenProcess + GetModuleBaseName.
Вообще я читал что SE_DEBUG_NAME для этого и нужен, что бы максимально поднять права для работы со системными файлами, или может быть у вас есть другой пример, как узнать имя процесса СИСТЕМНОГо и кроме унылого CreateToolhelp32Snapshot.
P.S CreateToolhelp32Snapshot НЕ ВАРИАНТ.
Re: Узнать имя процесса по PID (системного lsass и т.д)
Здравствуйте, Xuxuxuxux, Вы писали:
X>Вообще я читал что SE_DEBUG_NAME для этого и нужен, что бы максимально поднять права для работы со системными файлами, или может быть у вас есть другой пример, как узнать имя процесса СИСТЕМНОГо и кроме унылого CreateToolhelp32Snapshot.
X>P.S CreateToolhelp32Snapshot НЕ ВАРИАНТ.
Эпитеты — вещь интересная, а все же чем не угодил CreateToolhelp32Snapshot ? Тем, что он дает не текущее состояние, а снимок ? Так надо отдавать себе отчет в том, что никакими способами в 3 кольце получить мгновенное состояние все равно невозможно : пока получаем, процесс может закончиться или стартовать.
В любом случае открывать процессы для получения их имен — идея ИМХО плохая. Помимо lsass и прочих smss, вполне могут быть вполне юзеровские процессы, которые не дадут себя открыть.
Кроме CreateToolhelp32Snapshot можно предложить
EnumProcesses из PS API
Прямое обращение к ntdll.dll, NTQuerySystemInformation/SystemProcessInformation
With best regards
Pavel Dvorkin
Re[2]: Узнать имя процесса по PID (системного lsass и т.д)
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>В любом случае открывать процессы для получения их имен — идея ИМХО плохая. Помимо lsass и прочих smss, вполне могут быть вполне юзеровские процессы, которые не дадут себя открыть.
PD>Кроме CreateToolhelp32Snapshot можно предложить
PD>EnumProcesses из PS API PD>Прямое обращение к ntdll.dll, NTQuerySystemInformation/SystemProcessInformation
Спасибо за ответы.
Суть в том, что у меня УЖЕ есть список процессов, полученный из GetExtendedTcpTable, там получаю список портов и PID владельца, в классе TCP_TABLE_OWNER_MODULE_ALL там автоматом для простых процессов пишется Владелец(pModuleName) и Путь(pModulePath), НО ! для системных вообще не пишется, в этом и проблема, сейчас и хочу узнать для них имя процесса (файла).
CreateToolhelp32Snapshot не устраивает тем, что он работает в связке с Process32First в цикле, то есть получается, что получая таблицу из GetExtendedTcpTable я запускаю цикл и для каждого системного процесса, начинаю новый цикл с CreateToolhelp32Snapshot.
P.S Тоже самое могу сказать и про WTSEnumerateProcesses, опять цикл.
P.S2 Может быть знаете ответ, как в TCP_TABLE_OWNER_MODULE_ALL получать И названия системных процессов (у меня без названий)
Re[3]: Узнать имя процесса по PID (системного lsass и т.д)
X>CreateToolhelp32Snapshot не устраивает тем, что он работает в связке с Process32First в цикле, то есть получается, что получая таблицу из GetExtendedTcpTable я запускаю цикл и для каждого системного процесса, начинаю новый цикл с CreateToolhelp32Snapshot.
Вот это неясно. Кто мешает выполнить цикл один раз (CreateToolhelp32Snapshot/Process32First/do while Process32Next) и для каждого полученного таким образом процесса произвести поиск в таблице из GetExtendedTcpTable ?
X>P.S2 Может быть знаете ответ, как в TCP_TABLE_OWNER_MODULE_ALL получать И названия системных процессов (у меня без названий)
Нет, не знаю, но крайне сомневаюсь, что там это есть. Зачем там будут отводить место для хранения информации, которая никакого отношения к TCP не имеет ? Эту информацию предоставляет другая часть API, ее и нужно вызывать.
With best regards
Pavel Dvorkin
Re[4]: Узнать имя процесса по PID (системного lsass и т.д)
Спасибо конечно, решил поработать с CreateToolHelp32SnapShot.
Но теперь новая проблема, стоит антивирус Касперского и получая таблицу из GetExtendedTcpTable У ВСЕХ процессов которые работают с внешним IP изменён PID на avp.exe )))) просто очередная жопа. То есть PID процессов из GetExtendedTcpTable я получаю УЖЕ переработанные у антивируса...
Re: Узнать имя процесса по PID (системного lsass и т.д)
Re: Узнать имя процесса по PID (системного lsass и т.д)
От:
Аноним
Дата:
02.03.11 16:18
Оценка:
function ProcessPIDToName(ProcessId: DWORD): String;
function EnableDebugPrivilege(const value: Boolean): Boolean;
const
SE_DEBUG_NAME = 'SeDebugPrivilege';
var
hToken : THandle;
tp : TOKEN_PRIVILEGES;
d : DWORD;
begin
Result := False;
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken) then
try
if not LookupPrivilegeValue(Nil, SE_DEBUG_NAME, tp.Privileges[0].Luid) then exit;
tp.PrivilegeCount := 1;
if value then
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED//$00000002
else
tp.Privileges[0].Attributes := SE_PRIVILEGE_USED_FOR_ACCESS;//$80000000;
AdjustTokenPrivileges(hToken, False, tp, SizeOf(TOKEN_PRIVILEGES), Nil, d);
Result:= GetLastError = ERROR_SUCCESS;
finally
CloseHandle(hToken);
end;
end;
var
n:integer;
hProcess:THandle;
mh: hmodule;
cm: cardinal;
begin
result:='';
if ProcessId=0 then
begin
result:='System Idle Process';
Exit;
end;
if ProcessId=4 then
begin
result:='System';
Exit;
end;
for n := 0 to (p_count div 4 - 1) do
if procs[n]=ProcessId then
begin
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, procs[n]);
if (hProcess = 0) then
if EnableDebugPrivilege(true) then
begin
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, procs[n]);
EnableDebugPrivilege(False);
end;
if hProcess > 0 then
begin
EnumProcessModules(hProcess, @mh, 4, cm);
GetModuleFileNameEx(hProcess, mh, ModName, sizeof(ModName));
result:=string(ModName);
CloseHandle(hProcess);
end;
break;
end;
end;
находит lsass.exe и остальные!
подскажи лучше как ты заставил работать функцию
GetExtendedTcpTable(TCPExTable, @Size, False, AF_INET, TCP_TABLE_OWNER_MODULE_ALL, 0);
у меня таблицу выдает с совершенно неверными данными
Re[5]: Узнать имя процесса по PID (системного lsass и т.д)
X>Спасибо конечно, решил поработать с CreateToolHelp32SnapShot.
X>Но теперь новая проблема, стоит антивирус Касперского и получая таблицу из GetExtendedTcpTable У ВСЕХ процессов которые работают с внешним IP изменён PID на avp.exe )))) просто очередная жопа. То есть PID процессов из GetExtendedTcpTable я получаю УЖЕ переработанные у антивируса...
Пишите свой драйвер... В поиске по форуму ответ почему так найдете.
Re[6]: Узнать имя процесса по PID (системного lsass и т.д)
От:
Аноним
Дата:
22.02.12 07:44
Оценка:
Как бы в продолжении темы.
Если эта функция вызывается из 32-разрядных приложений, работающих на WOW64, оно может только перечислить модули 32-разрядного процесса. If the process is a 64-bit process, this function fails and the last error code is ERROR_PARTIAL_COPY (299). Если этот процесс представляет собой 64-разрядный процесс, эта функция не выполняется и код последней ошибки ERROR_PARTIAL_COPY (299).
To take a snapshot of specified processes and the heaps, modules, and threads used by these processes, use the CreateToolhelp32Snapshot function. Чтобы сделать снимок указанных процессов и кучи, модули и темы, используемые этими процессами, использовать CreateToolhelp32Snapshot функции.
Starting with Windows 7 and Windows Server 2008 R2, Psapi.h establishes version numbers for the PSAPI functions. Начиная с Windows 7 и Windows Server 2008 R2, Psapi.h устанавливает номер версии для функций PSAPI. The PSAPI version number affects the name used to call the function and the library that a program must load. Число PSAPI версии влияет на имя, которое используется для вызова функции и библиотеки, которые программа должна загрузить.
If PSAPI_VERSION is 2 or greater, this function is defined as K32EnumProcessModules in Psapi.h and exported in Kernel32.lib and Kernel32.dll. Если PSAPI_VERSION составляет 2 или выше, эта функция определена как K32EnumProcessModules в Psapi.h и экспортируется в kernel32.lib и Kernel32.dll. If PSAPI_VERSION is 1, this function is defined as EnumProcessModules in Psapi.h and exported in Psapi.lib and Psapi.dll as a wrapper that calls K32EnumProcessModules . Если PSAPI_VERSION 1, эта функция определена как EnumProcessModules в Psapi.h и экспортируется в Psapi.lib и Psapi.dll как оболочку, которая вызывает K32EnumProcessModules.
Programs that must run on earlier versions of Windows as well as Windows 7 and later versions should always call this function as QueryWorkingSet . Программы, которые должны работать в более ранних версиях Windows, а также Windows 7 и более поздних версий всегда должны вызывать эту функцию QueryWorkingSet . To ensure correct resolution of symbols, add Psapi.lib to the TARGETLIBS macro and compile the program with -DPSAPI_VERSION=1 . Для обеспечения правильного разрешения символы, добавлять Psapi.lib к TARGETLIBS макро-и скомпилировать программу с-DPSAPI_VERSION = 1. To use run-time dynamic linking, load Psapi.dll. Для использования во время выполнения динамического связывания, нагрузка Psapi.dll.
Re[7]: Узнать имя процесса по PID (системного lsass и т.д)
От:
Аноним
Дата:
22.02.12 08:11
Оценка:
И ещё...
Мучаясь с той же темой — определение имени процесса и пути к файлу, нашёл GetProcessImageFileName из psapi.dll. GetProcessImageFileName прекрасно отображает полный путь к файлу на Windows 7 (на Win_32 не тестировал пока)!!!
Re: Узнать имя процесса по PID (системного lsass и т.д)