Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 131
1

Как получить хэндлы системного процесса?

12.06.2016, 23:18. Показов 3242. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Пытаюсь получить handle какого-нибудь системного процесса. Нашел в инете пример, который выставляет своему процессу привилегию SE_DEBUG_NAME. Ошибок при установке этой привилегии не пишет. Однако хэндл системного процесса получить не дает - ошибка доступа при OpenProcess. В чем может быть дело? PID ввожу вручную. Пишу под 10-й виндой в VS.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DWORD pID = 788;
    
    HANDLE  pHandle, hProc = GetCurrentProcess(), tHand = NULL;
    BOOL fEnable = 0;
    
    
    
    if (!OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES, &tHand)) cout << "Error OpenToken:" << GetLastError() << endl;
    TOKEN_PRIVILEGES tp;
    tp.PrivilegeCount = 1;
    if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid)) cout << "Error LookUp:" << GetLastError() << endl;
    tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
    if (!AdjustTokenPrivileges(tHand, FALSE, &tp, sizeof(tp), NULL, NULL)) cout << "Error Adjust: " << GetLastError() << endl;
    CloseHandle(tHand);
 
    pHandle = OpenProcess(PROCESS_QUERY_INFORMATION, TRUE, pID);
    if (pHandle == 0) cout << pHandle << endl << "Error OpenProcess: " << GetLastError() << endl;
    else cout << "HANDLE: " << pHandle << endl;
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.06.2016, 23:18
Ответы с готовыми решениями:

Как получить имя каждого процесса?
Как мне получить имя каждого процесса, протекающего в ОС?

Как получить контекст чужого процесса ?
Пробую получить контекст чужого процесса на х64 системе. ...

Как получить все дочерние окна процесса?
Получаю все процессы, нахожу нужный, но мне еще нужны вложенные окна типа Ebit и им подобным,...

Как получить HWND окна/процесса/консоли
Как получить HWND окна/процесса/консоли? мне надо для Shellexecute. Реализация в Dll #include...

16
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
13.06.2016, 10:37 2
Лучший ответ Сообщение было отмечено _lunar_ как решение

Решение

Начиная с Windows Vista и выше, некоторые процессы могут быть "защищенными", т.е.
их не удастся открыть с некоторыми правами ни под администратором, ни под системой, и
даже SE_DEBUG_NAME здесь не поможет. В Windows 8.1 этот механизм был еще больше
усилен - "Protected Processes Light" (информация есть в блоге A. Ionescu).

И я советую на Vista и выше использовать PROCESS_QUERY_LIMITED_INFORMATION -
больше шансов, что этот флаг не фильтруется защитой для некоторых процессов.
2
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 131
13.06.2016, 16:51  [ТС] 3
Я врубил в цикле попытки открыть все непользовательские процессы, перебирая по очереди права. Так вот у меня из около 50 процессов только 2 вернули дескриптор с правом SINHRONIZE. Все остальное - ошибка доступа. Получается, что тут не некоторые процессы защищены, а все и почти от всего. Если можно открыть процесс с правом SINHRONIZE, можно ли теоретически сделать deadlock с участием этого процесса?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
13.06.2016, 18:48 4
Цитата Сообщение от NatiF Посмотреть сообщение
Я врубил в цикле попытки открыть все непользовательские процессы, перебирая по очереди права. Так вот у меня из около 50 процессов только 2 вернули дескриптор с правом SINHRONIZE. Все остальное - ошибка доступа.
А ты уверен, что у тебя включается привилегия SE_DEBUG_NAME?
Можно Process Explorer-ом посмотреть, например. Дело в том, что TRUE на
AdjustTokenPrivileges еще ничего не означает, надо GetLastError еще звать и
проверять, что он ERROR_SUCCESS (см. AdjustTokenPrivileges в MSDN -
там это есть).
2
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 131
13.06.2016, 19:46  [ТС] 5
Точняк, не устанавливается. 1300 возвращает, а это fail. Получается нет доступа к структуре TOKEN PRIVILEGES. А его нет, потому что в маркере к ней нет доступа. Тут гостевая учетка. В каком же направлении тут копать дальше?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
13.06.2016, 19:51 6
Под гостевой учеткой ты никак не откроешь системные процессы.
Если они только сами не разрешат.
0
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 131
13.06.2016, 20:22  [ТС] 7
Самое интересное, что и из группы "Администраторы" не удается получить SE_DEBUG
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
13.06.2016, 21:09 8
Цитата Сообщение от NatiF Посмотреть сообщение
Самое интересное, что и из группы "Администраторы"
А как ты определяешь, что у процесса есть права администратора?
0
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 131
13.06.2016, 21:13  [ТС] 9
Никак. Предположение, что он в маркере наследует информацию от группы. А процесс запущен из группы "Администраторы"
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
13.06.2016, 21:14 10
Кстати,
C++
1
BOOL fEnable = 0;
Здесь fEnable должно быть 1, т.е. включить привилегию, а не выключить.
И процесс запускать от имени администратора (правой кнопкой мыши клик
на exe файле, далее в контекстном меню выбрать "Запуск от имени
Администратора").
1
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 131
14.06.2016, 16:57  [ТС] 11
Заработало) Спасибо. Теперь открывает кучу хэндлов на процессы с правами. И AdjustToken возвращает нуль в качестве кода ошибки. Надо еще реализовать в коде запуск от админа, ну... чтоб не мышкой)

