Advertisement
SquirrelInBox

Untitled

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