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