Охота на ведьм Николай «GorluM» Андреев Хакер, номер #078, стр. 078-104-1 (gorlum@real.xakep.ru) Пишем программу для обнаружения руткита в windows-системе В последнее время stealth-технологии стали на порядок более популярны, чем, скажем, года два назад. Сейчас только ленивый троянмейкер не добавит в свое детище модуль, скрывающий от лишних глаз его файлы, процессы или записи в реестре. Даже я приложил свою руку к разработке stealth’а, простенького, конечно, но работающего. И теперь я хочу показать, как написать программу для обнаружения подобного или более крутого stealth’а в системе. Оказывается, это не очень сложно. Раньше для того, чтобы поймать у себя на компьютере троян, достаточно было тщательно проверить реестр и посмотреть последние модифицированные файлы в системной директории system32, где обычно живут эти твари, однако сейчас этот метод уже не актуален. Современные трояны вовсю обзаводятся stealth-модулями, которые делают такой мануальный подход абсолютно бесполезным. Хакеров, конечно, такая ситуация очень радует, так как время, через которое их программы попадают в антивирусные базы, увеличивается. Пользователям же нет покоя. Ты только представь, что должен чувствовать юзер, если он знает, что в его системе есть троян (трафик льется, пароли не работают, с кредитки утекают деньги), но ни ручной, ни автоматический поиск ничего не дают. В общем, хреново ему будет, поверь. Но мы его не бросим — мы же кодеры! Все программы должны нас бояться, в том числе и хакерские. Мы разработаем свой детектор, который будет фиксировать всякие аномалии в системе и даже, возможно, от них избавляться, делая невидимые программы очень даже видимыми. Хитрость в том, что большинство stealth-технологий основано на одном и том же принципе, известном уже много лет, — на перехвате. Раньше это был перехват прерываний, теперь это перехват API. За этот принцип мы и будем пытаться ухватиться. Мы напишем программу, которая будет засекать, ну, для начала перехват API методом модифицирования таблицы импорта. Это, наверное, самый популярный и хорошо освещенный в литературе метод. Начнем с его обнаружения, ну а дальше посмотрим — может, еще чему-нибудь нашу программку научим. [основная идея] Для того чтобы понять, как обнаружить программу-невидимку (или руткит, если хочешь) на базе перехвата API методом модифицирования таблицы импорта, надо для начала вспомнить, как она работает. Я сказал «вспомнить», потому что я уже писал о подобном stealth-механизме в мартовском номере «Хакера». Итак, невидимка внедряет свой код в каждый процесс, перечисляет в них все используемые модули (то есть подгруженные DLL) и в каждом модуле ищет по имени в таблице импорта функции, ответственные за вывод той или иной системной информации. Когда невидимка найдет нужную запись в таблице, она просто заменит в ней адрес функции. Именно эту подмену и можно обнаружить. Как? Легко! Достаточно пройтись по таблице импорта и проверить соответствие имен функций их настоящим адресам. Делается это элементарно, ведь, зная имя функции, найти ее оригинальный, подлинный адрес не составит труда — вызова чего-нибудь вроде GetProcAddress хватит. Ну а поскольку невидимка перехватывает одни и те же функции в каждом процессе, то она и нас не обойдет стороной, следовательно, нашему детектору будет достаточно проверить только таблицу импорта себя и своих модулей, чтобы с уверенностью сказать, есть ли в системе руткит, работающий по рассмотренной выше схеме. Как видишь, наметился некоторый алгоритм детектирования: |