Описание методов работы руткитов

Discussion in 'Статьи' started by TaNkist, 19 Apr 2006.

  1. TaNkist

    TaNkist Elder - Старейшина

    Joined:
    6 Apr 2006
    Messages:
    147
    Likes Received:
    47
    Reputations:
    19
    Описание методов работы руткитов


    Каждый из нас хоть раз слышал о руткитах, это программы, способные остаться абсолютно незамеченными. Они сделают так, что ты даже не узнаешь об их присутствии, скрывая все свои процессы, файлы, соединения.
    Немногие пользователи знают, как руткит остается невидимым. Поэтому эта статья предназначена не для системных программистов, а для обычных юзеров, которые хотят узнать больше о своей операционной системе.
    Как известно программы работают с разными привилегиями. Все прикладные программы в Windows работают в третьем кольце (ring 3). Система и драйвера работают в ring0. Естественно возможностей у программ, работающих в нулевом кольце, значительно больше. Но не всегда возможно перейти из третьего в нулевое кольцо. Поэтому существует два типа руткитов: руткиты, работающие на прикладном и на ядерном уровне.
    Как известно для взаимодействия программ с системой существуют API-функции. Т.е. если программа хочет просмотреть список файлов в директории, она должна вызвать ряд API-функций. Соответственно, если мы не хотим, чтобы API-функция показывала какие-то файлы, мы должны ее изменить. Но перед тем, как изменять нужно знать, что нам нужно изменить. Это библиотеки kernel32.dll и ntdll.dll, в kernel32.dll находятся функции WinApi, а в ntdll.dll – Native Api. Изменять ntdll предпочтительней, так как она подгружается ко всем процессам и в ней содержатся переходники к функциям ядра. Но NativeApi плохо документировано и при написании прикладных программ практически не используется. Но перехватывая функции из kernel32 существует вероятность, что будет запущена программа, использующая только NativeApi, которая сдаст нас с потрохами.
    Итак, рассмотрим принципы перехвата Api на прикладном уровне.
    Способ первый – Замена библиотеки. Этот способ прост в понимании, но сложен в реализации и не лишенный недостатков. Во-первых, любой антивирус сразу же заметит изменения системных библиотек. Во-вторых, написать фейковую библиотеку не так просто и возможность того, что произойдет какой-нибудь глюк достаточна велика. В-третьих, для замены библиотеку нужно как минимум права админа. В-четвертых, таскать вместе с руткитом дополнительную дллку достаточно геморройно, и это скажется на размере руткита. В итоге получаем какой-то корявый способ перехвата, кторый не используется ни в одном нормальном рутките.
    Следующий способ (Модификация таблицы импорта) основан на особунности PE-формата. Заключается он в том, что все имена API - функций, импортируемых программой, находятся в таблице импорта. После запуска таблица имен функций превращается в таблицу их адресов. Следовательно, изменив эту таблицу можно указать адреса своих обработчиков. Надо учесть, что таблица импорта есть не только у exe-файлов, но и у dll, к оому же надо постоянно следить за подгружаемыми библиотеками. К достоинствам этого способа можно отнести то, что сама перехватываемая функция не изменяется, что обеспечивает корректную работу в многопоточных приложениях. Существенный недостаток – возможность программ не использовать таблицу импорта или пользоваться функциями нахождения адресов.
    Вывод: простой в реализации, но легко обнаруживаемый способ.
    Следующий способ – сплайсинг функций. Суть метода – начало перехватываемой функции заменяется на jmp или подобную инструкцию, которая ведет к обработчику. Либо можно с помощью дизассемблера длин пройтись по функции, найти ее конец (команда ret) и перейти к ее обработчику. Недостаток этого способа – возможные глюки в многопоточных приложениях, а также некоторая сложность в реализации. К плюсам можно отнести сложность обхода и обнаружения перехвата.
    Итог: Перспективный, но довольно сложный способ перехвата.
    Теперь, когда мы познакомились с основными методами перехвата в user mode. Недостаток их в том, что они могут быть обнаружены и устранены. Чтобы руткит остался действительно незамеченным нужно спуститься на самый низкий уровень – нулевое кольцо (ring0).
    Существует, как минимум, два способа спуститься на нулевой уровень привилегий. Первый – написать свой драйвер. Этот способ применяется во многих системных программах, но встречается и в руткитах. Написав драйвер, его можно подгрузить с помощью Service Manager Api. Плюс этого способа – это отсутствие необходимости искать адреса ядерного API. Минус – дополнительный бинарник к руткиту.
    Второй способ – использование шлюзов. Шлюз – специфическая запись в одной из системных таблиц. Например, популярный у вирмейкеров шлюз вызова (call gate) – элемент глобальной или локальной дескрипторной таблицы (GDT или LDT).
    После того, как мы попадем в ring0, нам нужно будет научиться взаимодействовать с системой. Практически все функции расположены в ядре (ntoskrnl.exe). Ну, что самое время познакомиться со способами их перехвата.
    Первый способ – подмена адресов Native Api функций в Service Descriptor Table (STD). Этот способ напоминает модификацию таблицы импорта. Таким способом пользуются многие производители всяких защит (антивирусов и файрволов), не позволяя запускать вирусы, модифицировать свой процесс. Данный способ перехвата можно обнаружить, получив оригинальную таблицу.
    Итог: наиболее легко реализуемый перехват на нулевом кольце, применяемый во многих защитных системах.
    Следующий способ – сплайсинг функций в ntoskrnl.exe. Многие моменты аналогичны, методу перехвата в user mode.
    Итог: Более сложный, чем первый, но и более надежный.
    Также можно написать свой драйвер-фильтр. Драйвера взаимодействуют друг с другом по средствам специальных пакетов ввода/вывода – IRP. Следовательно, чтобы контролировать работу драйвера, нужно следить за IRP-пакетами. Так, кстати, и поступают файрволы, получая все IPR, адресованные устройствам \\Device\\TCP, \\Device\\UDP, \\Device\\RAW. Чтобы сделать такой фильтр достаточно создать устройств, а затем подцепить его к фильтруемому. Если руткит проник в нулевое кольцо без дров, то нужно изменить все адреса Dispatch-функций на свои обработчики.
    Итог: Таким способом просто обойти персоональные файрволы, но работать прийдется на самом низком уровне.
    Вот далеко не полный список технологий, используемых в современных руткитах. Надеюсь ты заинтересовался разработкой таких программ, и у тебя возникло много вопросов. Советую прочитать книги: «Недокументированные возможности Windows 2000» Шрайбера, «Programming Applications for Windows» Рихтера, статьи с www.rootkit.com, а также статью ms-rem’а «Перехват Api-функций».
     
    #1 TaNkist, 19 Apr 2006
    Last edited: 20 Apr 2006
    1 person likes this.