PRODIGY: Проблемы с OpenProcess() на Windows-7
PRODIGY
Member
Автор темы
34/46 ответов
7 лет на iXBT, с августа 2017
Инфо Ответить
P
PRODIGY MemberАвтор темы
3 года назад / 14 февраля 2022 06:25
Всем привет!
Столкнулся с такой проблемой.. (Win7-x32, пишу на ассемблере FASM)
Мне нужно получить дескрипторы (Handle) всех активных процессов, чтобы просмотреть их токены OpenProcessToken(). Для этого делаю Snapshot, и в цикле Process32Next() получаю PID процессов, которые далее передаю в OpenProcess().

Проблема в том, что Process32Next() отрабатывает исправно (смотрел в отладчике) и на каждой итерации в OpenProcess() передаётся валидный PID. При ошибке она должна возвращать нуль, но в регистре EAX я всегда получаю одинаковое значение 0x9C, хотя в отладчике пишет "ErrorSuccess". Пробовал через тот-же OpenProcess() получить дескриптор своего процесса, но тогда опять Success, а в EAX всегда 44h. Просмотрел таблицу статусных кодов на MSDN для этих значений, и там указано:
#define ERROR_TOO_MANY_NAMES     0x44 (68L)
//
// MessageId: ERROR_TOO_MANY_NAMES
// The name limit for the local computer network adapter card was exceeded.
// (Превышено ограничение на имя карты сетевого адаптера локального компьютера)

#define ERROR_SIGNAL_REFUSED 0x9c (156L)
//
// MessageId: ERROR_SIGNAL_REFUSED
// The recipient process has refused the signal.
// (Процесс-получатель отказался от сигнала)
Первый вообще бред какой-то, а второй более похож на правду..
В описании OpenProcess() говорится, что для доступа к сис.процессам нужна привилегия SE_DEBUG, которую я получил (смотрел в ProcessHacker для своего процесса). Подозреваю, что дело в "Уровнях целостности процессов" (Integrity Level), который ввели начиная с Висты. Данная функция возвращает ОК только с тремя флагами: SYNCHRONIZE, PROCESS_TERMINATE, и PROCESS_QUERY_LIMITED_INFORMATION - в остальных случаях получаем ошибку доступа(5).

Но тогда почему она не возвращает валидный хэндл для моего-же процесса?, ведь уровень должен это позволять. Кто-нибудь в курсе, почему такая проблема с OpenProcess(). Или может есть иной вариант получить хэндлы всех активных процессов? Вот мой код, который запускаю от админа, и результат его работы:

format   pe console
include 'win32ax.inc'
entry    start
;//----------
.data
pe32            PROCESSENTRY32
 
;//---- Структура "TOKEN_PRIVILEGES"
align 16
newState:
PrivilegeCount  dd  1
Luid1           dq  0
Attribute1      dd  SE_PRIVILEGE_ENABLED
 
errMes          rb  64
sidStr          rb  64
Name            rb  128
DomainName      rb  128
cbName          dd  128
cbDomainName    dd  128
peUse           dd  0
 
align 16
hToken          dd  0
hSnap           dd  0
pcbBytesNeeded  dd  0
 
align 16
buff            db  0
;//----------
.code
start:   invoke  SetConsoleTitle,<'*** Session info ***',0>
 
;//----- Запрашиваю уровень целостности своего процесса ----------
         invoke  OpenProcessToken,-1,TOKEN_QUERY,hToken
         invoke  GetTokenInformation,[hToken],\
                                     TokenIntegrityLevel,\
                                     buff,32,pcbBytesNeeded
         mov     esi,dword[buff]
         push    esi
         invoke  ConvertSidToStringSid,esi,sidStr
         pop     esi
         invoke  LookupAccountSid,0,esi,\
                                  Name,cbName,\
                                  DomainName,cbDomainName,peUse
         invoke  CharToOem,Name,Name
         invoke  CharToOem,DomainName,DomainName
        cinvoke  printf,<10,' Integrity Level.....:  %s  (%s, %s)',0>,\
                         dword[sidStr],DomainName,Name
         invoke  CloseHandle,[hToken]
 
;//----- Попытка получить хэндл своего процесса ------------
         invoke  GetCurrentProcessId
         push    eax
         invoke  OpenProcess, PROCESS_TERMINATE, FALSE, eax
         pop     ebx        ;//<--- EBX = PID
         push    eax        ;//<--- EAX = Handle
        cinvoke  printf,<10,' Current Process Hndl:  0x%x. PID: %d',10,0>,eax,ebx
         pop     eax
         invoke  CloseHandle,eax
 
;//----- Выставляю привилегию "SeDebug" в своём токене!
         invoke  GetCurrentProcess
         invoke  OpenProcessToken,eax,\
                                  TOKEN_QUERY + TOKEN_ADJUST_PRIVILEGES,hToken
         invoke  LookupPrivilegeValue,0,<'SeDebugPrivilege',0>,Luid1
         invoke  AdjustTokenPrivileges,[hToken],0,newState,0,0,0
         or      eax,eax
         jnz     @f
        cinvoke  printf,<10,' SeDebugPrivilege error!',0>
         jmp     @exit
@@:      invoke  CloseHandle,[hToken]
 
;//------------------------------------------
        cinvoke  printf,<10,23 dup(' '),'PID     Hndl    LastError',\
                         10,23 dup(' '),'----    -----   -------------------',10,0>
 
;//----- Обход всех активных процессов
         invoke  CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
         mov     [hSnap],eax
         invoke  Process32First,[hSnap],pe32
@next:   invoke  Process32Next,[hSnap],pe32     ;// EAX=0: ошибка
         or      eax,eax
         je      @stop
         mov     eax,[pe32.th32ProcessID]
         invoke  OpenProcess, PROCESS_QUERY_LIMITED_INFORMATION, 0, eax
         or      eax,eax
         je      @fuck
 
         push    eax eax     ;//<---- EAX должен быть хэндл, но всегда получаю 0x9C
         mov     esi,pe32
         add     esi,PROCESSENTRY32.szExeFile
        cinvoke  printf,<' %-20s  %4d    %04x',0>, esi, [pe32.th32ProcessID], eax
         pop     eax
         call    GetError
         pop     eax
         invoke  CloseHandle,eax
@fuck:   jmp     @next
 
@stop:   invoke  CloseHandle,[hSnap]
@exit:  cinvoke  _getch     ;// клавиша
        cinvoke  exit,0     ;// выход!
 
;//**** Расшифровка сообщений об ошибке ***************************
GetError:
         invoke  GetLastError
         invoke  FormatMessage,FORMAT_MESSAGE_FROM_SYSTEM,0,eax,0,errMes,128,0
         invoke  CharToOem,errMes,errMes
        cinvoke  printf,<'    %s',0>,errMes
ret
;//****************************************************************
 
section '.idata' import data readable
library  msvcrt,'msvcrt.dll',kernel32,'kernel32.dll',\
         user32,'user32.dll',advapi32,'advapi32.dll'
include  'api\msvcrt.inc'
include  'api\kernel32.inc'
include  'api\user32.inc'
include  'api\advapi32.inc'
include  'equates\advapi32.inc'
К сообщению приложены файлы:
vertur
Member
6064/9994 ответов, #5 в рейтинге
16 лет на iXBT, с марта 2008
Чаще пишет РІ "Программирование" (52%)
Гондурас, default city
Инфо Ответить
v
vertur Member
3 года назад / 14 февраля 2022 12:26
PRODIGY
Может стоит попробовать вот так ?
invoke  OpenProcess, PROCESS_QUERY_LIMITED_INFORMATION, FALSE, eax

Добавление от 14.02.2022 12:26:

PRODIGY

При ошибке она должна возвращать нуль, но в регистре EAX я всегда получаю одинаковое значение 0x9C, хотя в отладчике пишет "ErrorSuccess". Пробовал через тот-же OpenProcess() получить дескриптор своего процесса, но тогда опять Success, а в EAX всегда 44h.
А какие значения будут если не закрывать полученые хендлы ? Разные ?
PRODIGY

Просмотрел таблицу статусных кодов на MSDN для этих значений,
Ну и зачем ? К кодам ошибок HANDLE не имеет никакого отношения.


