Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Объективный взгляд на DrWeb

Обсудить статью на форуме

Массу крэкерских инструментов, видеоуроков и статей вы сможете найти на видеокурсе от нашего сайта. Подробнее здесь.

Автор: BiT-H@ck <bit-hack@mail.ru>

Здорово, пиплы. Сегодня мы изучим защиту крутого антивируса DrWeb 4.28. Сила этого антивируса не в огромном количестве вирусов в базе, а очень мощном эвристическом анализаторе. Этот анализатор может пробиться через очень сложные раскриптовки кода вируса, после чего он его так или иначе обнаружит его:) Ладно, лезем в справку и читаем про регистрацию. Вот что там написано:

Программы семейства DrWeb32 при отсутствии ключа регистрации (файл Drweb32.key) работают в жестко ограниченном режиме. В этом случае программы имеют следующие ограничения:
при старте программы выдается сообщение о том, что данная версия является ознакомительной;
не проверяются архивы;
не проверяются файлы в почтовых вложениях;
не проверяются упакованные файлы;
не проводится эвристический анализ;
невозможно лечение, удаление, перемещение и переименование зараженных и подозрительных файлов.

Т.е. мы не можем поюзать самые сильные возможности антивируса! Вот будет прикол, случится очередная эпидемия какого-нибудь вируса, а мы безоружны, т.к. вирус может пытаться перехватить обновление через интернет антивирусных баз, а эвристика не доступна в незарег. версии… Да уж, обидно. Собственно с этой проблемой мы сейчас и будем бороться:)

<Начало исследования>
Пихаем главный файл антивиря Drweb32w.exe в PeID, а он выдаёт ASPack 2.12 -> Alexey Solodovnikov. :) Как с этой штукой бороться читайте в другой моей статье. Ладно, распаковали, теперь опять пихаем в PeID - Microsoft Visual C++ 6.0. Отлично. Засовываем распакованный файл в IdaPro, и попутно пихаем в олю. Пока дизасмится начанаем дебажить. В оле ставим бряк на функцию MessageBoxA (именно он вылазит при запуске программы). Запускаем. Тормознулись. Выходим из этой функции и видим, что Call обскакать нельзя, по крайней мере на этом уровне. Выходим на более высокий уровень (выходим из процедуры). И тут нельзя, выходим ещё выше. О, а здесь можно. Вот как это выглядит (вся процедура):

 00413300	A1DC254700		MOV EAX, DWORD PTR DS:[4725DC]
 00413305	85C0			TEST EAX, EAX
 00413307	7523			JNZ SHORT 0041332C
 00413309	8B0D54F44600	MOV ECX, DWORD PTR DS:[46F454]
 0041330F	85C9			TEST ECX, ECX
 00413311	7407			JE SHORT 0041331A
 00413313	6A09			PUSH 9
 00413315	E80C6E0300		CALL 0044A126
 0041331A	8B442408		MOV EAX, DWORD PTR SS:[ESP+8]
 0041331E	8B4C2404		MOV ECX, DWORD PTR SS:[ESP+4]
 00413322	6A00			PUSH 0
 00413324	50			PUSH EAX
 00413325	51			PUSH ECX
 00413326	E837B80300		CALL 0044EB62
 0041332B	C3			RETN
 0041332C	8B44240C		MOV EAX, DWORD PTR SS:[ESP+C]
 00413330	C3			RETN
 

