do_crk.asm 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. .286
  2. .model tiny
  3. .code
  4. org 100h
  5. start:
  6. push cs
  7. pop ds
  8. cmp byte ptr cs:[80h], 0
  9. jnz norm_work
  10. mov dx, offset usage
  11. mov ah, 09
  12. int 21h
  13. jmp just_quit
  14. norm_work:
  15. mov di, offset CRKname
  16. mov si, 82h
  17. loop1:
  18. cmp byte ptr ds:[si], 0dh
  19. jz got_fname
  20. cmp byte ptr ds:[si], 20h
  21. jz got_fname
  22. movsb
  23. cmp di, offset buffer
  24. jb loop1
  25. got_fname:
  26. mov byte ptr ds:[di], 0 ; Set ASCIIZ string
  27. mov ax, 3d00h ;
  28. mov dx, offset CRKname ; Opening CRK file
  29. int 21h ;
  30. jnc $+5 ; IF OK!
  31. jmp error_file ; Its about long jump
  32. mov bx, ax
  33. mov hCRKfile, bx
  34. push 100h ; Reading Comment Line
  35. push offset buffer ;
  36. push bx ;
  37. call readln ;
  38. mov dx, offset patching ; Writing that stuff
  39. mov ah, 09
  40. int 21h
  41. mov cx, -1
  42. mov di, offset Buffer
  43. xor ax, ax
  44. repnz scasb
  45. dec di
  46. mov byte ptr ds:[di], '$'
  47. mov dx, offset buffer
  48. mov ah, 09
  49. int 21h
  50. push 100h
  51. push offset buffer
  52. push hCRKfile
  53. call readln
  54. cmp word ptr buffer, 0a0dh
  55. jz $+8
  56. mov dx, offset ERRORInCrk
  57. jmp bad
  58. push 100h
  59. push offset buffer
  60. push hCRKfile
  61. call readln
  62. mov dx, offset tofp ; Writing type of patch stuff
  63. mov ah, 09
  64. int 21h
  65. mov cx, -1
  66. mov di, offset Buffer
  67. xor ax, ax
  68. repnz scasb
  69. dec di
  70. mov byte ptr ds:[di], '$'
  71. mov dx, offset buffer
  72. mov ah, 09
  73. int 21h
  74. push 15
  75. push offset EXEname
  76. push hCRKfile
  77. call readln
  78. mov cx, -1 ; Convert to ASCIIz filename
  79. mov di, offset EXEname
  80. mov al, 0Dh
  81. repnz scasb
  82. dec di
  83. mov byte ptr ds:[di], 0
  84. mov ax, 3D02h
  85. mov dx, offset EXEname
  86. int 21h
  87. jnc $+8 ; IF OK!
  88. mov dx, offset MustRun
  89. jmp bad ; Its about long jump
  90. mov hEXEfile, ax
  91. patch_file:
  92. push 100h
  93. push offset buffer
  94. push hCRKfile
  95. call readln
  96. cmp byte ptr buffer, 0
  97. jnz $+5
  98. jmp Patched_ok
  99. cmp byte ptr buffer[8], ':'
  100. jz $+8 ; IF OK!
  101. mov dx, offset MustRun
  102. jmp bad ; Its about long jump
  103. mov di, offset buffer
  104. call atob
  105. mov ch, al
  106. call atob
  107. mov cl, al
  108. call atob
  109. mov dh, al
  110. call atob
  111. mov dl, al
  112. mov bx, hEXEfile
  113. mov ax, 4200h
  114. int 21h
  115. jnc $+7 ; IF OK!
  116. mov dx, offset BadEXE
  117. jmp bad ; Its about long jump
  118. mov ah, 3fh
  119. mov bx, hEXEfile
  120. mov cx, 1
  121. mov dx, offset EXEchar
  122. int 21h
  123. cmp ax, 1
  124. jz $+7
  125. mov dx, offset BADexe
  126. jmp bad ; Its about long jump
  127. mov di, offset buffer[10]
  128. call atob
  129. cmp al, EXEchar
  130. jz $+7
  131. mov dx, offset BadEXE
  132. jmp bad ; Its about long jump
  133. mov ax, 4201h
  134. mov bx, hEXEfile
  135. xor cx, cx
  136. mov dx, -1
  137. int 21h
  138. mov di, offset buffer[13]
  139. call atob
  140. mov EXEchar, al
  141. mov ah, 40h
  142. mov bx, hEXEfile
  143. mov cx, 1
  144. mov dx, offset EXEchar
  145. int 21h
  146. cmp ax, 01
  147. jnz @@3
  148. jmp patch_file
  149. @@3:
  150. mov dx, offset BadEXE
  151. jmp bad
  152. Patched_ok:
  153. mov dx, offset PatOK
  154. ;--------- ERRORS ------------------
  155. bad:
  156. mov ah, 09
  157. int 21h
  158. jmp good_quit
  159. error_file:
  160. mov cx, -1
  161. mov di, offset CRKname
  162. xor ax, ax
  163. repnz scasb
  164. dec di
  165. mov byte ptr ds:[di], '$'
  166. mov dx, offset notfound
  167. mov ah, 09
  168. int 21h
  169. jmp just_quit
  170. good_quit:
  171. mov bx, hEXEfile
  172. test bx, bx
  173. jz @@1
  174. mov ah, 3eh
  175. int 21h
  176. jnc @@1
  177. mov dx, offset BadEXE
  178. mov ah, 09
  179. int 21h
  180. @@1:
  181. mov bx, hCRKfile
  182. test bx, bx
  183. jz just_quit
  184. mov ah, 3eh
  185. int 21h
  186. just_quit:
  187. mov ah, 4ch
  188. int 21h
  189. ;---------------------------------------------------------
  190. ; Stupid Procedures
  191. ;
  192. ;---------------------------------------------------------
  193. atob proc near ; di - Src 4 bytes string, out: ax - value
  194. push cx
  195. push dx
  196. xor ax, ax
  197. xor dx, dx
  198. mov cx, 2
  199. atow_calcloop:
  200. mov dl, ds:[di]
  201. inc di
  202. sub dl, 30h
  203. cmp dl, 9
  204. jna atow_mul
  205. sub dl, 7
  206. atow_mul:
  207. shl ax, 4
  208. add ax, dx
  209. loop atow_calcloop
  210. pop dx
  211. pop cx
  212. ret
  213. endp
  214. readln proc near
  215. readln_hFILE equ word ptr [bp+04]
  216. readln_Buffer equ word ptr [bp+06]
  217. readln_BufLen equ word ptr [bp+08]
  218. push bp
  219. mov bp, sp
  220. pusha
  221. mov di, readln_Buffer ; Destination
  222. mov si, offset readln_chbuf
  223. mov dx, offset readln_chbuf ; ReadBuffer
  224. mov cx, 1 ; Read only 1 character
  225. mov bx, readln_hFile
  226. mov ax, readln_buffer
  227. add ax, readln_BufLen
  228. push ax
  229. pop bp
  230. readln_read_loop:
  231. mov ah, 3fh
  232. int 21h
  233. cmp ax, 1
  234. jnz good_done
  235. movsb
  236. dec si
  237. mov ax, bp
  238. dec ax
  239. cmp di, ax
  240. jae good_done
  241. cmp byte ptr readln_chbuf, 0Ah
  242. jnz readln_read_loop
  243. good_done:
  244. mov byte ptr ds:[di], 0
  245. popa
  246. pop bp
  247. ret 6
  248. readln_chbuf db ?
  249. endp
  250. ;--------------------- Parametrs ------------------------
  251. usage db 'Usage: do_crk.com <crack.crk>',13,10,'$'
  252. MustRun db 'Patch file not found (must run from progs dir)',13,10,'$'
  253. BadEXE db 'Bad exe file (probably another version?)',13,10,'$'
  254. ErrorInCRK db 'Error IN CRK file',13,10,'$'
  255. PatOK db 'File patched OK!',13,10,'$'
  256. patching db 'Patching - $'
  257. tofp db 'Type of Patch - $'
  258. notfound db 'File not found: '
  259. hCRKfile dw 0
  260. hEXEfile dw 0
  261. EXEchar db ?
  262. CRKname db 15 dup (?)
  263. EXEname db 15 dup (?)
  264. buffer db 100h dup (?)
  265. end start