Анализ руткита

Тема в разделе "Сборник статей по безопасности и анонимности", создана пользователем mafin, 4 апр 2017.

  1. mafin

    mafin New Member

    Сообщения:
    17
    Симпатии:
    0

    В данной статье авто подробно разбирает функционал руткита, который работает в пользовательском режиме (3-ем кольце, user mode, кому как удобнее . Статья до отказа наполнена техническими терминами, IT-сленгом и прочими компьютерными сладостями. Мы будем разбирать и анализировать юзермодный руткит (точнее компонент). Руткит выполнен в виде динамической библиотеки и скрывает процессы, файлы и ключи реестра. Слава богу он оказался не закриптованным. Чтож начнем.

    Первым делом грузим файл в peid и смотрим на предмет упаковки (криво сказано, но в голову больше ничего не лезет) peid ничего не нашел, стало быть файл не упакован. Но давайте посмотрим энтропию. Нажимаем gt;gt; и лицезреем окно.

    В порыве эйфории от неупакованности файла загружаем файл в IDA. После того как дизассемблер полностью заглотит файл он остановится на точке входа. (в dll"ках могут быть несколько точек входа, каждая точка входа = начало экспортируемой функции)

    При загрузке dll, библиотека проверяет причину (fwdreason) вызова. fdwReason!1 = DLL_PROCESS_ATTACH, т.е. библиотека отображается в адресное пространство процесса в результате запуска процесса или вызова функции LoadLibrary. В ином случае возвращается 0 (процедура fuck). Но мы будем считать что с загрузкой dll все прошло хорошо и двойным кликом переходим на sub_10001201 (далее она будет переименована в Start)

    Словно диверсант попавший в незнакомую местность осматриваем листинг. Первая процедура sub_1000124D. Делаем переход на нее.

    Я не стал приводить полностью дизассемблерный листинг, вместо нее псевдокод. Как видно из кода, эта процедура получает отладочные привилегии необходимые для манипуляции чужим процессом. Переименовываем процедуру на более благородное название Нажимаем Esc и возвращаемся назад. Смотрим на переход loc_10001217. Создается мьютекс (хром упорно хочет заменить это слово на "ромштекс") его назначение мне осталось не понятным, наверняка для предотвращения повторного запуска. Далее (.text:1000123A) создается поток, в качестве стартового адрес передается указатель на процедуру с оконными хуками.

    Сама процедура мы разобрались "подготовительными" функциями, теперь торжественно перейдем к начинке пирога: sub_100015B4

    Первым дело идет получение адресов перехватываемых функций (связка GetModuleHandle/GetProcAddress).

    NtQuerySystemInformation процессы

    NtQueryDirectoryFile файлы

    NtEnumerateValueKey реестр

    Алгоритм вызовов: оригинал/перехватываемая функция. Кликаем на sub_100014E2

    Надеюсь вы поняли что делает данная процедура (подсказка: VirtualPtotect/ReadProcessMemory/WriteProcessMemory)/

    И так вся начинка после ухищрений:

    Переходим на New_NtQuerySystemInformation:

    Осмотревшись обращаем внимание на sub_1000119C (вся завязка именно там)

    Как мы видим происходит сравнивание массива off_10001064 с переменной полученной из вызова. Двойным кликом переходим к off_10001064

    В массиве содержатся имена скрываемых процессов. Я пропущу анализ New_NtQueryDirectoryFile, потому что алгоритм скрытие почти то же самый, сверка скрываемых имен происходит с off_10001064. Далее переходим к New_NtEnumerateValueKey

    Происходит сверка входного параметра со строкой "win32load" и происходит скрытие (немного мутновато сказано, но надеюсь смысл понятен).

    Установленные перехваты

    Надеюсь вам было интересно В следующей записи мы рассмотрим ядерные руткиты.

    P.S. жалко эти знания никак не пригодятся на ЕГЭ

Поделиться этой страницей