PS:
Вообще я бы не советовал использовать FASM по причине его забагованости и знаментой упертости разработчиков в нежелании исправлять баги.
Могу посоветовать YASM как разумную альтернативу.
PRODIGY
Member
Автор темы
35/47 ответов
7 лет на iXBT, с августа 2017
Инфо Ответить
P
PRODIGY MemberАвтор темы
3 года назад / 14 февраля 2022 12:37
vertur
Я пробовал менять FALSE\TRUE, подставлял все (из трёх) флагов доступа в первый параметр - всё равно в отладчике и в консоли возвращает 0x9c. Сейчас думаю уже сервис написать, чтобы через пайп отправлял мне результат OpenProcess(). Помнится на ХР такой код отрабатывал нормально, а вот с Win7+ проблемы.
PRODIGY
Member
Автор темы
36/48 ответов
7 лет на iXBT, с августа 2017
Инфо Ответить
P
PRODIGY MemberАвтор темы
3 года назад / 14 февраля 2022 12:43
Если внутри цикла хэндлы не закрывать, то получаю с шагом DWORD разные значения, начиная с 0xA4
К сообщению приложены файлы:
vertur
Member
6066/9996 ответов, #5 в рейтинге
16 лет на iXBT, с марта 2008
Чаще пишет РІ "Программирование" (52%)
Гондурас, default city
Инфо Ответить
v
vertur Member
3 года назад / 14 февраля 2022 12:46
PRODIGY

то получаю с шагом DWORD разные значения, начиная с 0xA4
Бинго! Значит всё работает правильно.
Просто для каждого процесса аллоцируется обьект в одном и том же месте (и соответсвенно с одним и тем же численным значением хендла).
Если хендл не закрывать то аллоцируется новый обьект в другом месте. Видимо так.
PRODIGY
Member
Автор темы
37/49 ответов
7 лет на iXBT, с августа 2017
Инфо Ответить
P
PRODIGY MemberАвтор темы
3 года назад / 15 февраля 2022 05:00
vertur

Бинго! Значит всё работает правильно.
Если хендл не закрывать то аллоцируется новый обьект в другом месте. Видимо так.
Всё верно, так и получается.
Оказывается код работает исправно, просто хэндл возвращал в одно и то-же поле списка дескрипторов процесса. Хоть оставить в цикле CloseHandle(), хоть убрать - в обоих случаях возвращает валидный хэндл. На рис.ниже шаг получается 8-байт, поскольку внутри цикла вызывается процедура, в которой дескриптор так-же не закрывается. Кол-во открытых дескрипторов можно наблюдать в диспетчере-задач, на соответствующей вкладке. Спасибо Вам большое за наводку.
К сообщению приложены файлы:
Ваш ответ:

