Узнать PID по хэндлу: не все так просто

Тема в разделе "WASM.WIN32", создана пользователем Twister, 21 авг 2007.

  1. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Доброго времени суток!

    Чтобы реализовать САБЖ, необходимо вызвать NtQueryInformationProcess с параметром ProcessBasicInformation. Но, как оказалось, если хэндл открыт без доступа QueryInformation (к примеру, лишь с флагом PROCESS_TERMINATE), то NtQueryInformationProcess возвращает "Доступ запрещен". Как еще в юзермоде можно получить Pid по хэндлу?
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Никак, только поменять права. GetProcessId тоже работает через NtQueryInformationProcess.
     
  3. int2eh

    int2eh Alexander Leevy

    Публикаций:
    0
    Регистрация:
    19 авг 2007
    Сообщения:
    106
    Адрес:
    Москва
    Вот тебе SeDebugPrivilege для Win2K - © SVEN B. SCHREIBER
    К примеру, вызываешь так: dbgPrivilegeSet ((PWORD)SE_DEBUG_NAME) ;
    Код (Text):
    1. BOOL WINAPI dbgPrivilegeSet (PWORD pwName)
    2. {
    3.     HANDLE hToken;
    4.     TOKEN_PRIVILEGES tp;
    5.     BOOL fOk = FALSE;
    6.     if ( (pwName != NULL) && OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES, &hToken) )
    7.     {
    8.         if (LookupPrivilegeValue (NULL, (LPCSTR)pwName, &tp.Privileges->Luid) )
    9.         {
    10.             tp.Privileges->Attributes = SE_PRIVILEGE_ENABLED;
    11.             tp.PrivilegeCount = 1;
    12.  
    13.             fOk = AdjustTokenPrivileges (hToken, FALSE, &tp, 0, NULL, NULL) && (GetLastError () == ERROR_SUCCESS) ;
    14.         }
    15.  
    16.         CloseHandle (hToken);
    17.     }
    18.  
    19.     return fOk;
    20. }
     
  4. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    int2eh
    DebugPrivileges тут не при чем. Я говорю о правах, с которыми открыт хэндл.

    gilg
    Жаль. Поменять права без выхода в ринг0 тоже не получится...
    Придется искать обходные пути для решения поставленной задачи.
     
  5. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Twister
    на всякий случай: у csrss есть хэндлы всех процессов с монопольными правами. Только остается вопрос как определить что два хэндла выданы на один и тот же объект.
     
  6. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Для доступа к csrss, как и к любым другим системным процессам, структурам и т.д., нужны права System. Если бы они были, можно было бы просто сменить права для имеющегося хендла.
     
  7. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    slow
    Это я имел ввиду с самого начала, но, как ты правильно заметил, в решении проблемы это врядли поможет.
    Неа... для доступа к csrss достаточно подрубить привилегии отладчика.
     
  8. int2eh

    int2eh Alexander Leevy

    Публикаций:
    0
    Регистрация:
    19 авг 2007
    Сообщения:
    106
    Адрес:
    Москва
    Хмм... Так c такой привилегией ты можешь открыть HANDLE с правами на всё.
     
  9. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    gilg
    а вот права у хэндла поменять - это надо в ядерные структуры писать. хотя из под юзера тоже можно (device\physicalmemory)
     
  10. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Ага. Но для системных процессов в нормальной ситуации они есть только у System и Administrator ;)
     
  11. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
  12. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    А по-моему у Администраторов по умолчанию эта привилегия не включена. Хотя это уже оффтоп... Тему пора прикрыть.
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    все равно это запись в ядерные структуры ) Ты бы еще назвал ZwSystemDebugControl и сказал что это юзермодный метод :)
     
  14. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Great
    а что, нет что-ли? фактически так и есть. ))))
     
  15. Songoku

    Songoku Эдгар

    Публикаций:
    0
    Регистрация:
    1 мар 2003
    Сообщения:
    68
    Адрес:
    Belarus
    Есть идея ... а что если например с помощью DuplicateHandle сделать клон, и поменять dwDesiredAcces на PROCESS_QUERY_INFORMATION, а потом спомощью NtQueryInformationProcess узнать pid дубликата ...
     
  16. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Хэндл процесса открыт только с флагом PROCESS_TERMINATE. DuplicateHandle не отработает.
     
  17. Songoku

    Songoku Эдгар

    Публикаций:
    0
    Регистрация:
    1 мар 2003
    Сообщения:
    68
    Адрес:
    Belarus
    а ты попробуй ...DuplicateHandle всё равно какой флаг ...
     
  18. Songoku

    Songoku Эдгар

    Публикаций:
    0
    Регистрация:
    1 мар 2003
    Сообщения:
    68
    Адрес:
    Belarus
    вот .... смотри если не веришь..

    Код (Text):
    1.    
    2.         _handle dd ?
    3.         ...
    4.         invoke  GetCurrentProcess
    5.         mov     edi,eax
    6.         invoke  GetCurrentProcessId
    7.         invoke  OpenProcess,PROCESS_TERMINATE,0,eax
    8.         mov     ebx,eax
    9.         invoke  DuplicateHandle,edi,ebx,edi,_handle,PROCESS_QUERY_INFORMATION,0,0
    10.         invoke  GetProcessId,[_handle]
    11.         ; eax вот тут твой PID
    12.         invoke  CloseHandle,[_handle]
    13.         invoke  CloseHandle,ebx
     
  19. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Songoku
    ну ты вообще соображаешь что говоришь или нет?
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Код (Text):
    1.     HANDLE hProcess = OpenProcess( PROCESS_TERMINATE, 0, 3972 );
    2.     HANDLE hDuplicated;
    3.  
    4.     BOOL ret = DuplicateHandle( GetCurrentProcess(), hProcess, GetCurrentProcess(), &hDuplicated, PROCESS_QUERY_INFORMATION, 0, 0 );
    5.  
    6.     if( ret )
    7.         printf("Duplicated OK, h=%08x\n", hDuplicated);
    8.     else
    9.     {
    10.         DWORD errcode = GetLastError();
    11.         char *err;
    12.         FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER, 0, errcode, 0, (LPSTR)&err, 1024, 0);
    13.         printf("Duplication failed, last error = %d:\n%s\n", errcode, err);
    14.         return 0;
    15.     }
    16.  
    17.  
    18.     PROCESS_BASIC_INFORMATION pbi = {0};
    19.     NTSTATUS Status;
    20.     ULONG lret;
    21.  
    22.     Status = NtQueryInformationProcess( hProcess, ProcessBasicInformation, &pbi, sizeof(pbi), &lret );
    23.  
    24.     if( Status == 0 )
    25.         printf("Query OK, PID = %d\n", pbi.UniqueProcessId);
    26.     else
    27.         printf("Query failed, status=%08x\n", Status);
    28.  
    29.     Status = NtQueryInformationProcess( hDuplicated, ProcessBasicInformation, &pbi, sizeof(pbi), &lret );
    30.  
    31.     if( Status == 0 )
    32.         printf("Query OK, PID = %d\n", pbi.UniqueProcessId);
    33.     else
    34.         printf("Query failed, status=%08x\n", Status);
    35.    
    36.     CloseHandle(hDuplicated);
    37.     CloseHandle(hProcess);
    У меня получилось выставить права PROCESS_QUERY_INFORMATION. Она видимо в данном случае не смотрит особо на права старого хендла.

    Далее, NtQueryInformationProcess() завершилась с ошибкой для первого хендла и с успехом для второго.