Advertisement
SquirrelInBox

Untitled

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