- [Digital Virus Labs #11] - [Page 37] - Превращение демо-версии DrWeb 4.20 в полноценную (c) by Voodoo/SMF Недавно я слил DrWeb-4.20 и установил его. Некогда его эвристика говорила мне о том, что в моем коде баги, либо их нет. Т.е. если код работает, он говорит: Type_XXX, в противном случае все Ок. Но это все относиться к ДОСу. Да и в ДОСе не все так безнадежно. Что касается win32, евристики, то предыдущие версии особым интеллектом не отличаются. Вот я в надежде что, он меня удивит, решил устроить ему проверку. По версии DrWeb-4.16 я знал что DrWeb-4.20 без лицензии на эвристику. Но помня, как легко уговорили 4.16 [1], я взялся за дело. Установил брекпоинт на "MessageBoxA". Запустил прогу. Айс вывалился на "MessageBoxA". Выхожу из кернела в код проги, и вижу код: :0044B4A4 FF7778 push [edi+78] ; :00xxxxxx FF7508 push [ebp+08] ; :00xxxxxx 50 push eax ; :00xxxxxx FF1534AA4700 Call dword ptr [0047AA34] ; вывод сообщения :00xxxxxx 891E mov dword ptr [esi], ebx ; :00xxxxxx 837DFC00 cmp dword ptr [ebp-04], 00000000 ; :00xxxxxx 89450C mov dword ptr [ebp+0C], eax ; Это предсказывал нам еще Madd-Maxx. Т.е. отличие от 4.16 лишь в смещении. Теперь выхожу из этой подпрограммы, и вижу : :0044b4ec 8B10 mov edx, dword ptr [eax] :00xxxxxx FF74240C push [esp+0C] :00xxxxxx FF9294000000 call dword ptr [edx+00000094] :00xxxxxx C20C00 ret 000C Классно! Каким ты был таким и остался. Выхожу из этой подпрограммы, и вижу знакомый код: :00429167 6A30 push 00000030 :00xxxxxx 52 push edx :00xxxxxx E8C9AF0400 call 0044B4DA :00xxxxxx 8D4C2410 lea ecx, dword ptr [esp+10] ; сюда мы вернулись Еще одно отличие. Осматриваю код чуть выше, как завещал нам Madd-Maxx. Выше я нахожу знакомый код: :00429109 85C0 test eax,eax :00xxxxxx 750F jnz 0042911С :00429112 8A8828020000 mov cl, byte ptr [eax+00000228] :00xxxxxx 84C9 test cl, cl ; проверка условия перехода :00xxxxxx 7521 jne 0041A9A3 ; нужный нам переход Ставлю брекпоинт на 429109. Запускаю "испытуемого", айс вываливается в нужном месте: eax=4 --> т.е. выполняется jnz 0042911C А что будет если еах=0 ? :r eax=0 ; в еах ноль :x ; возврат в прогу Странно... сообщение в начале проги пропало! 8-) Осталось избавиться от дурацких сообщений при попытках включить эвристический анализатор. Для этого надо найти, где в [eax+00000228] заноситься 0. В начале попробуем поставить брекпоент RW на еах+228. Запускаем, и ничего :-(! Ладно, попробую найти в дизасме строки типа 000228], вдруг наткнусь на код, который обнуляет эту ячейку памяти. Ни фига не нашел :-(! Да и код какой-то непохожий на тот, который я видел в айсе. Мля он сжат! Вот еще одно отличие от 4.16. Я, было, подумал что, вебер самораспаковывается. Если это так, тогда полный 3.14-здец. Может его просто запаковали каким нибудь известным пакером? Так было с вебом во времена ДОСа. Тога если запустить: drweb.exe -upw drweb.exe на выходе получался распакованный веб. Пытаюсь проделать тоже с нашим испытуемым. Облом :(. Попытаюсь натравить AVP на веб. Авп говорит ASPacker. Нашел в инете ASPacker. Он только запаковывает :(. Это меня немного озадачило. AVP должон распаковывать проги для их дальнейшего анализа. Это высказывание оказалось истинным. Подсуну веба и посмотрю что, с ним будет делать AVP. Для этого: :bpx CreateFileA ; брекпоинт на открытие/создание файлов. Запускаем АВП и просматриваем параметры CreateFileA, а именно имя файла. На его указывает дворд в стеке, после точки возврата. Среди множества имен, бросается в глаза: AVPXX.TMP где XX, например 17. Что это за файлы? Под айсом выяснить трудно. Загружаем AVP под td32.exe. Ставим брекпоинт на CreateFileA. Снова наблюдаем. В темпе появились файлы AVP17.TMP и AVP18.TMP. AVP17.TMP не нулевой длины. Смотрим его, енто PE. Далее перехватываем DeleteFileA. И перед удалением переименовываем его в AVP17.EXE. Прога не запускается, хотя и по формату PE. А может это и не веб? Запакуем AVP17.EXE с помощью ASPackera, и запустим. Енто веб. Теперь ставим брекпоин на GetVersion и запускаем веб. Ждем пока веб вызовет GetVersion, ставим брекпоинт на [eax+228]=00113e760 по RW. Айс выкидывает в двух местах: 0042974E: B001 mov al,01 00xxxxxx: 899324020000 mov dword ptr [ebx+00000224],edx 00xxxxxx: 888329020000 mov byte ptr [ebx+00000229],al 00xxxxxx: 88832A020000 mov byte ptr [ebx+0000022A],al <- Здесь айс выскочит 00xxxxxx: 88832B020000 mov byte ptr [ebx+0000022B],al первый раз 00xxxxxx: 88832C020000 mov byte ptr [ebx+0000022C],al 00xxxxxx: 88832D020000 mov byte ptr [ebx+0000022D],al 00xxxxxx: 88832E020000 mov byte ptr [ebx+0000022E],al 00xxxxxx: 88832F020000 mov byte ptr [ebx+0000022F],al 00xxxxxx: 888330020000 mov byte ptr [ebx+00000230],al 00xxxxxx: 899320020000 mov dword ptr [ebx+00000220],edx 00xxxxxx: 889328020000 mov byte ptr [ebx+00000228],dl 00xxxxxx: 899334020000 mov dword ptr [ebx+00000234],edx 00xxxxxx: 899338020000 mov dword ptr [ebx+00000238],edx 00xxxxxx: 89933C020000 mov dword ptr [ebx+0000023C],edx 00xxxxxx: 8BC3 mov eax,ebx 00xxxxxx: 5F pop edi 00xxxxxx: 5B pop ebx 00xxxxxx: C20400 ret 0004 00428EBE: 53 push ebx 00xxxxxx: 6A10 push 00000010 00xxxxxx: 8B88CC060000 mov ecx,dword ptr [eax+000006CC] 00xxxxxx: 51 push ecx 00xxxxxx: E80D260200 call 0004A8DA 00xxxxxx: 3BEB cmp ebp,ebx ; ebp<>ebx 00xxxxxx: 745D jz 0002832E ; 00xxxxxx: 8B15CC124700 mov edx,dword ptr [004712CC] 00xxxxxx: 889A29020000 mov byte ptr [edx+00000229],bl 00xxxxxx: A1CC124700 mov eax,[004712CC] <-- Здесь айс выскочит второй раз. 00xxxxxx: 88982A020000 mov byte ptr [eax+0000022A],bl 00xxxxxx: 8B0DCC124700 mov ecx,dword ptr [004712CC] 00xxxxxx: 88992B020000 mov byte ptr [ecx+0000022B],bl 00xxxxxx: 8B15CC124700 mov edx,dword ptr [004712CC] 00xxxxxx: 889A2C020000 mov byte ptr [edx+0000022C],bl 00xxxxxx: A1CC124700 mov eax,[004712CC] 00xxxxxx: 88982D020000 mov byte ptr [eax+0000022D],bl 00xxxxxx: 8B0DCC124700 mov ecx,dword ptr [004712CC] 00xxxxxx: 88992E020000 mov byte ptr [ecx+0000022E],bl 00xxxxxx: 8B15CC124700 mov edx,dword ptr [004712CC] 00xxxxxx: 889A2F020000 mov byte ptr [edx+0000022F],bl 00xxxxxx: A1CC124700 mov eax,[004712CC] 00xxxxxx: 889830020000 mov byte ptr [eax+00000230],bl 00xxxxxx: 8B0DCC124700 mov ecx,dword ptr [004712CC] 00xxxxxx: 8A8129020000 mov al,byte ptr [ecx+00000229] 00xxxxxx: 3AC3 cmp al,bl 00xxxxxx: A100000000 mov eax,[00000000] Меня заинтересовал второй случай. А что если EBP=EBX ? Ставим брекпоинт на cmp ebp,ebx. Когда вываливается айс вводим команды: :r ebx=ebp :x Прога запускается, выводя дурацкое сообщение. Пытаемся включить эвристический анализатор. Теперь он гораздо сговорчивей. Все работает! Т.о. чтобы веб был сговорчивей нам надо: 1) изменить :00429109 85C0 test eax,eax на test eax,eax :00xxxxxx 750F jnz 0042911С nop nop 2) изменить 00xxxxxx: 3BEB cmp ebp,ebx на cmp ebp,ebx 00xxxxxx: 745D jz @0002832E jmp @0002832E Для это правим следующие байты в AVP17.EXE: 0002850B: 75 90 0002850C: 0F 90 000282CF: 74 EB Запакуем ASPacker-ом и можно его переименовать в drweb32w.exe. Теперь это уже не демка. P.S.: Если раньше, во времена ДОСа, веб проверял свою "целку", то сейчас похоже ему пофиг. Т.е. если на AVP17.exe посадить звиря, а затем запаковать, то получиться что то вроде киндер - сюрприза ;). AVP17.EXE и ASPack прилагаются.