home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / E_bliss / eb_tut22.txt < prev    next >
Text File  |  2000-05-25  |  9KB  |  229 lines

  1.             Tutorial Number 22
  2.  
  3. Written by Etenal Bliss
  4. Email: Eternal_Bliss@hotmail.com
  5. Website: http://crackmes.cjb.net
  6.          http://surf.to/crackmes
  7. Date written: 31st May 1999
  8.  
  9. Program Details:
  10. Name: Crack Me! #1
  11. Author: DaRkShAdOw
  12. Language: Visual Basic 4
  13.  
  14. Tools Used:
  15. Softice
  16.  
  17. Cracking Method:
  18. Code Sniffing
  19.  
  20. Viewing Method:
  21. Use Notepad with Word Wrap switched on
  22. Screen Area set to 800 X 600 pixels (Optional)
  23.  
  24. __________________________________________________________________________
  25.  
  26.  
  27.                         About this protection system
  28.  
  29. This CrackMe contains a hardcoded code which is 12 characters long. It 
  30. doesn't use the 2 common breakpoints (__vbaStrComp and __vbaVarTstEq)
  31. to check the input.
  32.  
  33.  
  34. _________________________________________________________________________
  35.  
  36.  
  37.                 About the tutorial
  38.  
  39. For this tutorial, I'll only be using Softice. And when I say "d eax", do
  40. it without the quotes. And since this is a VB program, there are a lot of
  41. "rubbish" codes while tracing. I'll only be showing the relevant parts.
  42. When you traced through it yourself, don't expect it to be that clear. 8P
  43.  
  44.  
  45. _________________________________________________________________________
  46.  
  47.  
  48.                 Softice
  49.  
  50. First, run the CrackMe. You will be told that the code is 12 char long.
  51. So, enter any 12 chars. I chose "123456789012"
  52.  
  53. Then, we have to choose the breakpoints to use. Because it is a VB program,
  54. I have tried using __vbaStrComp and __vbaVarTstEq. Both of which are the
  55. commonest bp used to break into a VB prog. But in this CrackMe, although
  56. __vbaStrComp does break, the function is not used to compare the input. So,
  57. no point in trying them.
  58.  
  59. Well, we have to have a bp right?? Another bp that is possible is 
  60. multibytetowidechar. This function will change a string to s.t.r.i.n.g and 
  61. is common as well. Not sure why VB has to do this for a string, but maybe
  62. microsoft wants a reason to make big and bloated programs. 8P
  63.  
  64. Anyway, set the bp by typing "bpx multibytetowidechar"
  65.  
  66. If you don't click on any button, the bp will still break. But to get into
  67. the location where the compare is done, we must click on the 
  68. "Go!, let's see if your code number is correct!!!" button.
  69.  
  70. You will break on the function. Press F12 to go out of it and back
  71. to the code that called the function.
  72.  
  73. I've pasted a bit of the codes below.
  74.  
  75. :0F738BC1  FF1500C27B0F        CALL    [KERNEL32!MultiByteToWideChar]
  76. :0F738BC7  8BD8                MOV     EBX,EAX        <<you land here after F12
  77. :0F738BC9  83FEFF              CMP     ESI,-01
  78. :0F738BCC  7501                JNZ     0F738BCF
  79. :0F738BCE  4B                  DEC     EBX
  80. :0F738BCF  53                  PUSH    EBX
  81. :0F738BD0  6A00                PUSH    00
  82. :0F738BD2  FF1518C97B0F        CALL    [OLEAUT32!SysAllocStringLen]
  83. :0F738BD8  8BE8                MOV     EBP,EAX
  84. :0F738BDA  85ED                TEST    EBP,EBP
  85. :0F738BDC  0F845B260100        JZ      0F74B23D
  86. :0F738BE2  43                  INC     EBX
  87. :0F738BE3  53                  PUSH    EBX
  88. :0F738BE4  55                  PUSH    EBP
  89. :0F738BE5  56                  PUSH    ESI
  90. :0F738BE6  57                  PUSH    EDI
  91. :0F738BE7  6A00                PUSH    00
  92. :0F738BE9  6A00                PUSH    00
  93. :0F738BEB  FF1500C27B0F        CALL    [KERNEL32!MultiByteToWideChar]
  94. :0F738BF1  8BC5                MOV     EAX,EBP
  95. :0F738BF3  5D                  POP     EBP
  96.  
  97. After 0F738BF1, if you do a "d eax" to display the content of the register,
  98. you will see 1.2.3.4.5.6.7.8.9.0.1.2
  99. So, we are right about the CrackMe changing 123456789012 to that.
  100.  
  101. We will now have to trace further... Like I said, there are a lot of 
  102. "rubbish" codes floating around. So, be patient. Trace through the codes
  103. using F10. At a certain point, you will notice this piece of code...
  104.  
  105. :0F7A2CFF  6A00                PUSH    00
  106. :0F7A2D01  E894F6F7FF          CALL    0F72239A
  107. :0F7A2D06  6683F800            CMP     AX,00        <<interesting...
  108. :0F7A2D0A  B800000000          MOV     EAX,00000000
  109. :0F7A2D0F  0F94C0              SETZ    AL
  110. :0F7A2D12  F7D8                NEG     EAX
  111. :0F7A2D14  50                  PUSH    EAX
  112. :0F7A2D15  0FB706              MOVZX   EAX,WORD PTR [ESI]
  113. :0F7A2D18  83C602              ADD     ESI,02
  114. :0F7A2D1B  FF2445F4997B0F      JMP     [EAX*2+0F7B99F4]
  115.  
  116. There is a CALL at 0F7A2D01 and then a "CMP AX,00" in the next line...
  117. Let's presume that the call is to check our input. So, at 0F7A2D01, press
  118. F8 and trace into the call.
  119.  
  120. :0F72239A  66837C240400        CMP     WORD PTR [ESP+04],00
  121. :0F7223A0  B800000000          MOV     EAX,00000000
  122. :0F7223A5  0F85DBB20100        JNZ     0F73D686
  123. :0F7223AB  FF74240C            PUSH    DWORD PTR [ESP+0C]
  124. :0F7223AF  FF74240C            PUSH    DWORD PTR [ESP+0C]
  125. :0F7223B3  50                  PUSH    EAX
  126. :0F7223B4  E899FEFFFF          CALL    0F722252    <<another call
  127. :0F7223B9  C20C00              RET     000C
  128.  
  129. It looks like there is nothing there... Just a few pushes and a CALL.
  130. But if you F10 pass the CALL at 0F7223B4, EAX will be equal to FFFFFFFF
  131. and when it returns from the CALL from the above, EAX will be compared to
  132. 00. Bad news... So, let's pretend that the CALL at 0F7223B4 will check our
  133. input. F8 into it.
  134.  
  135. :0F722252  83EC04              SUB     ESP,04
  136. :0F722255  53                  PUSH    EBX
  137. :0F722256  56                  PUSH    ESI
  138. :0F722257  57                  PUSH    EDI
  139. :0F722258  BB00000000          MOV     EBX,00000000
  140. :0F72225D  8B7C241C            MOV     EDI,[ESP+1C]    <<"d edi"
  141. :0F722261  55                  PUSH    EBP
  142. :0F722262  85FF                TEST    EDI,EDI
  143. :0F722264  7403                JZ      0F722269
  144. :0F722266  8B5FFC              MOV     EBX,[EDI-04]
  145. :0F722269  8B74241C            MOV     ESI,[ESP+1C]    <<"d esi"
  146. :0F72226D  85F6                TEST    ESI,ESI
  147. :0F72226F  0F84FAAA0100        JZ      0F73CD6F
  148. :0F722275  8B46FC              MOV     EAX,[ESI-04]
  149. :0F722278  89442410            MOV     [ESP+10],EAX
  150. :0F72227C  8B6C2410            MOV     EBP,[ESP+10]
  151. :0F722280  3BEB                CMP     EBP,EBX
  152. :0F722282  7202                JB      0F722286
  153. :0F722284  8BEB                MOV     EBP,EBX
  154. :0F722286  837C241800          CMP     DWORD PTR [ESP+18],00
  155. :0F72228B  0F8527AB0100        JNZ     0F73CDB8
  156. :0F722291  85ED                TEST    EBP,EBP
  157. :0F722293  0F85E3AA0100        JNZ     0F73CD7C                  (JUMP)
  158. :0F73CD7C  8BC5                MOV     EAX,EBP
  159. :0F73CD7E  D1E8                SHR     EAX,1
  160. :0F73CD80  50                  PUSH    EAX
  161. :0F73CD81  56                  PUSH    ESI
  162. :0F73CD82  57                  PUSH    EDI
  163. :0F73CD83  E8C0E50500          CALL    0F79B348        <<CALL and then TEST!!!
  164. :0F73CD88  85C0                TEST    EAX,EAX
  165. :0F73CD8A  0F851555FEFF        JNZ     0F7222A5
  166.  
  167. If you do a "d edi" at 0F722258 and "d esi" at 0F722269, you will see
  168. "1.2.3.4.5.6.7.8.9.0.1.2" and "q.a.z.w.s.x.e.d.c.r.f.v" respectively...
  169. Well, do you think "qazwsxedcrfv" is the correct code? It is 12 chars long. 8)
  170.  
  171. To see if we are correct, look at line 0F73CD83, there is a CALL, then
  172. followed by a TEST. That is a classic thing that crackers must look out 
  173. for as well.
  174.  
  175. Let's trace into that too... So, F8 when you reach 0F73CD83.
  176.  
  177. :0F79B348  56                  PUSH    ESI
  178. :0F79B349  57                  PUSH    EDI
  179. :0F79B34A  8B7C2410            MOV     EDI,[ESP+10]
  180. :0F79B34E  8B74240C            MOV     ESI,[ESP+0C]
  181. :0F79B352  8B4C2414            MOV     ECX,[ESP+14]
  182. :0F79B356  33C0                XOR     EAX,EAX
  183. :0F79B358  F366A7              REPZ CMPSW        <<see this??
  184. :0F79B35B  7405                JZ      0F79B362                  (NO JUMP)
  185. :0F79B35D  1BC0                SBB     EAX,EAX
  186. :0F79B35F  83D8FF              SBB     EAX,-01
  187. :0F79B362  5F                  POP     EDI
  188. :0F79B363  5E                  POP     ESI
  189. :0F79B364  C20C00              RET     000C
  190.  
  191.  
  192. There is the compare we have been looking for at 0F79B358... 
  193. and ECX=0000000C which is the length to compare... C(hex) = 12 (dec)
  194. And edi and esi contain our input and the correct code respectively.
  195.  
  196. Notice the conditional jump at 0F79B35B? If you enter the correct code,
  197. you will jump pass the 2 "SBB" lines. And EAX will be 00. 8)
  198.  
  199. CrackMe cracked!!
  200.  
  201. __________________________________________________________________________
  202.  
  203.  
  204.                              Additional stuff
  205.  
  206. I suddenly remember about hardcoded codes...Maybe... Just Maybe...
  207.  
  208. Let's open up the CrackMe with a Hexeditor. Look through the whole file.
  209. You will see "q.a.z.w.s.x.e.d.c.r.f.v" at file offset 25246h. 8P
  210.  
  211. Well, if you didn't know the correct code at the start, you will never know
  212. that it is the one even if you had seen it in a Hexeditor.
  213.  
  214. __________________________________________________________________________
  215.  
  216.  
  217.                              Final Notes
  218.  
  219. This tutorial is dedicated to all the newbies like me.
  220.  
  221. And because I'm a newbie myself, I may have explained certain things wrongly
  222. So, if that is the case, please forgive me. Email me if there is anything 
  223. you are not clear about.
  224.  
  225.  
  226. My thanks and gratitude goes to:-
  227.  
  228. All the writers of Cracks tutorials and CrackMes
  229. and also to all the crackers that have been supporting my site and project forum.