Мы вышли из процедуры по адресу 00413326. А переход по адресу 00413307 явно перепрыгивает через этот call. Ставим на него бряк и перезапускаем прогу, отпускаем на волю. Вот и тормознулись. Переход не работает:) Чиним, изменив флаг нуля, F9. Ура, MessageBoxA нет. После загрузки, прога проверяет все запущенные процессы на злостные вири:), после чего ОПЯТЬ выводит дебильный мессэйджбокс, но мы ведь не удалили старый бряк, поэтому оля тормознулась на старом бряке. Опять реверсируем флаг нуля и тем самым мы перепрыгнули ещё одно ненужное нам окно. Теперь заходим в настройки и пытаемся врубить эвристический анализатор. Но антивирь начинает возникать, типа зарегь меня. Ну и это мы открутим:) Опять бряк на мессайджбокс и опять пытаемся врубить этот чёртов анализатор. Оля тормознулась. Выходим из user`а и видим, что как всегда нельзя обскакать мессагу. Выходим на уровень выше и видим, что и тут не обскакать. Ещё на уровень выше. А тут можно. Если вы заметили, то куда мы попали, мы видим не первый раз:). Как всегда меняем старый знакомый переход и… Видим, что настройка не врубилась!!! Ну программер блин. Опять врубаем анализатор, брякаемся на “старом” переходе. Ставим бряк на ret в конце этой функции (будьте аккуратны, там будет два ret`а, надо бряк ставить на первый) и жмём F9 до тех пор, пока не окажемся на этом бряке. F8 и мы поднялись ещё на один уровень вверх. Вот где мы оказались:

 0041B100	A1703E4700		MOV EAX, DWORD PTR DS:[473E70]
 0041B105	56			PUSH ESI
 0041B106	8BF1			MOV ESI, ECX
 0041B108	8A885C020000	MOV CL, BYTE PTR DS:[EAX+25C]
 0041B10E	84C9			TEST CL, CL
 0041B110	7524			JNZ SHORT 0041B136
 0041B112	8B0D0C3E4700	MOV ECX, DWORD PTR DS:[473E0C]
 0041B118	6A06			PUSH 6
 0041B11A	6A30			PUSH 30
 0041B11C	8B9154040000	MOV EDX, DWORD PTR DS:[ECX+454]
 0041B122	52			PUSH EDX
 0041B123	E8D881FFFF		CALL 00413300
 0041B128	83C40C		ADD ESP, 0C <=Тут оказались
 0041B12B	8BCE			MOV ECX, ESI
 0041B12D	6A00			PUSH 0
 0041B12F	E8A2E40200		CALL 004495D6
 0041B134	5E			POP ESI
 0041B135	C3			RETN
 