Нет значка Нет значка Р’РѕС‚ тут! Лампочка Восклицание Р’РѕРїСЂРѕСЃ Класс! Улыбка Злость Огорчение РџРѕРіРѕРІРѕСЂРёРј? Краснею Подмигивание Ругаю РћРґРѕР±СЂСЏСЋBIUdelSxsupxsuboffsp spoilerqurlimgvideo• list1. list1 codeprecenter-hr-rusQWE→ЙЦУ
файлыочистить
Ваше имя: Авторизуйтесь Предпросмотр В полную форму
вставить выделенную цитату в окно ответа
Если Вы считаете это сообщение ценным для дискуссии (не обязательно с ним соглашаться), Вы можете поблагодарить его автора, а также перечислить ему на счет некоторую сумму со своего баланса (при отзыве благодарности перечисленная сумма не будет вам возвращена).
Также вы можете оценить сообщение как неудачное.
В течение суток можно 20 раз оценить сообщения разных участников (купите Premium-аккаунт, либо оплачивайте оценки сверх лимита).
Если Вы считаете это сообщение ценным для дискуссии (не обязательно с ним соглашаться), Вы можете поблагодарить его автора, а также перечислить ему на счет некоторую сумму со своего баланса (при отзыве благодарности перечисленная сумма не будет вам возвращена).
Также вы можете оценить сообщение как неудачное.
В течение суток можно 20 раз оценить сообщения разных участников (купите Premium-аккаунт, либо оплачивайте оценки сверх лимита).
Последние обсуждения в Конференции
23:50О степени вреда сотовой связи. Влияние сотовых телефонов на здоровье. Излучение. SAR. Моб. операторы
23:50Учим производителей как надо делать разъёмы питания (12VHPWR, ...) Видеосистема
23:49x86 против ARM и других RISC-процессоров Процессоры
23:49Расскажите кстати анекдот (только ржачный, не про Вовочку и не про Штирлица) Юмор
23:49Intel Atom и "все все все" Тех. поддержка
23:49Что творится с рынком недвижимости и как изменится цена? Общий
23:49NAS своими руками НАС
23:48Будет ли война России с Украиной? Политика
23:47Телевизоры TCL - информация и опыт использования ДК TV
23:46PC и консоли, и вновь продолжается бой Игры
23:45Выбираем бренди и коньяк. Культура употребления. Кулинария
23:45Выбор 4K/UHD медиаплеера ДК плееры
23:43Отзывы о PrivalSystems (аналог skype) Интернет
23:43Сравнение производительности современных процессоров Тесты CPU
23:42Вечер Boney M. в концертной студии "Останкино" Флуд
23:42Кубики артефакты при оцифровке с MiniDV Видеозахват
23:40Кто-то хочет в СССР? История
23:39Vision Pro - VR гарнитура от Apple MacLife
23:39Отечественные сериалы: обсуждаем, отслеживаем премьеры Кино
23:39Как вы относитесь к обязательной платной диагностике в мастерских?! Рынок
Последние темы без ответов
вчераBattlefield 2042 drweb Игры
вчераМышь лагает и плавает при запуске любого приложения Тех. поддержка
вчераLLM Qwen – возможности, опыт использования, ограничения ИИ
вчераНе могу прошить UUID на материнской плате ASRock H55M-LE ни с помощью amidedos ни ее версии под Windows - осталось только слить дамп биоса, редактировать в HEX-редакторе и шить обратно? Тех. поддержка
2 дня[Решено] Установил и успешно запустил пакет motion под OpenWRT, но не могу зайти на его админку и получить видеопоток с помощью VLC-плеера Unix
2 дняDenon dcd-3000 ремонт Стерео
4 дняThecus 4560/2520 поиск прошивки. НАС
4 дняИИ-агенты - что, зачем, как... ИИ
давноКуплю мини/микро ATX компьютер KOMOK
давноCounter-Strike экранизация Кино
23:50Samsung Galaxy S25 Ultra уже подешевел в Китае на 135 долларов, но скидка положена не всем
23:38Межзвёздный рубеж: New Horizons приближается к границе солнечного влияния
23:31Renault может вернуться в Россию, но свой завод, на котором сейчас выпускают «Москвичи», точно не получит
23:29Ключевой модуль лунной станции Gateway готовится к финальному путешествию через Атлантику перед стартом к Луне
23:22Космический аппарат Tianwen-2 прибыл на космодром Сичан для подготовки ко встрече с астероидом и кометой
23:06iPhone 16E оказался не только дороже, чем ожидалось, но и слабее. Его GPU урезан относительно iPhone 16
23:03Физики научились «видеть» движение электронов в молекулах
22:40Сингапурские учёные синтезировали сверхпрочный материал, который в восемь раз превзошёл прочность графена
22:35GeForce RTX 5070 и RTX 5060 тоже не будут доступны с нормальными ценами? У Nvidia какие-то проблемы с чипами, и массовое производство сдвигается
22:34«Пользы от нее очень мало». Илон Маск заявил о бесполезности Международной космической станции и позвал на Марс
20+ лет назад в этот день обсуждали
2002Фанера или ДСП? Цифр.звук
2002Хочется выделенку да вот не знаю... Сети
2002Шрифты в Adobe Acrobat 5 Прикладное ПО
2002Как определить в каком формате MODE1 или MODE2 записан образ? Оптич. носители
2002Глюк не знаю чего: видюха или Win2K Тех. поддержка
2002Дождемся KT333A или нет? Сист. платы
2003USB reader можно отключить руками. А как запустить? Фото
2004не могу отучить OnLineEye Pro 1.0 самостоятельно дозваниваться при загрузке системы Интернет
2005Помогите сохранить видео в Adobe Premiere Pro (v7) Видеозахват
2005Ваше мнение о сервере для 1С(1Гб dbf) на 10 пользователей ?! Серверы