Pull to refresh

Теория о сокрытии процессов руткитами (DKOM)

Reading time 3 min
Views 3.8K
В данной статье мы попробуем рассмотреть в теории один из самых серьезных методов сокрытия информации руткитами, а именно прямая манипуляция объектами ядра (Direct Kernel Object Manipulation, DKOM), применяемая для сокрытия процессов от операционной системы в целом. Если Вы скрипт-кидди, то читайте «скрываем процессы в винде!». Начнем с начала:
В нашем случае, руткит — модуль ядра (в случае с Windows — драйвер) применяемый для расширения возможностей управления операционной системой (в конце концов, root и kit). Мы не будем различать применяет ли его администратор или злоумышленник. Руткит работает на нулевом кольце (так называемом ring0) операционной системы. В случае с Windows требует корректной (не обязательно документированными методами) установки в систему, на что, как правило, нужны права администратора. Заметим, что под объектами мы будем понимать структуры в оперативной памяти, описывающие один процесс в операционной системе (вину за путаницу в терминах я перенесу на документацию от Microsoft). В ОЗУ информация о запущенных процессах хранится в двусвязном списке этих самых объектов.

Ближе к коду
Актуально для WinXP, на остальных что старше NT думаю аналогично.
И так, мы уже в ring0 (как мы сюда попали — другая история). Мы процессор, идущий по коду реализованного драйвера и мы попали в функцию сокрытия процесса с одним аргументом — pid при помощи DKOM. Для попадания на легендарный двусвязный список процессов нам надо найти хотя бы один элемент из этого списка. Поиск грубой силой не рационален, особенно когда мы можем найти указатель на свой же процесс. Давайте посмотрим как мы будем это делать. По ходу кода мы встречаем фукцию PsGetCurrentProcces. Благо мы процессор и мы знаем, что этого ничто иное как

mov eax, fs:0x00000124
mov eax, [eax + 0x44]
ret


В регистре fs по смещению 0x124 ничто иное как структура ETHREAD текущего потока, в которой по смещению 0x44 лежит указатель на структуру процесса-владельца этого потока. Таким образом мы получаем указатель на наш процесс. Далее все просто. В каждой структуре есть указатель на предшествующий и на следующий процесс в цепочке процессов. Пробегаемся по указателям до процесса с необходимым pid. При выполнении тривиальной манипуляции над указателями, исключающей процесс из двусвязного списка заставляет ОС забыть о существовании процесса (по крайней мере пока она смотрит своими обыденными методами). Арес на скрываемый процесс можно запомнить, на случай, если мы захотим вернуть его в строй.
Предугадывая вопрос, отвечаю: скрытый процесс продолжает функционировать нормально потому, что ОС выделяет процессорное время не на процессы а на потоки.

Заключения
В принципе, обнаружение этой махинации не является не выполнимой задачей. Тем не менее, большая часть антивирусов прибывает в спокойствии как при созерцании самого драйвера, так и во время его исполнения.
Это не единственный метод сокрытия процессов руткитами. Но DKOM выделяется среди них как один из самых незаметных (вероятно не долго так будет), так как работает непосредственно над обрабатываемыми данными, а не над средствами их обработки. Также заметим, что DKOM актуален не только для процессов.

P.S.
Все довольно абстрагировано с целью донести инормацию до максимально широкого круга. Грузить техническими подробностями не для всех было бы приятно, а для тех кому интересно, без труда их нагуглят.
Долго думал в какой блог отнести, выбирал между системным программированием и этим. Но тема программирования тут почти не раскрывается, по этому выбрал этот, как информация о том, как бывает…

Если будет интересно, расскажу о остальных популярных методах.
Tags:
Hubs:
+24
Comments 16
Comments Comments 16

Articles