Advertisement
SquirrelInBox

Untitled

Apr 18th, 2016
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.07 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. mov ax, 0h
  80. ret
  81. @@end:
  82. mov ax, 0ffffh
  83. ret
  84. del_int endp
  85.  
  86.  
  87. main: ; здесь все начинается
  88. jmp new_start
  89.  
  90. get_nums proc
  91. push -1
  92. mov bx, 10h
  93. @@loop1:
  94. xor dx, dx
  95. div bx
  96. push dx
  97. cmp ax, 0
  98. jne @@loop1
  99.  
  100. xor cx, cx
  101. mov cx, 4
  102. xor dx, dx
  103. @@loop:
  104. pop dx
  105. cmp dx, -1
  106. je @@end
  107.  
  108. cmp dl, 0ah
  109. jge @@more
  110.  
  111. add dl, 30h
  112. jmp @@write
  113. @@more:
  114. add dl, 37h
  115.  
  116. @@write:
  117. mov ah, 02h
  118. int 21h
  119. jmp @@loop
  120. @@end:
  121. ret
  122. get_nums endp
  123.  
  124. next_line proc
  125. mov ah, 09h
  126. lea dx, nl
  127. int 21h
  128. ret
  129. next_line endp
  130.  
  131. colon proc
  132. mov ah, 02h
  133. mov dl, 3ah
  134. int 21h
  135. ret
  136. colon endp
  137.  
  138. write_current_addr proc
  139. mov ax, 352fh
  140. int 21h
  141.  
  142. mov ax, word ptr es:[bx + 2]
  143. call get_nums
  144.  
  145. call colon
  146.  
  147. mov ax, word ptr es:[bx]
  148. call get_nums
  149. ret
  150. write_current_addr endp
  151.  
  152. finish proc
  153. push ds
  154. mov dx, word ptr[oldVec2f]
  155. mov ds, word ptr [oldVec2f + 2]
  156.  
  157. mov ax, dx
  158. call get_nums
  159.  
  160. call colon
  161.  
  162. mov ax, ds
  163. call get_nums
  164. pop ds
  165.  
  166. call next_line
  167.  
  168. call write_current_addr
  169.  
  170. ret
  171. finish endp
  172.  
  173.  
  174. new_start:
  175. get_args: ; надо прочитать ключи
  176. xor cx, cx
  177. mov cx, cs:[80h]
  178. sub cx, 2000h
  179. dec cx
  180.  
  181. xor bx, bx
  182. mov si, 82h ; адрес первого символа в аргументе
  183. mov bx, 2fh ; код слеша
  184. cmp [si], bl
  185. jne bad ; первый символ не наш - все плохо
  186. dec cx
  187. jmp ok
  188.  
  189. bad:
  190. jmp afail
  191. ok:
  192. inc si
  193.  
  194. xor bx, bx
  195. mov bx, 31h ; код единицы
  196. cmp[si], bl
  197. je is_end_r2 ; прочитали строку /1 - первый ключ
  198.  
  199. xor bx, bx
  200. mov bx, 64h ; код единицы
  201. cmp[si], bl
  202. je is_end_del
  203.  
  204. jmp afail ; плохой аргумент
  205.  
  206. is_end_r2:
  207. dec cx
  208. cmp cx, 0
  209. je r2
  210. jmp afail
  211.  
  212. is_end_del:
  213. dec cx
  214. cmp cx, 0
  215. je del
  216. jmp afail
  217.  
  218. r2:
  219. mov ah, magic_num
  220. mov al, magic_func
  221. mov dx, magic_num_dx
  222. int 2fh
  223. cmp ax, error_code_ok
  224. jne set
  225.  
  226. cmp dx, 0ff11h
  227. je installed
  228.  
  229. set:
  230. call set_int
  231.  
  232. call finish
  233. mov ah, 31h ; ставим резидента с помощью 31h функции
  234. mov al, 00h ; код возврата
  235. mov bx, offset main
  236. sub bx, offset start
  237. add bx, 0fh
  238. sar bx, 4
  239. add bx, 10h
  240.  
  241. mov dx, bx ;(offset r2 - offset start + 15)/16 + 1 ; сколько параграфов поделить сдвигом вправо
  242. int 21h
  243.  
  244. del:
  245. call del_int
  246. cmp ax, 0ffffh
  247. je del_not
  248. mov ah, 9h
  249. lea dx, msg_del
  250. int 21h
  251. ret
  252. del_not:
  253. mov ah, 9h
  254. lea dx, msg_del_not
  255. int 21h
  256. ret
  257.  
  258.  
  259. afail: ; если неправильный аргумент
  260. mov ah, 9h
  261. lea dx, argmess
  262. int 21h
  263. ret
  264.  
  265.  
  266.  
  267. installed: ; если резидент уже загружен
  268. call write_current_addr
  269. ret
  270.  
  271.  
  272. magic_num db 80h
  273. magic_func db 0f0h
  274. magic_num_dx dw 11ffh
  275. error_code_ok dw 0ffh
  276. argmess db "Error: Incorrect args", 0dh, 0ah, '$'
  277. msg_del db "Deleted", 0dh, 0ah, '$'
  278. msg_del_not db "Can't delete", 0dh, 0ah, '$'
  279. nl db 0dh, 0ah, '$'
  280. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement