Поиск процессов через Менеджер Объектов

Тема в разделе "WASM.NT.KERNEL", создана пользователем AlexCasual, 6 июл 2011.

  1. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    Если я всё правильно понимаю,то при создании процесса Менеджер объектов создаёт соответсвующий объект,так вот,можно ли каким-либо образом через интерфейс Менеджера объектов получить список всех процессов в системе(просматривая все его объекты и связанные с ними структуры)?
    С Менеджером объектов у меня много неясностей,если я в чём-то заблуждаюсь,помогите пожалуйста разобраться,киньте ссылок соответсвующей тематики...
    Спасибо!
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Да, это можно сделать, только не "в лоб", т.е. у менеджера объектов ядра нет такой функции как "получить список процессов". Самое простое (и наименее надёжное), что можно сделать, это позвать сервис исполнительной подсистемы ZwQuerySystemInformation() с классом SystemProcessInformation. Метод ненадёжный, т.к. данные легко подменить в перехватчике сервиса, но если ты не пишешь антируткит, то используй этот способ и не парься. Немного усовершенствованный способ заключается в вызове этого же сервиса, но с классами SystemExtendedHandleInformation и SystemObjectInformation, при чём именно оба сразу, для сопоставления указателей на объекты процессов, а использование только одного SystemObjectInformation ничего не даст, доступ к объектам всё равно там не получишь, т.к. они не референсенные возвращаются. Но тут данные также можно подменить в перехватчике, так что для антируткита тоже не самое лучшее решение. Гораздо правильнее было бы использовать колбеки подсистемы управления потоками/процессами, т.к. свежесоздаваемый процесс не имеет никаких шансов избежать их, ну а там уже просто - ведёшь список, поддерживаешь его при создании/удалении процессов/потоков и, когда надо, обращаешься именно к этому списку вместо ядра.
     
  3. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    x64
    Годный способ для недетекта, поддерживаю. Вам уже давно пора покинуть аверскую сверу деятельности. Вы вроде как человек ценный :)
     
  4. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    Суть именно в том и состоит,чтобы получить список ВСЕХ процессов для выявления скрытых...Просто думал,что это можно сделать каким-то образом через менеджер объектов...То есть,как я понимаю,в нём никакой информации о процессе не хранится?Список имён он не хранит?
    Но ведь нотификаторы на создание/удаление процессов тоже можно подменять,так?...
     
  5. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    1) Перехват диспатча систмных вызовов, рано или поздновсе равно ведь вызовет
    2) шаддулер процессов
    3) менеджер пяти, все равно ведь страницы для процессов долшны быть описаны
     
  6. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    shchetinin
    Есчо миллионы инструкций. На сисколах мир не сошёлся и тред юзает остальное ядро.
     
  7. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    klzlk
    согласен, просто самое простое и эфективное, точнее что в глаза в явном виде бросается ...
     
  8. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    shchetinin
    KiFastCallEntry() ничем не лучше 20-й инструкции в KiDispatchInterrupt() или 10-й в какойнить ExBlockPushLock(). Всёравно выпиливается такой мониторинг одним нажатием кнопки =)
     
  9. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    klzlk
    В принципе да, так что остаетася шаддулер и все что с ним связано ...
     
  10. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    То есть,как я понимаю,нет способа поползать по внутренним структурам Менеджера объектов в поисках созданных процессов?
    Или всё же Менеджер объектов хранит в своих дерикториях имена созданных им процессов?
    А вот как,к примеру работает функция OpenProcess? - Откуда она получает необходимый идентификатор?
     
  11. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Менеджер объектов хранит в своих структурах (списках) информацию только о тех объектах, которые имеют имя. Процессы, потоки, и некоторые других объекты ядра в этом плане немного отличаются - они, как правило, имён не имеют (хотя на практике это возможно, но никаких документированных средств для этого не существует), поэтому хранить их менеджеру объектов просто не за чем, вместо этого процессы/потоки управляются собственной подсистемой (подсистема поддержки процессов/потоков, она же Ps).

    Нет, см. выше.

    Через таблицу процессов PspCidTable.
     
  12. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    AlexCasual
    В книге Rootkit arsenal описывается способ поиска скрытых процессов через HandleTable. Я не помню сейчас деталей, но можно посмотреть в книге, пример называет "NoFU". Помогает найти процессы, которые были выброшены из кольцевого списка процессов.

    Да, забыл сказать -- пример использует недокументированную структуру _EPROCESS, поля которой могут меняться даже в SP, поэтому придется писать под каждую версию. Но, как я понимаю, это не проблема.
     
  13. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    Всем большое спасибо за ответы!