SquirrelInBox

Untitled

Apr 18th, 2016
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.57 KB | None | 0 0
  1. LOCALS
  2.  
  3. model tiny
  4. .code
  5. org 100h
  6.  
  7. start:
  8.  
  9. jmp main ; перепрыгиваем все процедуры
  10. dw 2144h ; сказали в памяти, что это мы
  11. oldVec2f dd 0
  12.  
  13.  
  14. my_handler proc ; наш обработчик
  15. cmp ax, 82f2h ; если пришло то, что надо
  16. ; с нужным магическим числом и функцией
  17. jne @@end
  18.  
  19. cmp dx, 22ffh
  20. jne @@end
  21.  
  22. mov ax, error_code_ok ; выставляем код, что резидент наш
  23. xchg dh, dl
  24. @@end:
  25. iret
  26. my_handler endp
  27.  
  28.  
  29. get_old_2f proc
  30. push ax
  31. call our35h
  32. push dx
  33. pop es
  34. pop ax
  35. ret
  36. get_old_2f endp
  37.  
  38.  
  39. set_int proc ; ставим свой обработчик my_handler на вектор 2fh
  40. call get_old_2f ; узнали старый вектор 2fh
  41. mov word ptr [oldVec2f], bx
  42. mov word ptr [oldVec2f+2], es ; записали вектор в переменную
  43. mov dx, offset my_handler
  44. call our25h_to_old_handler
  45. ret
  46. set_int endp
  47.  
  48. del_int proc
  49. call our35h
  50. push dx
  51. pop es
  52. cmp word ptr es:[bx-6], 2144h
  53. jne @@end
  54.  
  55. push ds
  56. mov dx, word ptr es:[bx-4]
  57. mov ax, word ptr es:[bx-2]
  58.  
  59. mov ds, ax
  60. ;mov ax, 252fh
  61. ;int 21h
  62. call our25h_to_old_handler
  63. pop ds
  64.  
  65. push es
  66. mov ax, es:[2ch]
  67. mov es, ax
  68. mov ah, 49h
  69. int 21h
  70. pop es
  71.  
  72. mov ah, 49h
  73. int 21h
  74. @@end:
  75. ret
  76. del_int endp
  77.  
  78.  
  79. our35h proc
  80. push ES ; сохранение ES
  81. xor BX,BX ; 0=> BX
  82. mov ES,BX ; 0=> ES, сегмент начала ОП
  83. mov BX,ES:[4*2fh] ; смещение старого обработчика
  84. mov DX,ES:[4*2fh+2]; cегмент старого обработчика
  85. pop ES
  86.  
  87. ret
  88. our35h endp
  89.  
  90. our25h_to_my_handler proc
  91. cli ; нельзя внешние прерывания
  92. push es
  93.  
  94. xor ax,ax
  95. push ax
  96. pop es
  97. mov ax, offset my_handler ; нашли смещение нового обработчика
  98. ; mov bx, offset my_handler + 2 ; нашли сегмент нового обработчика
  99. mov bx, ds
  100. mov es:[4*2fh], ax
  101. mov es:[4:2fh + 2], bx
  102. pop es
  103. sti
  104. ret
  105. our25h_to_my_handler endp
  106.  
  107.  
  108. our25h_to_old_handler proc
  109. cli ; нельзя внешние прерывания
  110. push es
  111. xor ax,ax
  112. push ax
  113. pop es
  114. mov es:[4*2fh], dx
  115. mov es:[4:2fh + 2], ds
  116. pop es
  117. sti
  118. ret
  119. our25h_to_old_handler endp
  120.  
  121. main: ; здесь все начинается
  122.  
  123. jmp new_start
  124.  
  125. new_start:
  126.  
  127.  
  128. get_args: ; надо прочитать ключи
  129. xor cx, cx
  130. mov cx, cs:[80h]
  131. sub cx, 2000h
  132. dec cx
  133.  
  134. xor bx, bx
  135. mov si, 82h ; адрес первого символа в аргументе
  136. mov bx, 2fh ; код слеша
  137. cmp [si], bl
  138. jne bad ; первый символ не наш - все плохо
  139. dec cx
  140. jmp ok
  141.  
  142. bad:
  143. jmp afail
  144. ok:
  145. inc si
  146.  
  147. xor bx, bx
  148. mov bx, 31h ; код единицы
  149. cmp[si], bl
  150. je is_end_r2 ; прочитали строку /1 - первый ключ
  151.  
  152. xor bx, bx
  153. mov bx, 64h ; код единицы
  154. cmp[si], bl
  155. je is_end_del
  156.  
  157. jmp afail ; плохой аргумент
  158.  
  159. is_end_r2:
  160. dec cx
  161. cmp cx, 0
  162. je r2
  163. jmp afail
  164.  
  165. is_end_del:
  166. dec cx
  167. cmp cx, 0
  168. je del
  169. jmp afail
  170.  
  171. r2:
  172. mov ah, magic_num
  173. mov al, magic_func
  174. mov dx, magic_num_dx
  175. int 2fh
  176. cmp ax, error_code_ok
  177. jne set
  178.  
  179. cmp dx, 0ff22h
  180. je installed
  181.  
  182. set:
  183. call set_int
  184.  
  185. mov ah, 31h ; ставим резидента с помощью 31h функции
  186. mov al, 00h ; код возврата
  187. mov bx, offset main
  188. sub bx, offset start
  189. add bx, 0fh
  190. sar bx, 4
  191. add bx, 10h
  192.  
  193. mov dx, bx ;(offset r2 - offset start + 15)/16 + 1 ; сколько параграфов поделить сдвигом вправо
  194. int 21h
  195.  
  196. del:
  197. call del_int
  198. mov ah, 9h
  199. lea dx, msg_del
  200. int 21h
  201. ret
  202.  
  203.  
  204. afail: ; если неправильный аргумент
  205. mov ah, 9h
  206. lea dx, argmess
  207. int 21h
  208. ret
  209.  
  210.  
  211.  
  212. installed: ; если резидент уже загружен
  213. mov ah, 9h
  214. lea dx, msg_n_inst
  215. int 21h
  216. ret
  217.  
  218.  
  219. magic_num db 82h
  220. magic_func db 0f2h
  221. magic_num_dx dw 22ffh
  222. error_code_ok dw 0f2h
  223. argmess db "Error: Incorrect args", 24h
  224. msg_n_inst db "Allready installed", 0dh, 0ah, '$'
  225. msg_inst db "Resident installed", 0dh, 0ah, '$'
  226. msg_del db "Deleted", 0dh, 0ah, '$'
  227. end start
  228.  
  229.  
  230. ; почему сначала смещение, а потом сегмент
  231. ; почему везде умножаем на 4, когда делаем сами 25h
Add Comment
Please, Sign In to add comment