Advertisement
SquirrelInBox

task2

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