Re: Узнать имя процесса по PID (системного lsass и т.д)
От: Pavel Dvorkin Россия  
Дата: 21.11.10 08:45
Оценка: +1
Здравствуйте, 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
Узнать имя процесса по PID (системного lsass и т.д)
От: Xuxuxuxux  
Дата: 21.11.10 02:06
Оценка:
Здравствуйте уважаемые.
Сейчас работаю над списком процессов, у меня есть список 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;



AdjustTokenPrivileges выдаёт ошибку ERROR_NOT_ALL_ASSIGNED


Узнаю имя файла через OpenProcess + GetModuleBaseName.

Вообще я читал что SE_DEBUG_NAME для этого и нужен, что бы максимально поднять права для работы со системными файлами, или может быть у вас есть другой пример, как узнать имя процесса СИСТЕМНОГо и кроме унылого CreateToolhelp32Snapshot.

P.S CreateToolhelp32Snapshot НЕ ВАРИАНТ.
Re: Узнать имя процесса по PID (системного lsass и т.д)
От: Jolly Roger  
Дата: 21.11.10 04:36
Оценка:
Здравствуйте, Xuxuxuxux, Вы писали:

X>P.S CreateToolhelp32Snapshot НЕ ВАРИАНТ.


А WTSEnumerateProcesses?
"Нормальные герои всегда идут в обход!"
Re[2]: Узнать имя процесса по PID (системного lsass и т.д)
От: Xuxuxuxux  
Дата: 21.11.10 09:41
Оценка:
Здравствуйте, 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 и т.д)
От: Pavel Dvorkin Россия  
Дата: 21.11.10 09:49
Оценка:
Здравствуйте, Xuxuxuxux, Вы писали:


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 и т.д)
От: Xuxuxuxux  
Дата: 22.11.10 00:40
Оценка:
Спасибо конечно, решил поработать с CreateToolHelp32SnapShot.

Но теперь новая проблема, стоит антивирус Касперского и получая таблицу из GetExtendedTcpTable У ВСЕХ процессов которые работают с внешним IP изменён PID на avp.exe )))) просто очередная жопа. То есть PID процессов из GetExtendedTcpTable я получаю УЖЕ переработанные у антивируса...
Re: Узнать имя процесса по PID (системного lsass и т.д)
От: Alexander G Украина  
Дата: 22.11.10 18:04
Оценка:
QueryFullProcessImageName ?
Русский военный корабль идёт ко дну!
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 и т.д)
От: Andrew S Россия http://alchemy-lab.com
Дата: 02.03.11 22:37
Оценка:
X>Спасибо конечно, решил поработать с CreateToolHelp32SnapShot.

X>Но теперь новая проблема, стоит антивирус Касперского и получая таблицу из GetExtendedTcpTable У ВСЕХ процессов которые работают с внешним IP изменён PID на avp.exe )))) просто очередная жопа. То есть PID процессов из GetExtendedTcpTable я получаю УЖЕ переработанные у антивируса...


Пишите свой драйвер... В поиске по форуму ответ почему так найдете.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
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.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682631(v=vs.85).aspx
Re[7]: Узнать имя процесса по PID (системного lsass и т.д)
От: Аноним  
Дата: 22.02.12 08:11
Оценка:
И ещё...
Мучаясь с той же темой — определение имени процесса и пути к файлу, нашёл GetProcessImageFileName из psapi.dll. GetProcessImageFileName прекрасно отображает полный путь к файлу на Windows 7 (на Win_32 не тестировал пока)!!!
Re: Узнать имя процесса по PID (системного lsass и т.д)
От: De-Bugger  
Дата: 22.02.12 10:42
Оценка:
Здравствуйте, Xuxuxuxux, Вы писали:

ОС какая? Манифест с requestedExecutionLevel "requireAdministrator" в наличии?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.