Готов поспорить, что прыг по адресу 0041B110 перепрыгивает сообщение проги и врубает опцию. Ставим бряк на этот прыг, опять выбираем анализатор и тормозимся на свежепоставленном бряке. Реверсируем флаг нуля и отпускаем прогу на волю. Ура, опция врублена и антивирь даже не пикнул про регистрацию! Теперь пробуем включить опцию проверки архивов. Оп - картина репина "Не ждали" © NUCLEuS. А сейчас напряжем мозги и подумаем, как все ограничения по опциям врубить раз и навсегда. Даже не думайте про покупку! Теперь отвлекитесь от статьи и покрутите немного прогу, с целью обнаружения возможности врубления всех опций сразу. Ладно, кто догадался, кто нет не имеет особого значения. Обратите на то, что же влияет на работу перехода по адресу 0041B110. А на это влияет то, что лежит по адресу EAX+25C, когда EIP=0041B108. Но где-то ведь в проге должны заноситься в эти переменные 1 или 0, или как вообще врубаются опции в зарегенной версии? Вот теперь нам и потребуется IdaPro, которая уже должна дезассемблировать прогу. Идём с IdaPro, переходим на самый верх листинга и жмём Alt+T. Вводим EAX+25C и жмём Enter. Нашли, но не то:( Ищем, ищем и не находим ни одной функции, которая бы заносила в эту переменню 1 или же 0:( Ладно, зацепимся за другую переменную, из-за которой срабатывает/несрабатываем переход через “стартовое окно приветствия”. Эта переменная лежит по адресу 4725DC. Опять переходим на самый верх листинга в иде и ищем 4725DC. Нашли, да не то. Нам нужна инструкция, которая не читает из этой переменной (например mov al, byte ptr 4725DC), а та, которая пишет в неё, например mov byte ptr 4725DC, 1. Ищем, ищем и ненаходим! Тут я вообще начал охреневать в непонятках как это дело дальше отламывать. Ладно, у нас есть ещё одна переменная которая хоть как-то влияет на регистрацию - 473E70. Ищем в иде это число, нам надо найти подозрительное место. Ищем, ищем, и наконец-то находим. Вот у меня это место:

 .text:0042F152		test    esi, esi
 .text:0042F154		jz      short loc_42F1C8
 .text:0042F156		mov     eax, dword_473E70
 .text:0042F15B		mov     byte ptr [eax+255h], 0
 .text:0042F162		mov     ecx, dword_473E70
 .text:0042F168		mov     byte ptr [ecx+256h], 0
 .text:0042F16F		mov     edx, dword_473E70
 .text:0042F175		mov     byte ptr [edx+257h], 0
 .text:0042F17C		mov     eax, dword_473E70
 .text:0042F181		mov     byte ptr [eax+258h], 0
 .text:0042F188		mov     ecx, dword_473E70
 .text:0042F18E		mov     byte ptr [ecx+259h], 0
 .text:0042F195		mov     edx, dword_473E70
 .text:0042F19B		mov     byte ptr [edx+25Ah], 0
 .text:0042F1A2		mov     eax, dword_473E70
 .text:0042F1A7		mov     byte ptr [eax+25Bh], 0
 .text:0042F1AE		mov     ecx, dword_473E70
 .text:0042F1B4		mov     byte ptr [ecx+25Ch], 0
 .text:0042F1BB		mov     edx, dword_473E70
 .text:0042F1C1		mov     byte ptr [edx+25Dh], 0
 

Вот здесь все переменные, отвечающие за закрытие/открытие опций обнуляются, а чуть ниже мы видем:

 .text:0042F1C8		call    sub_432CA0
 .text:0042F1CD		test    eax, eax
 .text:0042F1CF		jz      short loc_42F243
 .text:0042F1D1		mov     eax, dword_473E70
 .text:0042F1D6		mov     byte ptr [eax+255h], 1
 .text:0042F1DD		mov     ecx, dword_473E70
 .text:0042F1E3		mov     byte ptr [ecx+256h], 1
 .text:0042F1EA		mov     edx, dword_473E70
 .text:0042F1F0		mov     byte ptr [edx+257h], 1
 .text:0042F1F7		mov     eax, dword_473E70
 .text:0042F1FC		mov     byte ptr [eax+258h], 1
 .text:0042F203		mov     ecx, dword_473E70
 .text:0042F209		mov     byte ptr [ecx+259h], 1
 .text:0042F210		mov     edx, dword_473E70
 .text:0042F216		mov     byte ptr [edx+25Ah], 1
 .text:0042F21D		mov     eax, dword_473E70
 .text:0042F222		mov     byte ptr [eax+25Bh], 1
 .text:0042F229		mov     ecx, dword_473E70
 .text:0042F22F		mov     byte ptr [ecx+25Ch], 1
 .text:0042F236		mov     edx, dword_473E70
 .text:0042F23C		mov     byte ptr [edx+25Dh], 1
 

А вот тут ВСЕ переменные отвечающие за регистрацию устанавливаются в 1. Смотрим, как выполняется этот код под отладчиком. Ставим брейк на адрес 0042F152 и наблюдаем, как не срабатывает переход по адресу 0042F154, но срабатывает по адресу 0042F1CF. Нам нужно точно наоборот. Прыг по адресу 0042F154 делаем безусловным, а по адресу 0042F1CF нопим. Сохраняем, запускаем. Работает!
<Конец исследования>

<Начало патча>
Т.е. мы пропатчили вот здесь:

 0042F1CF     90             NOP
 0042F1D0     90             NOP
 ------------------------------------------------------------------
 00413307     EB 23          JMP SHORT 0041332C
 ------------------------------------------------------------------
 0042F154     EB 72          JMP SHORT 0042F1C8
 

Теперь будем писать так называемый in-line патч. Грузим в олю запакованный файл и ищем переход на ОЕР. Вот:

 004C43AF	61		POPAD
 004C43B0	7508		JNZ SHORT 004C43BA
 004C43B2	B801000000	MOV EAX, 1
 004C43B7	C20C00	RETN 0C
 004C43BA	68BB6A4300	PUSH 00436ABB
 004C43BF	C3		RETN
 

Теперь ищем место под патч. Я взял вот тут:

 004C6AB5	00	DB 00
 004C6AB6	00	DB 00
 004C6AB7	00	DB 00
 004C6AB8	00	DB 00
 

Теперь переход по адресу 004C43B0 перенаправляем на будущий патч. Патч выглядит так:

 004C6AB5	66C705CFF142	MOV WORD PTR DS:[42F1CF], 9090
 004C6ABE	C60507334100	MOV BYTE PTR DS:[413307], 0EB
 004C6AC5	C60554F14200	MOV BYTE PTR DS:[42F154], 0EB
 004C6ACC	E9EAFFF6FF		JMP 00436ABB
 

После всех изменений антивирус работает ПОЛНОСТЬЮ! Защита, похоже, тут не менялась очень долго, поэтому, скорее всего, статья будет актуальна и для более новых версий.
<Конец патча>
<P.S.>
После отключения защиты в версии 4.28, я обнаружил, что у меня есть версии 4.29 b. Абсолютно никаких изменений в защите не нашёл.
</P.S.>
<P.P.S>
Совсем недавно на форуме моей команды один чел сказал, что я ломал старую версию, что в новой идёт проверка через инет и многое другое. Я слил новую версию (на мопеде) и сломал её за 10 минут. Защита не изменилась. Было очень обидно, что сливал 7 мегов ради 10 минут удовольствия… Но есть и один прикол - скрытая проверка в spiderml.exe.
</P.P.S>
<Приветы>
All my command, cracklab, а особенно Alex(особеннее), Mario555 (а ему ещё особенее:), WELL, Bad_Guy. И to: dragon_gor, NUCLEuS и всем, кого я забыл…
</Приветы>



Обсуждение статьи: Объективный взгляд на DrWeb >>>


Комментарии к статье: Объективный взгляд на DrWeb

AA92 28.07.2005 12:04:22
Молодец.
Теперь мом жить стало легче
---
GL#0M 05.08.2005 02:04:57
Защита этой программы давным давно была описана на reversing.net =)
З.Ы. Что это за странная команда? Ты её выдумал или она действительно существует? =) К сожалению гугл мне ничего не подсказал...
---
Ara 06.08.2005 20:23:40
//После всех изменений антивирус работает ПОЛНОСТЬЮ!//
Я бы не был так категоричен. Наверняка не пашет самая нужная функция этого антивиря - загрузка из инета вирусных баз. Без этой функции юзать его смысла нет, посему там такая защита и стоит...
---
Жека 10.08.2005 03:04:56
для Ara уже давно есть програмы для скачки баз типа DrWU. Решает все проблемы!!!
---
WELL 10.08.2005 07:03:50
Хорошая статья. Про наши антивири таких статей и не припомню :) Молодец BiT-H@ck
---
BiT-H@ck 15.08.2005 18:59:23
2 GL#0M:
Сайт нашей команды упал, когда будет новый х.з. А так комманда есть, наш бывший адрес diprog.x2rus.ru
---
Bat 04.10.2005 23:56:39
Хорошо изложенная статья, очень интересно было изучать, единственно, что не понятно это что за подковыка в spiderml.exe я тут версию 4.33 разломал, все ломается просто, только вот этот модуль с какой то загадкой, если можно то я бы хотел узнать, как вы свой spiderml сломали.
---
BiT-H@ck 08.10.2005 19:09:47
>как вы свой spiderml сломали.
А там скрытая проверка:) Я ужо не помню, что да как, но помню, что на её поиск я затратил 10 минут:)
---

Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS