Как определить по ID процесса, что это за процесс, если такого ID не значится в списке процессов? Система такая: я в режиме ядра сделал перехват Native API и там в отладочную консоль выдаю ID процесса, который вызывает эту функцию. Получил кучу идентификаторов, которые не видно например через PHunter. Типа 64968... Ну и небольшие числа тоже есть. Так вот что это за процессы?
Этоп роцессы которые завершились, но на них есть ссылка либо хэндл, и поэтому они еще остаются в списках ядра. phunter отмечает такие процессы как deleted. Вообще, основной недостаток скана PsActiveProcesses как раз в том, что в списке часто остаются такие "левые" процессы, при этом сама структура процесса часто бывает разрушена, и поэтому вместо нормального имени и pid отображается фигня. Я скоро выпущу phunter 1.1, в котором постараюсь решить проблему надежного отсеивания этого мусора попадающегося при сканировании.
Да я проверял в PHunter'e... Там даже помеченных "delete" не было таких ID. Да и вообще как завершённые процессы могут вызывать Native API? Это всё к тому, что я перехватил NtOpenProcess и блокирую все такие вызовы для процесса одной игрушки. После этого в ней пропал звук... Вот теперь думаю: как связан вызов NtOpenProcess и работа звука?
Провёл эксперимент. Вызвал PsLookupProcessByProcessId для всех процессов... Оказалось, что один процесс имеет EPROCESS, находящийся по адресу 0xB9... Так вот я открыл доступ всем процессам, чей PEPROCESS < 0xFFFF. Звук заработал. А кто может объяснить что это за процессы? Может почитать Соломона и Руссиновича? У меня есть... Но какую главу?
Очень странное явление, впервые о таком слышу. Хотелось бы узнать версию системы, установленые сервиспаки, имя процессов которые имеют такой крайне странный EPROCESS и охото посмотреть на код который дал такие странные результаты. EPROCESS в этом диапазоне адресов (как и любые другие данные) просто невозможен.
Ms Rem, твоя же работа... Только немного переделанная: http://www.dubki.ru/~drakon/NoTerminate.zip Вообще, если даже ты впервые о таком слышишь, то значит я что-то совсем не то в коде сделал.
Нашёл ошибку... Просто определение структуры EPROCESS использовал из винды 2000... А сижу на ХР... Ну, так вот. Выяснилось, что всё дело в svchost и lsass... Если их блокировать, то пропадает звук. А вот как определить, что это не "вражеские" процессы? У них есть отличительные особенности?
Я забыл добавить "если блокировать ZwWriteVirtualMemory". Я с этим столкнулся когда протектор отлаживал.
Ms Rem хороший у нас диалог получился... В чат бы. =) Ты в ICQ бываешь когда-нибудь? А насчёт svchost и lsass - я смотрю в диспетчере задач они бывают только "SYSTEM", "LOCAL SERVICE", "NETWORK SERVICE"... Ну, так вот откуда в нулевом кольца взять имя пользователя процесса? Я смотрю, у тебя аналогичная проблема с csrss была... Как ты обнаружил, что он имеет спицифичные только ему именованные объекты?
Drakon вообщето в одной из своих статей MS-REM писал, что для этого творит данный процесс. Почитай невзначай)
Drakon, алгоритм примерно такой: 1. NtOpenThreadToken или NtOpenProcessToken(если первая не пройдет) 2. выделяешь под SID память PTOKEN_OWNER 3 NtQueryInformationToken(..,..,SID,..,..) вроде как все, конечно же не забывай удалять за собой мусор
Итак, если кому интересно - я выловил все уникальные хэндлы, открытые в csrss, svchost, lsass. Сделал это так: через Process Explorer (www.sysinternals.com) записал в файл все открытые хэндлы для нескольких процессов. Потом написал анализатор этих файлов на Perl и получил результат. Всё это можно скачать отсюда: http://www.dubki.ru/~drakon/handles.zip Соответственно, файлы result_*.txt - это уникальные хэндлы для процессов. P. S. Исходную проблему решил совсем по-другому. А это так... Чтобы и таким способом тоже решить.