ОБЩЕЕ ОПИСАНИЕ МЕТОДОВ, ИСПОЛЬЗУЕМЫХ В ПОЛИМОРФНЫХ ТЕХНОЛОГИЯХ (C) The Black Baron ( Вольный перевод - (с) DrMad, 1998 ) ***> ( Прим. переводчика: написано шикарным строгим английским языком, явно Black Baron - не обкуренный сопливый пацан. J ) <*** Этот документ пытается снабдить введением в работу Полиморфной Технологии. Имеется в виду, что вы знакомы с ассемблером 8086 и логическими функциями XOR, AND и OR. Чтобы на этом закончить, никаких объяснений или логики ассемблера в тексте не будет! Также обратите внимание, что описатель SEGMENT не будет включен ни в один ассемблерный листинг, так что подразумевается, что вы сами знаете - как их заюзать. Методы, описанные в этом документе, используются в моей Мутационной Технологии SMEG (Simulated Meramorphic Encryption Generator) и это не означает, что это единственный способ делать это. Маленький глоссарий терминов из этого документа: ------------------------------------------------ КОДИРОВАНИЕ = Трансформация из оригинальной в альтерна- тивную форму. ДЕКОДИРОВАНИЕ = Трансформирование из альтернативной формы в оригинальную. КЛЮЧ = Регистр или значение, используемые для кодирования/декодирования. СКОЛЬЗЯЩИЙ Ключ, значение которого увеличивается или КЛЮЧ = уменьшается от цикла к циклу. СЧЕТЧИК = Количество байтов в кодируемом коде или данных. ИНДЕКС = Указатель на кодируемый код или данные. СИГНАТУРА = Уникальная группа байтов, которая может быть использована для детектитрования определенных программ. ЭВРИСТИКА = Множество тщательно разработанных правил, применяемых для достижения известного результата. Вопрос: Что такое Полиморфность? -------------------------------- Ответ: Дык, Лонгмановский Английский Словарь определяет: "ПОЛИМОРФНЫЙ или ПОЛИМОРФИЧНЫЙ - прилагат., формальн., научн. - СУЩЕСТВУЮЩИЙ В НЕСКОЛЬКИХ РАЗЛИЧНЫХ ФОРМАХ." Иными словами, нечто, что имеет способность изменять свою форму. По -другому можно определить это как: Мутирующий, Метаморфичный и пр. Вопрос: Что такое Полиморфная Технология? ----------------------------------------- Ответ: Программа со способностью кодировать (или перемешивать) другую программу или данные и снабжать их уникальным расшифровщиком, и все это дожно приводить к тому , чтобы никакие два зашифрованных варианта одной программы или данных не выглядели одинаковыми. Пример: Рассмотрим следующий суперпростой расшифровщик: MOV SI,jumbled_data ; Указатель на шифруемые ; данные MOV CX,10 ; Расшифровываем 10 байт main_loop: XOR BYTE PTR [SI],55 ; Расксориваем байт INC SI ; Следующий байт LOOP main_loop ; Цикл для остальных ; байтов Эта маленькая программулька будет ксорить числом 55 десять байтов в позиции, на которую указывает SI. Если еще раз заксорить этот фрагмент числом 55, то байты восстановятся в свое исходное состояние. Если вы не уверены в этом, освежите в памяти сведения по работе операции XOR. ОК, теперь вы могли бы сказать, что если вы изменяете величину KEY каждый раз, то у нас получился Полиморфик? И да и нет. Если вы так сделали, то зашифрованная часть должна быть Полbморфичной, но расшифровщик оставался бы одним и тем же, разве что изменялась бы величина KEY. Таким образом, сигнатурный сканнер (*1*), который работает с WILDCARDS (*2*) по прежнему находил бы ваш расшифровщик. Одним способом, которым вы могли бы обдурить некоторые сигнатурные сканнеры, является обмен местами для некоторых команд. Итак, имея это в виду, наш расшифровщик мог бы выглядеть так: MOV CX,10 MOV SI,jumbled_data main_loop: XOR BYTE PTR [SI],55 INC SI LOOP main_loop Как вы можете видеть, по прежнему изменения невелики, и это не сможет запутать некоторые из хороших сигнатурных сканнеров. "ФИГНЯ! ЧТО ТАКОЕ НАСТОЯЩИЙ ПОЛИМОРФИЗМ?" - слышу крики! --------------------------------------------------------- Ладно-ладно, "настоящий" Полиморфик должен иметь расшифровщик, который полностью различен каждый раз! Взгляните на следующий расшифровщик: MOV CX,10 NOP NOP MOV SI,jumbled_data NOP main_loop: NOP NOP XOR BYTE PTR [SI],55 NOP INC SI NOP NOP NOP NOP LOOP main_loop Этот расшифровщик похож на предыдущий, но он содержит случайное количество команд NOP, внедренных внутрь. Каждый раз вы должны изменять количество NOPов после каждой команды. Это Полиморфизм в его простейшей форме. Но все еще многие из хороших сигнатурных сканеров не будут иметь проблем с такими простыми Полиморфиками. Они просто должны пропускать NOPы, что откроет им глаза на реальный расшифровщик, так что они теперь опять могут использовать сигнатуры. Нет, "истинный" полиморфик должен быть го-о-раздо более сложным, чем этот. Вместо вставки NOPов внутрь расшифровщика он должен засовывать абсолютно случайное количество абсолютно случайных команд процессора 8086, включая JUMPы и CALLы. Он должен также использовать расзличные основные расшифровщики (возможно, выбирая из заранее подготовленных) и должен изменять все регистры, которые расшифровщик использует каждый раз, учитывая, что генерируемый МУСОРНЫЙ код не портит любые регистры, используемые настоящим расшифровщиком. Итак, имея в виду эти правила, вот новый наш простой расшифровщик: MOV DX,10 ;Часть настоящего расшифровщика MOV SI,1234 ;мусор AND AX,[SI+1234] ;мусор CLD ;мусор MOV DI,jumbled_data ;Часть настоящего расшифровщика TEST [SI+1234],BL ;мусор OR AL,CL ; main_loop:ADD SI,SI ;мусор XOR AX,1234 ;мусор XOR BYTE PTR [DI],55 ;Часть настоящего расшифровщика SUB SI,123 ;мусор INC DI ;Часть настоящего расшифровщика TEST DX,1234 ;мусор AND AL,[BP+1234] ;мусор DEC DX ;Часть настоящего расшифровщика NOP ;мусор XOR AX,DX ;мусор SBB AX,[SI+1234] ;мусор AND DX,DX ;Часть настоящего расшифровщика JNZ main_loop ;Часть настоящего расшифровщика Как вы должны теперь способны видеть, полная перепутаница! Но все еще исполнимый код. Это существенно, чтобы любой мусорный код, герерируемый Полиморфной Технологией был исполнимым, так как он внедрен внутрь расшифровщика. Обратите внимание, что в этом примере часть мусорных команд используют регистры, используемые и расшифровщиком! Это здорово, поскольку обеспечивает, что значения в этих регистрах не изменяются. Также обратите внимание, что теперь мы имеем случайные регистры и случайные команды каждый раз, что обламывает сигнатурные сканнеры (даже самые крутые)! Вместо этого должен использоваться метод ЭВРИСТИЧЕСКОГО анализа, что может приводить к ложным срабатываниям (*3*). Итак, Полиморфная Технология должна включать 3 основных части: -------------------------------------------------------------- 1 .. Генератор случайных чисел 2 .. Генератор мусорного кода 3 .. Генератор расшифровщиков Это все очень разные части, но они должны работать вместе! Ну и как это все работает? Дык, SMEG генерирует случайные расшифровщики примерно так: 1 .. Выбирает случайный набор регистров для использования внутри этого расшифровщика. Оставшиеся регистры используются как "мусорные" регистры для использования мусорным кодом. 2 .. Выбирает один из ужатых заранее подготовленных расшифровщиков. 3 .. Циклически генерирует реальный расшифровщик, разбавляя его мусорным кодом. Для понимания того, как готовятся выбранные регистры для расшифровщика и мусора, вам надо рассмотреть двоичный код команд 8086 процессора: XOR AX,AX = 00110001 11000000 XOR AX,CX = 00110001 11001000 XOR AX,DX = 00110001 11010000 XOR AX,BX = 00110001 11011000 Вы способны увидеть в этом двоичном коде образец (шаблон) для команд 8086? Дык, все команды 8086 гененрируются с использованием логически образцов (шаблонов), и это именно те образцы (шаблоны), которые заставляют процессор 8086 использовать определенные команды с соответствующими режимами адресации. Полный набор форматов команд и точная логика их работы слишком сложны, чтобы помещать их здесь. Тем не менее, любая книжка по системе команд 8086 растолкует вам все это в полном объеме. SMEG использует эти логические образцы (шаблоны) для генерации мусорного кода и расшифровщиков со случайными регистрами, так как шаблоны непосредственно содержат коды регистров и т.п. SMEG генерирует мусорный код так: --------------------------------- Внутри SMEGа есть таблица основных двоичных образцов (шаблонов) для всего множества команд 8086 , но с одним важным отличием - все режимные биты адресных регистров обнулены. Это называется СКЕЛЕТНОЙ ТАБЛИЦЕЙ КОМАНД. Таблица также содержит различные другие байты, используемые SMEGом для определения подходящей битовой позиции для заполнения регистровых полей в шаблонах. Эти шаблоны заполняются при помощи логических команд OR и AND. Используя этот метод, SMEG может генерировать бесконечное число случайных команд 8086 без использования каких либо регистров, используемых расшифровщиком. SMEG также содержит несколько правил двоичной логики для генерации ложных CALLов на фальшивые процедуры и ложных условных JMPов внутри мусорного кода. SMEG генерирует правильный расшифровщик так: ------------------------------------------- Внутри SMEGа есть таблица, содержащая варианты часто используемых команд 8086, используемых в расшифровщиках, таких как XOR [индексный_регистр],регистр и пр. Также есть сохраненная СКЕЛЕТНАЯ ФОРМА с некоторыми управляющими байтами, используемыми генератором расшифровщиков. Также в SMEGе сохранено несколько предварительно подготовленных расшифровщиков, сохраненных в ужатой форме. В общем, завершенный расшифровщик может быть описан, как инструкция генератору расшифровщиков, состоящая из 11 байтов в добавлением списка предварительно подготовленных расшифровщиков, что и безболезненно, и экономит пространство. SMEG генерирует Полиморфный расшифровщик так: --------------------------------------------- Сначала он случайным образом выбирает один из предварительно подготовленных дешифровщиков. Затем он циклически распаковывает каждую команду расшифровщика, заполняет поля требуемыми регистрами, сохраняет их и затем генерирует (для каждой реальной команды) случайное количество случайных команд. Этот цикл повторяется до тех пор, пока не будет изготовлен законченый расшифровщик. Окончательный результат - расшифровщик случайной длины, со случайными регистрами и со случайной заготовкой! Специально следует остановиться на том, как SMEG генерирует индексированные команды со случайным использованием SI,DI и BX с использованием случайного смещения. Например, пусть расшифровщик начинается с адреса 10h, и вот такой вариант проиндексирует этот адрес: MOV SI,10h ; Стартовый адрес MOV AL,[SI] ; Индексируем исходный адрес Но иногда SMEG будет генерировать нечто вроде следующего, снова основанного на расшифровке кода, начиная с адреса 10h: MOV DI,0BFAAh ; Неявный стартовый адрес MOV AL,[DI+4066h) ; 4066h+0BFAAh=10010h (а FFFF=10h)!! Эти индексированное и исходное значения выбираются совершенно случайно, и примеры с 0BFAAh и 4066h допустимы, но в следующий раз они будут совершенно другими! Далее идут два расшифровщика, которые сгенерированы Полиморфной Технологией SMEG. Надо отметить, что я сгенерировал 4000 примера, и не обнаружилось ни одного совпадения! К сожалению, у меня переполнился диск! Но с большой долей вероятности можно сказать, что общее количество комбинаций расшифровщика достигает МИЛЛИАРДОВ! Все строки, помеченные как ";мусор" в следующих листингах означают случайные мусорные команды, которые вставлены в настоящий расшифровщик, обратите внимание, что SMEG имеет возможность генерировать мусорные CALLы на ложные ПРОЦЕДУРЫ, также как и генерировать мусорные условные переходы. Все строки помеченные звездочкой * обозначают действительные части правильного расшифровщика. Я выбрал две генерации для показа, потому что их размеры примерно одинаковы, 386 и 480 байтов. SMEG производит расшифровщики с размерами от 288 до 1536 байтов. Вероятность того, что любые два сгенерированных расшифровщика с одинаковой длиной также идентичны и внутри - составляет один к миллиарду! ; Ассемблерный листинг для расшифровщика 1, длина 386 байтов ;----------------------------------------------------------- ; Размер зашифрованного кода был 07DBh (2011 байтов) ; Зашифрованный код начинался с 0270h ; Этот расшифровщик использует следующие регистры: ; ; DX = Количество байтов в зашифрованном коде ; BX = Индекс, указывающий на зашифрованный код ; AL = Ключ шифрации ; CL = Основной рабочий регистр 0100 JNS 0103 ;мусор 0102 CLD ;мусор 0103 SAR SI,CL ;мусор 0105 CMP BP,0708 ;мусор 0109 STC ;мусор 010A JG 010E ;мусор 010C OR SI,CX ;мусор 010E XOR DI,3221 ;мусор 0112 ADD BP,0805 ;мусор 0116 AND BP,3512 ;мусор 011A SHR SI,CL ;мусор 011C MOV SI,1B04 ;мусор 0120 SAR DI,CL ;мусор 0122 ADC SI,2506 ;мусор 0126 ADC DI,1F11 ;мусор 012A SBB BP,[0F3E] ;мусор 012E CMP BP,3F1E ;мусор 0132 DEC SI ;мусор 0133 NOT DI ;мусор 0135 AND SI,083D ;мусор 0139 INC SI ;мусор 013A SBB DI,0103 ;мусор 013 MOV DX,1791 ;*Устанавливаем регистр счетчика ; Настоящее количество байтов 0141 CLD ;мусор 0142 JB 0146 ;мусор 0144 TEST SI,AX ;мусор 0146 SBB DI,SP ;мусор 0148 TEST DI,[251B] ;мусор 014C TEST CL,[SI] ;мусор 014E SHL BP,1 ;мусор 0150 MOV BX,017D ;мусор 0153 CMC ;мусор 0154 MOV DI,1218 ;мусор 0158 JO 015C ;мусор 015A RCR DI,1 ;мусор 015C STC ;мусор 015D CMP BP,DI ;мусор 015F MOV AX,CS ;* Помещаем сегмент кода в AX 0161 TEST CH,[BX+17] ;мусор 0164 SBB BP,3107 ;мусор 0168 INC DI ;мусор 0169 RCR BP,1 ;мусор 016B MOV DS,AX ;* Совмещаем сегменты кода и ; данных 016D ADD DI,[3B04] ;мусор 0171 MOV AL,50 ;* Устанавливаем ключ дешифрации 0173 JNB 0179 ;мусор 0175 MOV SI,1439 ;мусор 0179 JB 017D ;мусор 017B ADC DI,AX ;мусор 017D JMP 0185 ;мусор 0180 MOV BP,1B36 ;мусор 0184 RET ;мусор 0185 RCR SI,1 ;мусор 0187 MOV BX,842D ;* Устанавливаем индекс 018A SUB SI,CX ;мусор * Сюда возвращается цикл 018C OR DI,0B0F ;мусор 0190 MOV BP,1E3E ;мусор 0194 RCL DI,CL ;мусор 0196 SUB BP,2E12 ;мусор 019A ADD DI,[2E2A] ;мусор 019E ROL SI,CL ;мусор 01A0 MOV CL,[BX+7E43] ;* Берем следующий расшиф- ; ровываемый байт. ВНИМАНИЕ: ; оригинальный индекс 842Dh ; плюс 7E43h=10270h AND FFFFh=0270h! ; А это есть начало расшифровы- ; ваемого кода 01A4 JZ 01AC ;мусор 01A6 TEST BH,[DI+2B3B] ;мусор 01AA CMP [BP+SI],DL ;мусор 01AC ROL DI,1 ;мусор 01AE SBB DI,263A ;мусор 01B2 DEC DX ;* Декрементируем счетчик 01B3 CALL 0180 ;мусор 01B6 MOV DI,CX ;мусор 01B8 ADC BP,282E ;мусор 01BC SUB CL,AL ;* Расшифровываем байт с ; использованием КЛЮЧА 01BE MOV SI,372A ;мусор 01C2 TEST BP,3A10 ;мусор 01C6 CALL 0180 ;мусор 01C9 ADC SI,1317 ;мусор 01CD CLD ;мусор 01CE INC AX ;* Увеличиваем ключевой регистр 01CF XOR SI,203D ;мусор 01D3 JMP 01E1 ;мусор 01D6 DEC DI ;мусор 01D7 CMC ;мусор 01D8 SUB BP,[3624] ;мусор 01DC XOR SI,0200 ;мусор 01E0 RET ;мусор 01E1 CMP [SI+13],BH ;мусор 01E4 SUB DX,0001 ;* Уменьшаем счетчик 01E8 CMP AX,0517 ;мусор 01EC SUB BP,2816 ;мусор 01F0 AND SI,0807 ;мусор 01F4 SUB SI,2E03 ;мусор 01F8 ROR BP,1 ;мусор 01FA INC DI ;мусор 01FB RCR SI,CL ;мусор 01FD TEST CH,DH ;мусор 01FF SUB BP,1026 ;мусор 0203 MOV [BX+7E4],CL ;* Сохраняем расшифрованный байт 0207 JNB 020D ;мусор 0209 XOR DI,1B30 ;мусор 020D CLD ;мусор 020E ADD SI,3C38 ;мусор 0212 INC BX ;* Увеличиваем индекс 0213 XOR DI,0B2C ;мусор 0217 JMP 022F ;мусор 021A OR BP,1C18 ;мусор 021E JLE 0221 ;мусор 0220 DEC BP ;мусор 0221 ADC SI,0E32 ;мусор 0225 AND DI,1522 ;мусор 0229 CMP [BP+SI+36],BH ;мусор 022C ROL SI,1 ;мусор 022E RET ;мусор 022F SHL DI,1 ;мусор 0231 SHR DI,1 ;мусор 0233 DEC DX ;* Уменьшаем счетчик ; долой исходную длину! 0234 JNZ 023F ;* Если не 0, то идем на 023Fh 0236 TEST CL,[BP+DI] ;мусор 0238 ADC BP,012D ;мусор 023C JMP 025B ;* Конец расшифровки! 023F INC BP ;мусор 0240 JNB 0246 ;мусор 0242 CMP BX,0E2E ;мусор 0246 TEST DI,SI ;мусор 0248 SBB SI,3233 ;мусор 024C MOV CX,018A ;* Установка адреса основного ; цикла 024F ROL DI,1 ;мусор 0251 SUB DI,BX ;мусор 0253 SHR DI,1 ;мусор 0255 TEST BL,[BX+DI+1C2E] ;мусор 0259 PUSH CX ;* Адрес цикла в стек 025A RET ;* Возврат в основной цикл 025B MOV SI,211F ;мусор 025F CMP BL,[BX+DI] ;мусор 0261 SUB BP,2D33 ;мусор 0265 MOV BP,3735 ;мусор 0269 XOR SI,SI ;мусор 026B MOV BP,[0A38] ;мусор 026F INC DI ;мусор 0270 Зашифрованный код начинается здесь ;****** Конец ассемблерного листинга 1-го расшифровщика **** ; Ассемблерный листинг для расшифровщика 2, длина 480 байтов ;----------------------------------------------------------- ; Размер зашифрованного кода был 07DBh (2011 байтов) ; Зашифрованный код начинался с 02E0h ; Этот расшифровщик использует следующие регистры: ; ; AX = Количество байтов в зашифрованном коде ; BX = Индекс, указывающий на зашифрованный код ; DL = Ключ шифрации ; CL = Основной рабочий регистр 0100 NOT SI ;мусор 0102 TEST CH,[BP+DI+0F] ;мусор 0105 INC DI ;мусор 0106 CLD ;мусор 0107 ADC DI,132A ;мусор 010B JPE 0111 ;мусор 010D OR DI,332E ;мусор 0111 INC SI ;мусор 0112 TEST AL,CH ;мусор 0114 JMP 0120 ;мусор 0117 JPE 011D ;мусор 0119 CMP DX,1909 ;мусор 011D RCR DI,CL ;мусор 011F RET ;мусор 0120 INC DI ;мусор 0121 TEST DI,BP ;мусор 0123 JMP 0133 ;мусор 0126 TEST DI,0E24 ;мусор 012A TEST DI,093A ;мусор 012E AND DI,SP ;мусор 0130 CMP [BP+SI],BH ;мусор 0132 RET ;мусор 0133 MOV BP,0C28 ;мусор 0137 TEST DH,CH ;мусор 0139 TEST BP,1C16 ;мусор 013D ROR BP,CL ;мусор 013F JZ 0145 ;мусор 0141 TEST DH,[BX] ;мусор 0143 ADD DI,SP ;мусор 0145 TEST CL,[SI+3435] ;мусор 0149 MOV BP,2E08 ;мусор 014D TEST CX,DI ;мусор 014F CLD ;мусор 0150 MOV SI,3831 ;мусор 0154 AND BP,363E ;мусор 0158 ROR DI,CL ;мусор 015A CLC ;мусор 015B JNS 0163 ;мусор 015D SAR SI,1 ;мусор 015F SBB DI,3308 ;мусор 0163 SBB DI,362B ;мусор 0167 MOV AX,07DB ;* Установка регистра счетчика 016A AND DI,0F1E ;мусор 016E JMP 0182 ;мусор 0171 MOV DI,2F31 ;мусор 0175 CMP CX,2212 ;мусор 0179 SBB SI,2E14 ;мусор 017D TEST BL,[SI+341D] ;мусор 0181 RET ;мусор 0182 CMP BH,19 ;мусор 0185 MOV BX,B977 ;* Установка индексного регистра 0188 TEST AL,[DI+072C] ;мусор 018C TEST DI,2306 ;мусор 0190 SHR SI,1 ;мусор 0192 MOV DX,CS ;* Поместить в DX сегмент кода 0194 CALL 0171 ;мусор 0197 TEST SI,1410 ;мусор 019B CLC ;мусор 019C SHL DI,CL ;мусор 019Е MOV DS,DX ;* Совмещаем сегменты кода и данных 01A0 NEG SI ;мусор 01A2 CALL 0171 ;мусор 01A5 TEST CH,[BP+DI+070F] ;мусор 01A9 MOV DL,8D ;* Установка ключевого регистра 01AB MOV DI,3A30 ;мусор 01AF JMP 01B9 ;мусор 01B2 JBE 01B5 ;мусор 01B4 INC DI ;мусор 01B5 NOT DI ;мусор 01B7 CMC ;мусор 01B8 RET ;мусор 01B9 XOR CX,DX ;мусор 01BB CALL 01B2 ;мусор * Сюда вернем цикл 01BE TEST SI,3029 ;мусор 01C2 INC DI ;мусор 01C3 SBB DI,1E19 ;мусор 01C7 MOV DI,0038 ;мусор 01CB RCR DI,CL ;мусор 01CD MOV BP,1809 ;мусор 01D1 NEG BYTE PTR [BX+4969] ;* NEG байт в [BX + 4969] ; NOTE: оригинальный индекс B977h плюс ; 4969h = 102E0h AND FFFFh = 02E0h! ; А это начало расшифровываемого ; кода 01D5 TEST BP,2A37 ;мусор 01D9 CMP CX,2B37 ;мусор 01DD JMP 01E2 ;мусор 01E0 DEC DI ;мусор 01E1 RET ;мусор 01E2 MOV CL,[BX+4969] ;* Берем байт в CL 01E6 CMC ;мусор 01E7 ROR DI,CL ;мусор 01E9 INC BP ;мусор 01EA TEST DI,281E ;мусор 01EE JZ 01F3 ;мусор 01F0 TEST BH,[BX+DI+05] ;мусор 01F3 MOV DI,160C ;мусор 01F7 SUB BP,BP ;мусор 01F9 XOR CX,DX ;* Ксорим его с ключом 01FB TEST BL,[BP+DI+3C] ;мусор 01FE JNB 0204 ;мусор 0200 ADD BP,0A13 ;мусор 0204 CMP [BX+DI],CL ;мусор 0206 CALL 01E0 ;мусор 0209 CALL 01E0 ;мусор 020C DEC DI ;мусор 020D AND DI,073A ;мусор 0211 DEC AX ;* Вычитаем счетчик 0212 XOR DI,2036 ;мусор 0216 NEG BP ;мусор 0218 ADC DI,SP ;мусор 021A CMC ;мусор 021B CMP BL,[BX+SI] ;мусор 021D DEC DX ;* Уменьшаем ключ 021E ADC BP,1821 ;мусор 0222 SHL DI,CL ;мусор 0224 CMP AX,1816 ;мусор 0228 SHL DI,1 ;мусор 022A CMP AL,[BP+DI+1A] ;мусор 022D MOV SI,1819 ;мусор 0231 ADD SI,063B ;мусор 0235 DEC DX ;* Уменьшаем ключ 0236 SUB BP,0028 ;мусор 023A AND BP,1930 ;мусор 023E CLD ;мусор 023F ADC BP,2D1D ;мусор 0243 SAR DI,CL ;мусор 0245 XCHG CX,DX ;* Меняем местами CX и DX 0247 TEST CX,DX ;мусор 0249 MOV SI,CX ;мусор 024B XOR SI,030D ;мусор 024F SUB DI,311C ;мусор 0253 XCHG DL,[BX+4969] ;* Меняем местами [index] и DL ; ВНИМАНИЕ: это восстанавливает ; зашифрованный байт 0257 ADD DI,0E13 ;мусор 025B CMP BL,[BP+DI+33] ;мусор 025E CLD ;мусор 025F NOT SI ;мусор 0261 MOV SI,3F1C ;мусор 0265 XCHG CX,DX ;* Меняем местами CX и DX, ; восстанавливая ключ в DL 0267 MOV SI,221A ;мусор 026B OR BP,0D2C ;мусор 026F MOV DI,231B ;мусор 0273 ADD BX,0001 ;* Увеличиваем индекс 0277 JMP 0288 ;мусор 027A ADC BP,AX ;мусор 027C TEST BL,[DI+19] ;мусор 027F TEST DI,0321 ;мусор 0283 NEG DI ;мусор 0285 ROL SI,CL ;мусор 0287 RET ;мусор 0288 SBB BP,1B0D ;мусор 028C XOR BP,2A23 ;мусор 0290 CMP DL,3A ;мусор 0293 TEST BH,[DI] ;мусор 0295 AND AX,AX ;* Проверяем счетчик на 0 0297 JNZ 02AD ;* Идем на 02ADh, если нет 0299 CALL 027A ;мусор 029C AND DI,291F ;мусор 02A0 JA 02A6 ;мусор 02A2 MOV DI,0514 ;мусор 02A6 ADC SI,1F2A ;мусор 02AA JMP 02BC ;* Конец расшифровки 02AD JMP 02B2 ;мусор 02B0 CLC ;мусор 02B1 RET ;мусор 02B2 SHL DI,CL ;мусор 02B4 CLD ;мусор 02B5 ADD SI,2C1A ;мусор 02B9 JMP 01BB ;* Возврат в основной цикл 02BC TEST BH,BL ;мусор 02BE MOV DI,210C ;мусор 02C2 SUB SI,1600 ;мусор 02C6 CALL 02B0 ;мусор 02C9 XOR SI,2F1D ;мусор 02CD MOV BP,0430 ;мусор 02D1 TEST BH,[DI+362A] ;мусор 02D5 OR DI,1C21 ;мусор 02D9 STC ;мусор 02DA CMP DI,2828 ;мусор 02DE CLC ;мусор 02DF DEC BP ;мусор 02E0 Зашифрованный код начинается здесь ;**** Конец ассемблерного листинга 2-го расшифровщика *** Далее идут 16-ричные дампы для обоих вышеприведенных расшифровщиков, расшифровщик 1 слева, расшифровщик 2 справа. Эти дампы приведены для того, чтобы показать, насколько сложно найти сигнатуру, которую можно было бы применить к каждому из этих расшифровщиков. чтобы детектировать оба, и это главное назначение Полиморфной Технологии! Чтобы детектировать, вместо этого вы должны написать программу, которая пытается использовать интеллект для разборки того, что выглядит как Полиморфно сгенерированный расшифровщик. Это будет вызывать ложные срабатывания или, в отдельных случаях, полную потерю расшифровщика! 16-ричный дамп # 1, 368 bytes 16-ричный дамп #2, 480 bytes -------------------------------- -------------------------------- 7901FCD3FE81FD0807F97F020BF181F7 F7D6846B0F47FC81D72A137A0481CF2E 213281C5050881E51235D3EEC7C6041B 334684C5E909007A0481FA0919D3DFC3 D3FF81D6062581D7111F1B2E3E0F81FD 4785FDE90D00F7C7240EF7C73A0923FC 1E3F4EF7D781E63D084681DF0301BA91 383AC3C7C5280C84F5F7C5161CD3CD74 17FC720285F01BFC853E1B25840CD1E5 04843703FC848C3534C7C5082E85CFFC BB7D01F5C7C718127002D1DFF939FD8C C7C6313881E53E36D3CFF87906D1FE81 C8846F1781DD073147D1DD8ED8033E04 DF083381DF2B36B8DB0781E71E0FE911 3BB0507304C7C63914720213F8E90500 00C7C7312F81F9122281DE142E849C1D C7C5361BC3D1DEBB2D842BF181CF0F0B 34C380FF19BB77B984852C07F7C70623 C7C53E1ED3D781ED122E033E2A2ED3C6 D1EE8CCAE8DAFFF7C61014F8D3E78EDA 8A8F437E740684BD3B2B3812D1C781DF F7DEE8CCFF84AB0F07B28DC7C7303AE9 3A264AE8CAFF8BF981D52E282AC8C7C6 0700760147F7D7F5C333CAE8F4FFF7C6 2A37F7C5103AE8B7FF81D61713FC4081 29304781DF191EC7C73800D3DFC7C509 F63D20E90B004FF52B2E243681F60002 18F69F6949F7C5372A81F9372BE90200 C3387C1381EA010081F8170581ED1628 4FC38A8F6949F5D3CF45F7C71E287403 81E6070881EE032ED1CD47D3DE84EE81 847905C7C70C162BED33CA845B3C7304 ED2610888F437E730481F7301BFC81C6 81C5130A3809E8D7FFE8D4FF4F81E73A 383C4381F72C0BE9150081CD181C7E01 074881F73620F7DD13FCF53A184A81D5 4D81D6320E81E72215387A36D1C6C3D1 2118D3E781F81618D1E73A431AC7C619 E7D1EF4A7509840B81D52D01E91C0045 1881C63B064A81ED280081E53019FC81 730481FB2E0E85FE81DE3332B98A01D1 D51D2DD3FF87CA85CA8BF181F60D0381 C72BFBD1EF84992E1C51C3C7C61F213A EF1C318697694981C7130E3A5B33FCF7 1981ED332DC7C5353733F68B2E380A47 D6C7C61C3F87CAC7C61A2281CD2C0DC7 C71B2381C30100E90E0013E8845D19F7 C72103F7DFD3C6C381DD0D1B81F5232A 80FA3A843D23C07514E8DEFF81E71F29 7704C7C7140581D62A1FE90F00E90200 F8C3D3E7FC81C61A2CE9FFFE84FBC7C7 0C2181EE0016E8E7FF81F61D2FC7C530 0484BD2A3681CF211CF981FF2828F84D Итак, я надеюсь, что это короткое введение в работу Полиморфных Технологий заинтересует вас и, возможно, заставит вас писать их самостоятельно? (C) The Black Baron ***> ( Примечания переводчика: (*1*) антивирусы, распознающие вирусы по характерным последовательностям байтов - сигнатурам; (*2*) шаблоны для подстановки, типа * и/или ? в командах DOS; (*3*) статья написана в 1993 или 1994 г. ) <*** |