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

  1.             Tutorial Number 11
  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: 5th Mar 1999
  8.  
  9. Program Details:
  10. Name: Crackme v1.0
  11. Author: MiZ
  12. Language: Visual Basic
  13.  
  14. Tools Used:
  15. Hexeditor, Softice, SmartCheck
  16.  
  17. Cracking Method:
  18. Looking at String Data Reference
  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. No disabled function. Protection is based on a code you enter. This code is
  30. converted using a routine and the final answer is compared to the correct 
  31. one which is coded into the CrackMe.
  32. There is an anti-SmartCheck routine which is similar to Borna Janes'
  33. CrackMe v3.0a. I've written a tutorial for it as well. It is my tutorial 8.
  34.  
  35. __________________________________________________________________________
  36.  
  37.  
  38.                                  The Essay
  39.  
  40. In this essay, when I write type "d edx" or similar commands in Softice,
  41. I mean it without the quotes. I won't go into SmartCheck configuration 
  42. anymore because it can be found in many of my previous tutorials.
  43.  
  44. __________________________________________________________________________
  45.  
  46.  
  47.             Running with SmartCheck
  48.  
  49. The anti-SmartCheck routine is placed differently from Borna's. It is placed
  50. at the start of the crackme. So, if you run SC with it, it will get you 
  51. nowhere.
  52.  
  53. __________________________________________________________________________
  54.  
  55.  
  56.             Softice to the Rescue
  57.  
  58.  
  59. If you have read my tutorial 8, you will know that to break this protection,
  60. you have to breakpoint on __vbastrcomp. Set this breakpoint before running
  61. the CrackMe.
  62.  
  63. **breakpoint is set by typing "bpx __vbastrcomp"
  64.  
  65. Now, Start the crackMe.
  66.  
  67. You will break into the program. The aim of using Softice here is because
  68. the Anti-SmartCheck routine written by MiZ is dependent on time. 
  69. This means that after going through the routine, if the time taken is 
  70. very long, it will mean that SmartCheck is used.
  71.  
  72. Now that you are in Softice, we need to go to the main program code to see
  73. where is the Anti-SmartCheck routine...
  74.  
  75. Press F10 until you see Crackmev10!... below the code window in Softice.
  76. I've cut out the main part of the anti-SmartCheck code here...
  77.  
  78. :0040570E  3BC3                CMP     EAX,EBX    <--start of big loop
  79. :00405710  0F84BF000000        JZ      004057D5    <--Jump out of big loop
  80. ..
  81. ..            __________Snip___________
  82. ..
  83. :00405765  FF156C814000        CALL    [0040816C]
  84. :0040576B  3BC3                CMP     EAX,EBX    <--start of small loop
  85. :0040576D  7449                JZ      004057B8    <--Jump out of small loop
  86. :0040576F  68FC404000          PUSH    004040FC
  87. :00405774  68FC404000          PUSH    004040FC
  88. :00405779  FF159C814000        CALL    [0040819C]
  89. :0040577F  85C0                TEST    EAX,EAX    <--This is where you land
  90. :00405781  751B                JNZ     0040579E
  91. ..
  92. ..            __________Snip___________
  93. .
  94. :004057B0  FF1518824000        CALL    [00408218]
  95. :004057B6  EBB3                JMP     0040576B    <--Jump to start of small loop
  96. ..
  97. ..            __________Snip___________
  98. ..
  99. :004057CA  FF1518824000        CALL    [00408218]
  100. :004057D0  E939FFFFFF          JMP     0040570E    <--Jump to start of big loop
  101.  
  102.  
  103.  
  104. If you keep tracing using F10 you will notice that you go around in circles
  105. for a long long time...
  106. You must disable your breakpoint now or you will keep breaking...
  107.  
  108. **That is how I found out that this part of the code is the 
  109.   Anti-SmartCheck code.
  110.  
  111. Refering to the above code, you will notice that I have labelled 2 loops.
  112. A small one inside a bigger one.
  113. If you try jumping out of the small loop at :0040576D, you will encounter
  114. the big loop and you will be brought back into the small loop again.
  115. So, to solve this, you will need to jump out of the big loop at :00405710.
  116.  
  117. Now, if you have been thinking, you will probably know that if we were to 
  118. run this CrackMe in SmartCheck if you set a breakpoint at :00405710, 
  119. you can force the program to jump out of the big loop and you can continue 
  120. to use SmartCheck without any problems at all. 8)
  121.  
  122. But then, this means that you have to do it everytime you restart the CrackMe.
  123.  
  124. __________________________________________________________________________
  125.  
  126.  
  127.             HexEditor as Support
  128.  
  129. To permanently disable the Anti-SmartCheck routine, we will need to patch
  130. the conditional jump at :00405710. To do this, copy down the code for this
  131. jump (0F84BF000000) and open the CrackMe using a HexEditor.
  132.  
  133. Search for this hex combination. There is only one location for it.
  134.  
  135. Since the instruction is JZ 004057D5 if we want to reverse it, we can
  136. change it to JNZ 004057D5. So if you refer to an opcode reference, you will
  137. know that we need to change 0F84BF000000 to 0F85BF000000. Do it and save it
  138. as a different file.
  139.  
  140. __________________________________________________________________________
  141.  
  142.  
  143.                 Red Herring
  144.  
  145. If you now re-activate the breakpoint __vbastrcomp and do nothing,
  146. you will still break into the CrackMe.
  147.  
  148. Break due to BPX MSVBVM50!__vbaStrComp  (ET=3.01 seconds)
  149. MSVBVM50!__vbaStrComp
  150. :7B2F3564  8BEC                MOV     EBP,ESP
  151. :7B2F3566  53                  PUSH    EBX
  152. :7B2F3567  56                  PUSH    ESI
  153. :7B2F3568  57                  PUSH    EDI
  154. :7B2F3569  837D1000            CMP     DWORD PTR [EBP+10],00
  155. :7B2F356D  BE00000000          MOV     ESI,00000000
  156. :7B2F3572  7406                JZ      7B2F357A
  157.  
  158. :7B2F357A  837D0C00            CMP     DWORD PTR [EBP+0C],00
  159. :7B2F357E  BF00000000          MOV     EDI,00000000
  160. :7B2F3583  7406                JZ      7B2F358B                  (NO JUMP)
  161. :7B2F3585  8B4D0C              MOV     ECX,[EBP+0C]
  162. :7B2F3588  8B79FC              MOV     EDI,[ECX-04]
  163. :7B2F358B  3BFE                CMP     EDI,ESI
  164.  
  165. at :7B2F3585 "d ecx" = You did it!
  166. You will get a message "You did it!NOW Try again!
  167. This is a red herring because when you click on "OK", it is still unregistered.
  168.  
  169. __________________________________________________________________________
  170.  
  171.  
  172.         Calculation Analysis in SmartCheck
  173.  
  174. Now, close the CrackMe and run Smartcheck with the CrackMe.
  175. The breakpoint must be disabled.
  176.  
  177. Type in any code. For this tutorial, I used "12" as the code.
  178. Click on "Check it baby!" 
  179. You will see "Better luck next time!!!" on the CrackMe.
  180.  
  181. Look for cmdReg_Click. Click on the + sign to expand the thread.
  182.  
  183. **You must be in "Show Errors and Specific Events" only.
  184.  
  185. You will see this
  186.  
  187. Len(String:"12") reutrns LONG:2
  188. Mid$(String:"12", long:1, VARIANT:Integer:1)
  189. Asc(String:"1") returns Integer:49
  190. Integer (206) -> Long (206)
  191. Chr$(Integer:206)
  192.  
  193. Explanation:
  194. Now, where did "206" come from?
  195.  
  196. click on Asc(String:"1") returns Integer:49 and
  197. Choose "Show all Events" in SC.
  198. You will see
  199. __vbaVarSub(VARIANT:Integer:49,VARIANT:Integer:255)...
  200. __vbaVarAbs(VARIANT:Integer:-206)
  201.  
  202. So, what this means that 255 is suntracted from
  203. the decimal value for "1" which is 49.
  204. This gives you -206
  205. __vbaVarAbs gives you the absolute value which means that
  206. -206 will give you 206.
  207.  
  208. Chr$(Integer:206)
  209. means that the result (206) is converted back to the corresponding
  210. ascii char.
  211. "1" is then replaced by the character.
  212.  
  213.  
  214. "2" which is the 2nd char is then processed the same way.
  215.  
  216. If you go back to "Show Errors and Specific Events" mode in SC
  217. and click on the Asc(String:"2") returns Integer:50
  218. then choose "Show all Events", you will see
  219.  
  220. __vbaVarSub(VARIANT:Integer:50,VARIANT:Integer:255)...
  221. __vbaVarAbs(VARIANT:Integer:-205)
  222. which is the same for "1"
  223.  
  224.  
  225. Still in "Show all Events" mode, scroll down until you see 
  226. __vbaStrCmp(String:"XXX", String:"YY") ...
  227. where XXX is a bunch of weird charaters and 
  228. YY is the converted char from "12"
  229.  
  230. **__vbaStrCmp is used to compare two strings. This is the breakpoint
  231.   "__vbastrcomp" which you use in Softice.
  232.  
  233. Click on it. On the right window, you will see the whole string of 
  234. the weird characters comparing to the converted "12" which we used 
  235. for the code.
  236.  
  237. Ok. It uses __vbaStrCmp. So back to Softice.
  238.  
  239. __________________________________________________________________________
  240.  
  241.  
  242.             Softice code sniffing
  243.  
  244. Now, enable the breakpoint "__vbastrcomp". You will break when you click
  245. on the "Check it baby!" button. Trace the code using F10
  246.  
  247. Break due to BPX MSVBVM50!__vbaStrComp  (ET=688.85 milliseconds)
  248. MSVBVM50!__vbaStrComp
  249. :7B2F3564  8BEC                MOV     EBP,ESP
  250. :7B2F3566  53                  PUSH    EBX
  251. :7B2F3567  56                  PUSH    ESI
  252. :7B2F3568  57                  PUSH    EDI
  253. :7B2F3569  837D1000            CMP     DWORD PTR [EBP+10],00
  254. :7B2F356D  BE00000000          MOV     ESI,00000000
  255. :7B2F3572  7406                JZ      7B2F357A                  (NO JUMP)
  256. :7B2F3574  8B4510              MOV     EAX,[EBP+10]
  257.  
  258. **If you type "d eax" here, you will see this in your data window
  259.   :00411950 CE 00 CD 00 00 00 00 00-65 64 00 64 00 68 65 63
  260.             ^^    ^^
  261. CE = 206 in Hex which is your 1st converted char
  262. CD = 205 in Hex which is your 2nd converted char
  263.           
  264. Keeping tracing 
  265. :7B2F357A  837D0C00            CMP     DWORD PTR [EBP+0C],00
  266. :7B2F357E  BF00000000          MOV     EDI,00000000
  267. :7B2F3583  7406                JZ      7B2F358B                  (NO JUMP)
  268. :7B2F3585  8B4D0C              MOV     ECX,[EBP+0C]
  269.  
  270. **here, if you type "d ecx", you will see this in your data window
  271.   :00411998 B2 00 13 20 A5 00 DF 00-BC 00 90 00 8F 00 20 20
  272.         ^^    ^^    ^^    ^^    ^^    ^^    ^^    ^^
  273.   :004119A8 8D 00 13 20 DC 02 14 20-39 20 DF 00 CE 00 C6 00
  274.             ^^    ^^    ^^    ^^    ^^    ^^    ^^    ^^
  275.   :004119B8 C6 00 C6 00 D1 00 DF 00-19 20 9D 00 CC 00 CB 00
  276.             ^^    ^^    ^^    ^^    ^^    ^^    ^^    ^^ 
  277.   :004119C8 C9 00 C9 00 C7 00 CB 00-D1 00 
  278.             ^^    ^^    ^^    ^^    ^^
  279.  
  280.  
  281. So, what we typed is converted into something else and compared 
  282. with what is in ecx. (I've placed "  " to show the values used)
  283.                                    ^^
  284.  
  285. **because this is a VB program, values are presented in a 
  286.   w.i.d.e. .c.h.a.r.a.c.t.e.r. .f.o.r.m.a.t
  287.  
  288. Conversion routine explained:
  289. 1) 1st char is converted to it's decimal format.
  290. 2) It is then subtracted by 255 to give a negative answer
  291.    but is then converted to absolute number.
  292. 3) The result is converted back to ascii char using Chr() 
  293.    and replaces the 1st char.
  294.  
  295. The whole code you type is converted in this way.
  296.  
  297. __________________________________________________________________________
  298.  
  299.  
  300.             Code Calculation
  301.  
  302.  
  303. Using an ascii table, and a calculator, 
  304. convert the values B2, 13, A5, DF, BC etc
  305.  
  306. **These are the values you saw when you type "d ecx" after :7B2F3585
  307.  
  308. original |  Change  | subtracted | converted
  309. values   |    to    |    by       | back to
  310. in ecx   |  Decimal |    255     | ascii format
  311. _________|__________|____________|___________________
  312.    B2          178    77        M
  313.    13           19    236        ∞
  314.    A5          165    90        Z
  315.    DF           223    32        Space 
  316.    BC          188    67        C
  317.    90          144    111        o
  318.    8F          143    112        p
  319.    20           32    223        ▀
  320.    8D          141    114        r
  321.    13           19    236        ∞
  322.    DC          220    35        #
  323.    14           20    235        δ
  324.    39           41    214        ╞
  325.    DF           223    32        Space
  326.    CE          206    49        1
  327.    C6          198    57        9
  328.    C6          198    57        9
  329.    C6          198    57        9
  330.    D1          209    46        .
  331.    DF           223    32        Space 
  332.    19           25    230        µ
  333.    9D          157    98        b
  334.    CC          204    51        3
  335.    CB          203    52        4
  336.    C9          201    54        6
  337.    C9          201    54        6
  338.    C7          199    56        8
  339.    CB          203    52        4
  340.    D1          209    46        .
  341.  
  342. So, correct code is: M∞Z Cop▀r∞#δ╞ 1999. µb346684.
  343. which is wrong...
  344.  
  345. Explanation:
  346. I've email to MiZ and because of unknown reasons, 
  347. (he didn't know why either), there was corruption in the data
  348. in ecx. If you had looked carefully at the data shown, you will
  349. notice that instead of 00 in some places, they are replaced by 20 or 02
  350.  
  351. :00411998 B2 00 13 20 A5 00 DF 00-BC 00 90 00 8F 00 20 20
  352.            ^^                       ^^
  353. :004119A8 8D 00 13 20 DC 02 14 20-39 20 DF 00 CE 00 C6 00
  354.                    ^^    ^^    ^^    ^^ 
  355. :004119B8 C6 00 C6 00 D1 00 DF 00-19 20 9D 00 CC 00 CB 00
  356.                                      ^^
  357. :004119C8 C9 00 C9 00 C7 00 CB 00-D1 00 
  358.  
  359. As seen above, those corrupted values 
  360. (which are the ones just before the 20 or 02 that I've highlighted)
  361. coincide with the weird characters we got.
  362.  
  363. The correct code should be MiZ Copyright 1999. mb346684.
  364. We got                M∞Z Cop▀r∞#δ╞ 1999. µb346684.
  365.  
  366. If you enter the correct code, you will get a congratulations message
  367. and the "Unregistered" word is changed to "Registered".
  368.  
  369. CrackMe Cracked!!
  370.  
  371. __________________________________________________________________________
  372.  
  373.  
  374.                              Final Notes
  375.  
  376. This tutorial is dedicated to all the newbies like me.
  377.  
  378. And because I'm a newbie myself, I may have explained certain things wrongly
  379. So, if that is the case, please forgive me. Email me if there is anything 
  380. you are not clear about.
  381.  
  382.  
  383. My thanks and gratitude goes to:-
  384. The Sandman
  385. All the writers of Cracks tutorials and CrackMes