Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #35, ОКТЯБРЬ 2003 г.

А ты написал свой стелс?

Касатенко Иван aka SkyWriter

Спецвыпуск Xakep, номер #035, стр. 035-050-4


А коннект-то - вот он!

Итак, мы скрыли процесс, но это еще далеко не все. Как только твой питомец попытается подключиться к какому-нибудь хосту в интернете, юзер, наученный статьей про защиту от заразы ;-), воспользуется утилитой netstat, увидит подозрительные коннекты со своего компа и тут же переставит Винду. Обидно, правда? Особенно, если ты пару недель парился и писал модуль для ковыряния в кернеле.

Хорошо, боремся с netstat'ом:

Ну, во-первых, можно "исправить баги" или попросту удалить сам netstat. Удалять - это совсем по-ламерски, поэтому будем отстреливать баги, а именно: нужно заставить netstat не говорить о тех коннектах, которые у нас есть. Сделать это можно, например, так: переименовываем netstat.exe во что-нибудь еще, вместо него записываем свой бинарник, который запускает оригинальный netstat и фильтрует его вывод. Дешево и сердито. Это можно сделать, например, таким образом:

hSaveStdout = GetStdHandle(STD_OUTPUT_HANDLE);

CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0);

SetStdHandle(STD_OUTPUT_HANDLE, hChildStdoutWr);

DuplicateHandle(GetCurrentProcess(), hChildStdoutRd, GetCurrentProcess(), &hChildStdoutRdDup , 0, FALSE, DUPLICATE_SAME_ACCESS);

CloseHandle(hChildStdoutRd);

После этого создаем порожденный процесс (тот самый настоящий netstat) и читаем то, что он нам выдает при помощи:

ReadFile( hChildStdoutRdDup, chBuf, BUFSIZE, &dwRead, NULL);

То, что получаем в буфере chBuf можем уже анализировать на предмет наличия в нем того, что мы бы не хотели показывать :). Ну, с этой задачей, я думаю, ты и без меня разберешься.

Вот что из этого получилось у меня (внимательно следи за портом 3707). Вывод оригинального netstat'a:

...И вывод исправленного:

Правда, так лучше, если учесть, что троян висит именно на порту 3707? :)

Как альтернативу этому способу можно предложить скрыть сетевые подключения при помощи замены функции в ядре (об этом я уже писал выше). А заменить нужно лишь одну функцию - GetTcpTable - именно она возвращает список TCP-подключений.

А если не от кого скрывать?..

Я неоднократно упоминал всякие ring 0, уровни ядра и прочую подобную ерунду. У тебя, наверное, возникла идея: а почему бы не сделать вирь, который бы просто находился в резидентном состоянии в ring 0, то есть с теми же правами, что и ядро. Это практически идеально позволило бы защититься от большинства антивирусов.

Должен тебя разочаровать, ты не первый, кто придумал нечто подобное. Такую идею, например, реализовывал Win.CIH (aka Чернобыль). Кстати, именно поэтому он обладал возможностью стирания BIOS'а. Правда, на момент написания его был известен способ перехода в Ring 0 лишь в Win9x, сейчас дела обстоят хуже: этот режим стал доступен и в WinNT, так что жди нового, улучшенного WinNT.CIH'a... Представляю, как в твоем мозгу копошатся темные мысли о создании страшного недетектируемого ring0-вируса. Не обольщайся, многие современные антивирусы работают в том же кольце защиты, поэтому и там тебе придется укрываться от их зоркого взгляда :-(.

Назад на стр. 035-050-3  Содержание  Вперед на стр. 035-050-5