Если я всё правильно понимаю,то при создании процесса Менеджер объектов создаёт соответсвующий объект,так вот,можно ли каким-либо образом через интерфейс Менеджера объектов получить список всех процессов в системе(просматривая все его объекты и связанные с ними структуры)? С Менеджером объектов у меня много неясностей,если я в чём-то заблуждаюсь,помогите пожалуйста разобраться,киньте ссылок соответсвующей тематики... Спасибо!
Да, это можно сделать, только не "в лоб", т.е. у менеджера объектов ядра нет такой функции как "получить список процессов". Самое простое (и наименее надёжное), что можно сделать, это позвать сервис исполнительной подсистемы ZwQuerySystemInformation() с классом SystemProcessInformation. Метод ненадёжный, т.к. данные легко подменить в перехватчике сервиса, но если ты не пишешь антируткит, то используй этот способ и не парься. Немного усовершенствованный способ заключается в вызове этого же сервиса, но с классами SystemExtendedHandleInformation и SystemObjectInformation, при чём именно оба сразу, для сопоставления указателей на объекты процессов, а использование только одного SystemObjectInformation ничего не даст, доступ к объектам всё равно там не получишь, т.к. они не референсенные возвращаются. Но тут данные также можно подменить в перехватчике, так что для антируткита тоже не самое лучшее решение. Гораздо правильнее было бы использовать колбеки подсистемы управления потоками/процессами, т.к. свежесоздаваемый процесс не имеет никаких шансов избежать их, ну а там уже просто - ведёшь список, поддерживаешь его при создании/удалении процессов/потоков и, когда надо, обращаешься именно к этому списку вместо ядра.
x64 Годный способ для недетекта, поддерживаю. Вам уже давно пора покинуть аверскую сверу деятельности. Вы вроде как человек ценный
Суть именно в том и состоит,чтобы получить список ВСЕХ процессов для выявления скрытых...Просто думал,что это можно сделать каким-то образом через менеджер объектов...То есть,как я понимаю,в нём никакой информации о процессе не хранится?Список имён он не хранит? Но ведь нотификаторы на создание/удаление процессов тоже можно подменять,так?...
1) Перехват диспатча систмных вызовов, рано или поздновсе равно ведь вызовет 2) шаддулер процессов 3) менеджер пяти, все равно ведь страницы для процессов долшны быть описаны
shchetinin KiFastCallEntry() ничем не лучше 20-й инструкции в KiDispatchInterrupt() или 10-й в какойнить ExBlockPushLock(). Всёравно выпиливается такой мониторинг одним нажатием кнопки =)
То есть,как я понимаю,нет способа поползать по внутренним структурам Менеджера объектов в поисках созданных процессов? Или всё же Менеджер объектов хранит в своих дерикториях имена созданных им процессов? А вот как,к примеру работает функция OpenProcess? - Откуда она получает необходимый идентификатор?
Менеджер объектов хранит в своих структурах (списках) информацию только о тех объектах, которые имеют имя. Процессы, потоки, и некоторые других объекты ядра в этом плане немного отличаются - они, как правило, имён не имеют (хотя на практике это возможно, но никаких документированных средств для этого не существует), поэтому хранить их менеджеру объектов просто не за чем, вместо этого процессы/потоки управляются собственной подсистемой (подсистема поддержки процессов/потоков, она же Ps). Нет, см. выше. Через таблицу процессов PspCidTable.
AlexCasual В книге Rootkit arsenal описывается способ поиска скрытых процессов через HandleTable. Я не помню сейчас деталей, но можно посмотреть в книге, пример называет "NoFU". Помогает найти процессы, которые были выброшены из кольцевого списка процессов. Да, забыл сказать -- пример использует недокументированную структуру _EPROCESS, поля которой могут меняться даже в SP, поэтому придется писать под каждую версию. Но, как я понимаю, это не проблема.