Ступени полиморфизма Крис Касперски ака мыщъх Хакер, номер #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'ы будут блохой скакать по всему файлу, используя левые эпилоги и прологи для слияния с окружающими функциями. |