В данной статье авто подробно разбирает функционал руткита, который работает в пользовательском режиме (3-ем кольце, user mode, кому как удобнее . Статья до отказа наполнена техническими терминами, IT-сленгом и прочими компьютерными сладостями. Мы будем разбирать и анализировать юзермодный руткит (точнее компонент). Руткит выполнен в виде динамической библиотеки и скрывает процессы, файлы и ключи реестра. Слава богу он оказался не закриптованным. Чтож начнем. Первым делом грузим файл в peid и смотрим на предмет упаковки (криво сказано, но в голову больше ничего не лезет) peid ничего не нашел, стало быть файл не упакован. Но давайте посмотрим энтропию. Нажимаем >> и лицезреем окно. В порыве эйфории от неупакованности файла загружаем файл в 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. жалко эти знания никак не пригодятся на ЕГЭ