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

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

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

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


; (4 понадобилось, потому что блоки нумеруются с 1)

LODSD ; считываем адрес блока

ADD EAX, EBX; добавляем смещение функции

CALL EAX ; вызываем блок

Как вариант, можно поместить перед функцией ASCIIZ-строку с ее именем (например, "my_func"), а затем осуществлять ее хэш-поиск, что позволит абстрагироваться от смещений, а значит, упростить кодирование, но в этом случае содержимое всех блоков должно быть зашифровано, чтобы текстовые строки не сразу бросались в глаза. Впрочем, шифруй - не шифруй, антивирус все равно сможет нас обнаружить, а, обнаружив, - поиметь.

Процедуру опознания можно существенно затруднить, если сократить размер блоков до нескольких машинных команд, «размазав» их по телу файла-жертвы. Внедряться лучше всего в пустые места (например, последовательности нулей или команд NOP /* 90h */ образующиеся при выравнивании). В противном случае нам придется где-то сохранять оригинальное содержимое файла, а затем восстанавливать его, а это геморрой.

Нарезка блоков может происходить как статически - на стадии разработки вируса, так и динамически - в процессе его внедрения, но тогда нам потребуется дизассемблер длин, сложность реализации которого намного превышает «технологичность» всего пермутирующего движка. Так что здесь он будет смотреться, как золотая цепь на шее у бомжа. Ладно, прекратим отвлекаться и рассмотрим общую стратегию внедрения.

Вирус сканирует файл на предмет поиска более или менее длинной последовательности команд NOP или цепочек нулей, записывает в них кусочек своего тела и добавляет команду CALL для перехода на следующий фрагмент. Так продолжается до тех пор, пока вирус полностью не окажется в файле.

Различные программы содержат различное количество свободного места, расходующегося на выравнивание. В программы, откомпилированные с выравниванием на величину 4-х байт, втиснуться практически нереально (поскольку даже команда перехода, не говоря уже о команде CALL, занимает, по меньшей мере, два байта). С программами, откомпилированными с величиной выравнивания от 08h до 10h байт все намного проще, и они вполне пригодны для внедрения.

Ниже в качестве примера приведен фрагмент одного из таких вирусов

[фрагмент файла, зараженного пермутирующим вирусом, «размазывающим» себя по кодовой секции]

.text:08000BD9 xor eax, eax

.text:08000BDB xor ebx, ebx

.text:08000BDD call loc_8000C01

…

.text:08000C01 loc_8000C01:

.text:08000C01 mov ebx, esp

.text:08000C03 mov eax, 90h

.text:08000C08 int 80h

.text:08000C0A add esp, 18h

.text:08000C0D call loc_8000D18

…

.text:08000D18 loc_8000D18:

.text:08000D18 dec eax

.text:08000D19 call short loc_8000D53

.text:08000D1B call short loc_8000D2B

…

.text:08000D53 loc_8000D53:

.text:08000D53 inc eax

.text:08000D54 mov [ebp+8000466h], eax

.text:08000D5A mov edx, eax

.text:08000D5C call short loc_8000D6C

Естественно, фрагменты вируса не обязательно должны следовать линейно друг за другом. Напротив, если только создатель вируса не даун, CALL'ы будут блохой скакать по всему файлу, используя левые эпилоги и прологи для слияния с окружающими функциями.

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