Ступени полиморфизма Крис Касперски ака мыщъх Хакер, номер #082, стр. 082-120-6 А вот вторая проблема. Чтобы добавить мусорную инструкцию между двумя другими, необходимо как-то определить, где кончается одна и начинается другая. Вот для этого нам и нужен дизассемблер длин. Дизассемблер длин представляет собой до предела упрощенный x86-дизассемблер, декодирующий инструкции и определяющий их границы. Это достаточно сложная задача, которая не имеет простых и красивых решений. Приходится зарываться в формат кодирования машинных команд, а это целый исторический пласт с кучей наслоений. Когда-то мы дойдем и до него, но нельзя ли пока обойтись методом грубой силы? Можно! Некоторые вирусы определяют границы команд с помощью трассировки, так сказать, руками самого процессора. Но это все равно утомительно. Лучше (и быстрее!) определить границы вручную и занести в специальную таблицу. Уродливо, зато эффективно. Как антивирусы справляются с такими файлами? Да очень просто! Вычищают весь мусор и натягивают на отстоявшийся «осадок» старую добрую сигнатуру. Мусорные команды легко генерировать, но легко и распознавать! Так что данная методика крайне ненадежна и годится разве что для тренировки. [ступень 4: еще более мусорный] Идея: усложнить генерацию мусорных инструкций, сделав ее менее очевидной. Например, если мы видим: MOV EAX,EBX, то перед этим в EAX можно писать все, что угодно. Все равно он будет заново проинициализирован. Более сложная задача: отслеживать обращения к регистрам, выявлять неиспользуемые регистры (как локально, так и глобально), и пихать в них всякую глупость. Для этого нужен не только дизассемблер длин, но и полноценный дизассемблер команд, определяющий, что это именно MOV EAX,EBX, а не что-то другое. Причем необходимо специальным образом обрабатывать флаги - встретив команду, зависимую от флагов (например, Jxx), необходимо найти ближайшую к ней инструкцию, воздействующую на этот флаг, и между ними вставлять только тот мусор, который не оказывает на флаги никакого влияния. Разумеется, это сложно. Очень сложно. Зато такой эффект! [расшифровщик, замусоренный значащими командами] MOV ESI, EAX SUB ESI, ECX XCHG EDX, EBP LEA EBX, [ESI+EDI] ROR AL,8 MOV ESI, offset body_begin XOR ECX, ECX SUB EDI, EAX ADD EBP, ESI NOT EDI MOV EDI, ESI MOV ECX, offset body_end - body_begin CALL $+5 SUB EAX, ECX NOT EBP POP EBX XOR EAX, EAX PUSH EBX SUB EBP,ECX LODSB MOV EAX, EAX ADD EDX, ESI XCHG EBX, EBX XOR AL, 66h XOR EDX, EDX ADD EAX, EDX STOSB MOV EBP, EAX DEC ECX XCHG EBX,EBX MOV EBP,ESI JNZ $+4 JMP EBX body_begin: ; // тело вируса со всеми остальными шифровщиками body_end: Антивирусу, чтобы распознать этот код потребуется реализовать сложную систему графов, анализирующих зависимости по данным и отбрасывающих инструкции, замыкающие граф. Например, MOV EAX, EBX -->gt; ADD EAX, ECX ->gt; MOV EAX, ECX. Последняя команда перекрывает результат деятельности первых двух, выдавая их галимую мусорную природу. Реализовать полиморфный генератор четвертого уровня намного проще, чем разработать лекарство, так что антивирусники тут находятся в проигрыше. |