interc.asm 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. jumps
  2. .286
  3. .model small
  4. .code
  5. org 100h
  6. start: sub sp, 4
  7. pusha
  8. push ds
  9. push es
  10. call $+13
  11. rIP1 dw offset pass_error
  12. rCS1 dw 0
  13. rIP2 dw 100h
  14. rCS2 dw 0
  15. rlcCnt dw 0
  16. pop si
  17. push cs
  18. pop ax
  19. mov ds, ax
  20. mov es, ax
  21. mov di, ax
  22. sub di, word ptr cs:[si+6]
  23. ; mov word ptr cs:[si+6], di
  24. add di, word ptr cs:[si+2]
  25. mov ax, word ptr cs:[si]
  26. lea bp, cs:[si-9]
  27. mov ds:[bp+offset rpCS-100h], di
  28. mov ds:[bp+offset rpIP-100h], ax
  29. mov ah, 09h
  30. lea dx, ds:[bp+offset enter_pass-100h]
  31. int 21h
  32. ; Read password from stdin
  33. ;-------------------------------
  34. lea di, ds:[bp+offset pass-100h]
  35. mov cx, 20
  36. chrloop:mov ah, 08h
  37. int 21h
  38. cmp al, 0Dh
  39. jz pass_end
  40. stosb
  41. mov ah, 02h
  42. mov dl, '*'
  43. int 21h
  44. dec cx
  45. jnz chrloop
  46. pass_end:
  47. mov ah, 09h
  48. lea dx, ds:[bp+offset newline-100h]
  49. int 21h
  50. sub cx, 20
  51. neg cx
  52. mov ds:[bp+offset pass_len-100h], cx
  53. test cx, cx
  54. jz pass_error
  55. ;-----------------------------------
  56. ; Done
  57. ;Decode test string (to check password validity) and relocation table
  58. ;--------------------------------------------------------------------
  59. lea di, ds:[bp+offset test_pass-100h]
  60. mov cx, 9
  61. call decode
  62. ;----------
  63. ;Done
  64. ;Check password validity
  65. ;------------------------------------
  66. lea di, ds:[bp+offset test_pass-100h]
  67. mov cx, 10
  68. xor ax, ax
  69. xor bx, bx
  70. loop_check:
  71. mov bl, [di]
  72. add al, bl
  73. inc di
  74. loop loop_check
  75. test al, al
  76. jnz pass_error
  77. ;-------------
  78. ; Password OK!
  79. ; Decode reloc table
  80. lea di, ds:[bp+offset reloc-100h]
  81. mov cx, ds:[si+8]
  82. bg_reloc_loop:
  83. cmp cx, 100
  84. jb lst_reloc
  85. push cx
  86. mov cx, 399
  87. push di
  88. call decode
  89. pop di
  90. call submagic
  91. call alignESDI
  92. pop cx
  93. sub cx, 100
  94. jmp bg_reloc_loop
  95. lst_reloc:
  96. shl cx, 2
  97. dec cx
  98. push di
  99. call decode
  100. pop di
  101. call submagic
  102. push cs
  103. pop es
  104. ;Start decoding program
  105. ;----------------------
  106. mov cx, cs:[si+6] ; First, we need to calculate size of coded prog
  107. mov ax, cs:[si+4]
  108. mov bx, cx
  109. shr cx, 12
  110. and bx, 0FFFh
  111. shl bx, 4
  112. add bx, ax
  113. adc cx, 0 ; In cx:bx we got host size
  114. push cs
  115. pop ax
  116. sub ax, word ptr cs:[si+6]
  117. mov cs:[si+6], ax
  118. mov es, ax
  119. xor di, di ; In es:di we've got offset to prog begin
  120. ;First - decode full segments (0xFFFF length)
  121. seg_loop:
  122. test cx, cx
  123. jz resudary_part
  124. push cx
  125. xor cx, cx
  126. not cx
  127. call decode
  128. call submagic
  129. mov ax, es
  130. add ax, 1000h
  131. mov es, ax
  132. pop cx
  133. dec cx
  134. jmp seg_loop
  135. resudary_part:
  136. mov cx, bx
  137. dec cx
  138. call decode
  139. xor di, di
  140. call submagic
  141. ; Substitite relocation table
  142. ;----------------------------
  143. push cs
  144. pop es
  145. mov cx, ds:[si+8] ; Relo item count
  146. mov bx, ds:[si+6]
  147. lea di, ds:[bp+offset reloc-100h]
  148. relowork:
  149. call alignESDI
  150. mov si, es:[di]
  151. mov ax, es:[di+2]
  152. add ax, bx
  153. mov ds, ax
  154. add word ptr ds:[si], bx
  155. add di, 4
  156. loop relowork
  157. ;Normal return to parent proc
  158. ;----------------------------
  159. push ss
  160. pop es
  161. push sp
  162. pop di
  163. mov ax, cs:[bp+offset rpIP-100h]
  164. mov es:[di+14h], ax
  165. mov ax, cs:[bp+offset rpCS-100h]
  166. mov es:[di+16h], ax
  167. pop es
  168. pop ds
  169. popa
  170. retf
  171. ;-----------------------------
  172. ; Done!
  173. ;---------------------------------
  174. pass_error:
  175. mov ah, 09h
  176. lea dx, ds:[bp+offset bad_pass-100h]
  177. int 21h
  178. mov ax, 4CFFh
  179. int 21h
  180. ;------------------
  181. ; es:di - what to decode
  182. ; cx - length
  183. decode proc near
  184. push si
  185. push ax
  186. push cx
  187. loops2: lea si, ds:[bp+offset pass-100h]
  188. cmp cx, ds:[bp+offset pass_len-100h]
  189. jb lasts2
  190. push cx
  191. mov cx, ds:[bp+offset pass_len-100h]
  192. addmag2: mov al, ds:[si]
  193. xor es:[di], al
  194. inc si
  195. inc di
  196. loop addmag2
  197. pop cx
  198. sub cx, ds:[bp+offset pass_len-100h]
  199. jmp loops2
  200. lasts2: inc cx
  201. lasts3: mov al, ds:[si]
  202. xor es:[di], al
  203. inc si
  204. inc di
  205. loop lasts3
  206. pop cx
  207. pop ax
  208. pop si
  209. ret
  210. endp
  211. submagic proc near
  212. push si
  213. push ax
  214. push cx
  215. loops: lea si, ds:[bp+offset test_pass-100h]
  216. cmp cx, 10
  217. jb lasts
  218. push cx
  219. mov cx, 10
  220. addmag: mov al, ds:[si]
  221. sub es:[di], al
  222. inc si
  223. inc di
  224. loop addmag
  225. pop cx
  226. sub cx, 10
  227. jmp loops
  228. lasts: inc cx
  229. lasts0: mov al, ds:[si]
  230. sub es:[di], al
  231. inc si
  232. inc di
  233. loop lasts0
  234. pop cx
  235. pop ax
  236. pop si
  237. ret
  238. endp
  239. ;------------------
  240. alignESDI proc near
  241. push ax
  242. push cx
  243. mov ax, di
  244. shr ax, 4
  245. mov cx, es
  246. add ax, cx
  247. mov es, ax
  248. and di, 0Fh
  249. pop cx
  250. pop ax
  251. ret
  252. endp
  253. ;----------------------
  254. rpIP dw 0
  255. rpCS dw 0
  256. newline db 0dh, 0ah, '$'
  257. enter_pass db 'Please enter pass: $'
  258. bad_pass db 'Sorry, you''ve entred a bad password',0Dh,0Ah,'$'
  259. pass db 20 dup (0)
  260. pass_len dw 0
  261. test_pass db 10, 12, 15, 17, -20, -13, 05, -30, 55, -51
  262. reloc dd ?
  263. end start