Добавлено через 19 часов 26 минут
Пытаюсь вот такой манифест подключить к проекту. Сохранил его в UTF-8, добавил в проекте в Resourse Files. В опциях линкера отключил Generate Manifest и поставил там highestAvailable. Не работает, файл запускается в обычном режиме. Пробовал в код вставить 1 24 "C:\\addon.xml", тоже без реакции. Что может быть не так?

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 
<assembly
  xmlns="urn:schemas-microsoft-com:asm.v1"
  manifestVersion="1.0">
 
  <assemblyIdentity
    type="win32"
    name="CyberDYNE"
    version="1.0.0.0"
    processorArchitecture="*">
  </assemblyIdentity>
 
  <description>File managment improved control</description>
 
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="highestAvailable"
          uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
 
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
 
      <!-- Windows 10 -->
      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"></supportedOS>
 
         </application>
  </compatibility>
 
  <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <dpiAware
          xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True/PM</dpiAware>
    </windowsSettings>
  </application>
 
</assembly>
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.06.2016, 17:43 12
Exe в студию!
0
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 131
14.06.2016, 17:54  [ТС] 13
Вот.
Вложения
Тип файла: rar inject.rar (11.5 Кб, 11 просмотров)
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.06.2016, 19:10 14
В этом exe вообще нет манифеста.
0
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 131
16.06.2016, 13:25  [ТС] 15
А в этом?
Вложения
Тип файла: rar rights.rar (11.9 Кб, 8 просмотров)
0
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 131
17.06.2016, 13:46  [ТС] 16
Убежденный, в ресурсах вроде появился файл rights.xml, и в окошке появился rights.rc в двоичном виде. Может его еще где-то указать надо?
0
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 131
22.06.2016, 15:05  [ТС] 17
Разобрался! Нужно было включить Generate Manifest:yes в опциях линкера. Теперь при запуске выводится окошко UAC.
0
22.06.2016, 15:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.06.2016, 15:05
Помогаю со студенческими работами здесь

Различные хэндлы
Как известно все хэндлы, которые используются в win api есть не что иное как указатели на void....

Хэндлы hProcess и hThread
Объясните, пожалуйста, для чего в программе используются хэндлы процесса и потока (hProcess,...

Получить id процесса родителя, если исходный id процесса дочерний
Добрый день. У меня есть вот такой код на C#, который должен позволить получить id процесса...

Как получить имя процесса?
Начал писать диспетчер задач. Получаю список процессов. deque&lt;PROCESSENTRY32&gt; deq; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru