SquirrelInBox

task2_3

Apr 18th, 2016
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.25 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 2145h ; сказали в памяти, что это мы
  18. oldVec2f dd 0
  19.  
  20.  
  21. my_handler proc ; наш обработчик
  22. cmp ax, 88f8h ; если пришло то, что надо
  23. ; с нужным магическим числом и функцией
  24. jne @@end
  25.  
  26. cmp dx, 88ffh
  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], 2145h
  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, es
  143. ;mov ax, offset my_handler
  144. call get_nums
  145.  
  146. call colon
  147.  
  148. mov ax, bx
  149. ;mov ax, ds
  150. call get_nums
  151. ret
  152. write_current_addr endp
  153.  
  154. finish proc
  155. push ds
  156. mov dx, word ptr[oldVec2f]
  157. mov ds, word ptr [oldVec2f + 2]
  158.  
  159. mov ax, ds
  160. call get_nums
  161.  
  162. call colon
  163.  
  164. mov ax, dx
  165. call get_nums
  166. pop ds
  167.  
  168. call next_line
  169.  
  170. call write_current_addr
  171.  
  172. ret
  173. finish endp
  174.  
  175.  
  176. new_start:
  177. get_args: ; надо прочитать ключи
  178. xor cx, cx
  179. mov cx, cs:[80h]
  180. sub cx, 2000h
  181. dec cx
  182.  
  183. xor bx, bx
  184. mov si, 82h ; адрес первого символа в аргументе
  185. mov bx, 2fh ; код слеша
  186. cmp [si], bl
  187. jne bad ; первый символ не наш - все плохо
  188. dec cx
  189. jmp ok
  190.  
  191. bad:
  192. jmp afail
  193. ok:
  194. inc si
  195.  
  196. xor bx, bx
  197. mov bx, 31h ; код единицы
  198. cmp[si], bl
  199. je is_end_r2 ; прочитали строку /1 - первый ключ
  200.  
  201. xor bx, bx
  202. mov bx, 64h ; код единицы
  203. cmp[si], bl
  204. je is_end_del
  205.  
  206. jmp afail ; плохой аргумент
  207.  
  208. is_end_r2:
  209. dec cx
  210. cmp cx, 0
  211. je r2
  212. jmp afail
  213.  
  214. is_end_del:
  215. dec cx
  216. cmp cx, 0
  217. je del
  218. jmp afail
  219.  
  220. r2:
  221. mov ah, magic_num
  222. mov al, magic_func
  223. mov dx, magic_num_dx
  224. int 2fh
  225. cmp ax, error_code_ok
  226. jne set
  227.  
  228. cmp dx, 0ff88h
  229. je installed
  230.  
  231. set:
  232. call set_int
  233.  
  234. call finish
  235. mov ah, 31h ; ставим резидента с помощью 31h функции
  236. mov al, 00h ; код возврата
  237. mov bx, offset main
  238. sub bx, offset start
  239. add bx, 0fh
  240. sar bx, 4
  241. add bx, 10h
  242.  
  243. mov dx, bx ;(offset r2 - offset start + 15)/16 + 1 ; сколько параграфов поделить сдвигом вправо
  244. int 21h
  245.  
  246. del:
  247. call del_int
  248. cmp ax, 0ffffh
  249. je del_not
  250. mov ah, 9h
  251. lea dx, msg_del
  252. int 21h
  253. ret
  254. del_not:
  255. mov ah, 9h
  256. lea dx, msg_del_not
  257. int 21h
  258. ret
  259.  
  260.  
  261. afail: ; если неправильный аргумент
  262. mov ah, 9h
  263. lea dx, argmess
  264. int 21h
  265. ret
  266.  
  267.  
  268.  
  269. installed: ; если резидент уже загружен
  270. call write_current_addr
  271. ret
  272.  
  273.  
  274. magic_num db 88h
  275. magic_func db 0f8h
  276. magic_num_dx dw 88ffh
  277. error_code_ok dw 0ffh
  278. argmess db "Error: Incorrect args", 0dh, 0ah, '$'
  279. msg_del db "Deleted", 0dh, 0ah, '$'
  280. msg_del_not db "Can't delete", 0dh, 0ah, '$'
  281. nl db 0dh, 0ah, '$'
  282. end start
  283.  
  284. ; почему если в write_current_addr выводить закомментированное, то ответ на повтор будет отличаться
Add Comment
Please, Sign In to add comment