Защитись и замети! Коваленко Дмитрий aka Ingrem Спецвыпуск Xakep, номер #045, стр. 045-068-8 Теперь остается только изменить вызов по адресу 0x00453CE5, чтобы он указывал на наш код: Листинг .00453CE3: 8BC3 mov eax,ebx .00453CE5: E916C4FAFF jmp .000453100 .00453CEA: 54 push esp Все. Запускаем winrar.exe, открываем 29A.RAR. Никакого аварийного завершения, хотя архив отображается пустым (оно и неудивительно, ведь внутри он содержит ошибки, из-за которых собственно и происходило переполнение). А как насчет других файлов? Советую тебе потестировать пропатченный архиватор: создай десяток-другой архивов, распакуй что-то, сделай SFX. Убедись, что все в порядке и патч "прижился" хорошо ;-). Я тестировал свой пропатченный WinRAR около часа – ни одного глюка. Кстати, инсталляцию WinRAR 3.0 rus вместе с пропатченным winrar.exe ты можешь найти на диске. Ну вот, теперь у тебя есть некоторый опыт закрытия дыр в чужих прогах. Как видишь, все оказалось не так-то сложно – просто нужно знание ассемблера и много терпения. Думаю, и то и другое у тебя есть, так что особых трудностей не будет. Удачных патчей! :-) Немного экзотики: неисполняемый стек Кроме элементарных приемов защиты, существуют и более навороченные техники. Одна из них – неисполняемый стек. О нем я расскажу лишь вкратце. Идея состоит в присваивании сегментам стека и данных атрибуты только записи и чтения. Это позволяет защитить приложение от внедрения исполняемого кода, но не спасает от других видов атак (например, от подделки структур). Неисполняемый стек также плохо совместим с компиляторами и интерпретаторами, которые часто генерируют и выполняют код динамически. Существует несколько реализаций неисполняемого стека в виде патчей к ОС Solaris и Linux, но все они не очень удачны. Вот, пожалуй, и все. Дизассемблированный рар .text:00473648 sub_473648 proc near .text:00473648 arg_0 = dword ptr 8; .text:00473648 arg_4 = dword ptr 0Ch; .text:00473648 ; строим стековый фрейм и сохраняем регистры === .text:00473648 push ebp .text:00473649 mov ebp, esp .text:0047364B push esi .text:0047364C push edi ; собственно, работа процедуры === .text:0047364D mov edi, [ebp+arg_4] .text:00473650 mov esi, edi .text:00473652 mov ecx, 0FFFFFFFFh .text:00473657 xor al, al .text:00473659 cld .text:0047365A repne scasb .text:0047365C not ecx .text:0047365E mov edi, [ebp+arg_0] .text:00473661 mov eax, edi .text:00473663 mov edx, ecx .text:00473665 shr ecx, 1 .text:00473667 shr ecx, 1 .text:00473669 cld .text:0047366A repe movsd .text:0047366C mov ecx, edx .text:0047366E and ecx, 3 .text:00473671 repe movsb ; восстанавливаем регистры ====== .text:00473673 pop edi .text:00473674 pop esi .text:00473675 pop ebp .text:00473676 retn; выход .text:00473676 sub_473648 endp Код пачта к WinRar в HIEW 00000100: 60 pushad 00000101: 9C pushfd 00000102: B9FFFFFFFF mov ecx,0FFFFFFFF 00000107: 8BFA mov edi,edx 00000109: 32C0 xor al,al 0000010B: FC cld 0000010C: F2AE repne scasb |