Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #82, ОКТЯБРЬ 2005 г.

Ступени полиморфизма

Крис Касперски ака мыщъх

Хакер, номер #082, стр. 082-120-5


[автоматическое определение смещений меток]

my_begin:

CALL $+5 ; прыгаем на следующую команду, занося EIP в стек

POP EBX ; выталкиваем EIP из стека

PUSH EBX ; (как вариант, можно дать INC EBX)

...

JNZ $+4 ; выход из расшифровщика

JMP EBX ; переход на my_begin с динамическим определением адреса

На первый взгляд, каждое последующее поколение вируса выглядит полностью непохожим на предыдущее и по сигнатурам он уже не детектируется. Ведь если подобрать побольше команд-синонимов, количество возможных комбинаций может составить не один миллион. Тресни моя антивирусная база! Тем не менее, в каждой позиции расшифровщика встречается строго определенная комбинация команд, поэтому специальный алгоритм отождествления сможет надежно ее распознать. Естественно, для этого антивирусникам придется потрудиться и запастись хорошей травой. Был как-то у одной такой компании мешок отменной травы, так за месяц скурили! Ну, это ладно.

Не стоит забывать и про эмулятор. Расшифровав основной код вируса, разработчики запросто отождествят его по сигнатуре. Поэтому антиотладочные приемы должны быть! Здесь за уникальность можно уже не опасаться (команды-синонимы делают свое), оттянувшись на полную катушку со всем набором SSE и прочих векторных команд, до которых антивирусным эмуляторам еще ползти и ползти.

[ступень 3: самый мусорный]

Идея: внедряем в расшифровщик мусорные команды, не имеющие никакого побочного эффекта, но преображающие код до неузнаваемости. Чаще всего используются различные вариации NOP, которых насчитываются десятки (например, XCHG EBX, EBX/MOV ECX,ECX/Jx $+2/XCHG EAX, EBX; XCHG EBX, EAX и т.д. - главное фантазию иметь).

Обработанный расшифровщик из листинга 4 после экзекуции может выглядеть, например, так:

[расшифровщик, разбавленный ничего не значащими мусорными командами]

XCHG ECX, ECX

MOV ESI, offset body_begin

JO $+2

MOV EDI, ESI

MOV EAX, EAX

MOV ECX, offset body_end - body_begin

NOP

my_begin:

LODSB

JNZ $+2

XOR AL, 66h

MOV EDI,EDI

STOSB

JZ $+2

LOOP my_begin

Какие проблемы возникают при кодировании? Проблем много. Рассмотрим лишь две из них, как самые важные. Если не предпринять никаких усилий, уже через несколько поколений размер вируса вырастет до облаков и продолжит расти до тех пор, пока не упрется в конец адресного пространства (или отведенной приложению памяти). Чтобы этого избежать, необходимо либо вычищать имеющийся мусор перед добавлением новой порции (что сложно), либо включить в зашифрованное тело копию расшифровщика и всегда издеваться только над ней.

Назад на стр. 082-120-4  Содержание  Вперед на стр. 082-120-6