[反汇编练习] 160个CrackMe之013.

本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注册机的东西。

其中,文章中按照如下逻辑编排(解决如下问题):

1、使用什么环境和工具

2、程序分析

3、思路分析和破解流程

4、注册机的探索

----------------------------------

提醒各位看客: 如果文章中的逻辑看不明白,那你一定是没有亲手操刀!OD中的跳转提示很强大,只要你跟踪了,不用怎么看代码就理解了!

----------------------------------

1、工具和环境:

WinXP SP3 + 52Pojie六周年纪念版OD + PEID + 汇编金手指。

160个CrackMe的打包文件。

下载地址: http://pan.baidu.com/s/1xUWOY 密码: jbnq

注:

1、Win7系统对于模块和程序开启了随机初始地址的功能,会给分析带来很大的负担,所以不建议使用Win7进行分析。

2、以上工具都是在52PoJie论坛下的原版程序,NOD32不报毒,个人承诺绝对不会进行任何和木马病毒相关内容。

2、程序分析:

想要破解一个程序,必须先了解这个程序。所以,在破解过程中,对最初程序的分析很重要,他可以帮助我们理解作者的目的和意图,特别是对于注册码的处理细节,从而方便我们反向跟踪和推导。

和上一节一样,打开CHM,选择第13个badboy.exe,保存下来。运行程序,程序界面如下:

列表框分别对应了两个验证:

我们随意输入用户名和序列号,点击Try!,好吧,没有对话框,只是在Serial编辑框里输出Try again!

使用PEID查看:VB5.0-6.0的,无壳。

 

3、思路分析和破解流程

由于没有信息框,所以没办法使用暂停,然后堆栈查找的方式。但是既然这里有文本提示,我们可以尝试加载到OD,使用右键->中文搜索插件->智能搜索,但是….一无所有!

到了这里,基本上傻眼了!(为什么没有012?因为其实我在那里已经傻了!)

上网搜索一些VB调试相关的信息,很多人都提到了VB万能断点,Ctrl+B,搜索816C24,但是不是很会用,然后就有人提到了使用VB的API下断,看到这里我立马想到了之前用到过的bp __vbaStrCmp/__vbaStrComp/__vbaVarTstEq,看起来也很靠谱!

1、打开OD,将exe拖进去,F9运行。

2、在最下面的输入框,输入bp __vbavartsteq,我们就完成了对这个函数的下断。

3、在exe程序中选择第一个,随意输入121212,然后点击【Try】按钮,发现OD断下来了!查看右下角堆栈信息:

  1. 0012F42C 7402461B RETURN to msvbvm50.7402461B from msvbvm50.__vbaStrComp
  2. 0012F430 00000000
  3. 0012F434 0016E98C UNICODE "7703622"
  4. 0012F438 0016FBFC UNICODE "121212"
  5. 0012F43C 7411EA99 RETURN to msvbvm50.7411EA99 from msvbvm50.740245FC
  6. 0012F440 00000000
  7. 0012F444 0016E98C UNICODE "7703622"
  8. 0012F448 0016FBFC UNICODE "121212"
  9. 0012F44C 0016E98C UNICODE "7703622"
  10. 0012F450 0091C394

哈哈,比较的内容是不是很明确!我们将7703622输入serial,点击Try,界面变了:

其实此时还没完,点击OK,继续点Try,发现Try Again!又失败了,怎么回事?回到OD,查看右下角堆栈信息:

  1. 0012F42C 7402461B RETURN to msvbvm50.7402461B from msvbvm50.__vbaStrComp
  2. 0012F430 00000000
  3. 0012F434 00175574 UNICODE "Congratulation !"
  4. 0012F438 0016FBFC UNICODE "7703622"
  5. 0012F43C 7411EA99 RETURN to msvbvm50.7411EA99 from msvbvm50.740245FC
  6. 0012F440 00000000
  7. 0012F444 00175574 UNICODE "Congratulation !"
  8. 0012F448 0016FBFC UNICODE "7703622"
  9. 0012F44C 00175574 UNICODE "Congratulation !"
  10. 0012F450 0091C394

原来此时比较的字符变了,是提示我们成功的字符串!【Congratulation !】,继续输入,OK!

我们重启程序,多做几次测试,发现第一个的Serial是固定的7703622.

重启程序,选择第二个,重复第一个的过程,输入伪码Name:bbdxf   Serial:123456,堆栈信息如下:

  1. ;第一次
  2. 0012F2D4 7402461B RETURN to msvbvm50.7402461B from msvbvm50.__vbaStrComp
  3. 0012F2D8 00000000
  4. 0012F2DC 00175A0C UNICODE "30162-205440"
  5. 0012F2E0 0016FBFC UNICODE "123456"
  6. 0012F2E4 7411EA99 RETURN to msvbvm50.7411EA99 from msvbvm50.740245FC
  7. 0012F2E8 00000000
  8. 0012F2EC 00175A0C UNICODE "30162-205440"
  9. 0012F2F0 0016FBFC UNICODE "123456"
  10. 0012F2F4 00000000
  11. 0012F2F8 00175A0C UNICODE "30162-205440"
  12.  
  13. ;第二次
  14. 0012F42C 7402461B RETURN to msvbvm50.7402461B from msvbvm50.__vbaStrComp
  15. 0012F430 00000000
  16. 0012F434 00175ABC UNICODE "Congratulation bbdxf !"
  17. 0012F438 0016E98C UNICODE "7703622"
  18. 0012F43C 7411EA99 RETURN to msvbvm50.7411EA99 from msvbvm50.740245FC
  19. 0012F440 00000000
  20. 0012F444 00175ABC UNICODE "Congratulation bbdxf !"
  21. 0012F448 0016E98C UNICODE "7703622"
  22. 0012F44C 00175ABC UNICODE "Congratulation bbdxf !"
  23. 0012F450 0091C394
  24.  
  25. ;第三次
  26. 0012F42C 7402461B RETURN to msvbvm50.7402461B from msvbvm50.__vbaStrComp
  27. 0012F430 00000000
  28. 0012F434 00175ABC UNICODE "Congratulation bbdxf !"
  29. 0012F438 0016E98C UNICODE "Try Again!"
  30. 0012F43C 7411EA99 RETURN to msvbvm50.7411EA99 from msvbvm50.740245FC
  31. 0012F440 00000000
  32. 0012F444 00175ABC UNICODE "Congratulation bbdxf !"
  33. 0012F448 0016E98C UNICODE "Try Again!"
  34. 0012F44C 00175ABC UNICODE "Congratulation bbdxf !"
  35. 0012F450 0091C394

很容易看出,Serial是根据Name计算出来的,所以,这一步想要爆破它,需要找到进行比较的位置,然后像以前一样,修改跳转。

但是..

我们如何能知道在程序哪里进行比较的呢?

我不知道。。。

我尝试在右下角的堆栈信息里查找,但是除了找到一个类似有点用的信息外,什么也没有:

0012F448   00175A0C  UNICODE "bbdxf"

0012F44C   0017580C  UNICODE "01106171212140512161011061414041106141404110912111"

0012F450   000075D2

0012F454   0016E98C  UNICODE "123321"

看来只是用OD是解决不了的,先试试上一节用到的VBxxxx那个软件吧:

发现,触发按钮的名称为Command2,大概进行了如下工作,分析部分:

key = 0110617121214051216101106141404110614140411091211100810101608040610121608100416

name = bbdxf

mid name 4 1 ; x

mid key 3 3 ; 106

mid name 5 1 ; f

mid key 6 3 ; 171

mid key 2 2 ; 11

mid name 4 1 ; x

mid name 3 1 ; d

mid key 4 2 ; 6

mid name 5 1 ; f

mid name 4 1 ; x

Str ; 30162

LTrim

Str ; 205440

LTrim

最后组成了一个我们看到的那个序列号。但是,我们还是没有办法使用OD跟踪和修改。

好吧,去网络上找大神吧!

经过搜索发现,VB还是有专门进行反汇编的软件,如SmartCheck,刚将exe拖进去就提示编译了p代码:

p代码是什么?为什么以前从未听说过?还好没人知道,不怕丢人,赶快搜索一下。原来,VB的编译除了常规的方式之外,还可以编译为PCODE,并且PCODE对反汇编分析有很大的干扰,至少现在我是分析不出来。

继续查找PCODE的资料,重点看了两篇:

http://www.pediy.com/kssd/pediy06/pediy6272.htm

http://blog.sina.com.cn/s/blog_5000f4c901013iiy.html

果然不是随便就能搞定的,继续使用SmartCheck分析代码,虽然感觉已经做了很多功课了,但是发现几乎无法理解,太坑了!

  1. 'Data Table: 403D90
  2. loc_4055CC: FLdRfVar var_8C
  3. loc_4055CF: FLdPrThis
  4. loc_4055D0: VCallAd Text1
  5. loc_4055D3: FStAdFunc var_88
  6. loc_4055D6: FLdPr var_88
  7. loc_4055D9: = Me.Text
  8. loc_4055DE: ILdRf var_8C
  9. loc_4055E1: FnLenStr
  10. loc_4055E2: LitI4 5
  11. loc_4055E7: LtI4
  12. loc_4055E8: FFree1Str var_8C
  13. loc_4055EB: FFree1Ad var_88
  14. loc_4055EE: BranchF loc_405607
  15. loc_4055F1: LitStr "At least 5 characters!"
  16. loc_4055F4: FLdPrThis
  17. loc_4055F5: VCallAd Text2
  18. loc_4055F8: FStAdFunc var_88
  19. loc_4055FB: FLdPr var_88
  20. loc_4055FE: Me.Text =
  21. loc_405603: FFree1Ad var_88
  22. loc_405606: ExitProcHresult
  23. loc_405607: LitStr "0110617121214051216101106141404110614140411091211100810101608040610121608100416"
  24. loc_40560A: FStStrCopy var_94
  25. loc_40560D: FLdRfVar var_8C
  26. loc_405610: FLdPrThis
  27. loc_405611: VCallAd Text1
  28. loc_405614: FStAdFunc var_88
  29. loc_405617: FLdPr var_88
  30. loc_40561A: = Me.Text
  31. loc_40561F: FLdZeroAd var_8C
  32. loc_405622: FStStr var_98
  33. loc_405625: FFree1Ad var_88
  34. loc_405628: LitVarI2 var_B8, 1
  35. loc_40562D: FStVar
  36. loc_405631: LitVarI2 var_E8, 4
  37. loc_405636: FLdRfVar var_C8
  38. loc_405639: ILdRf var_98
  39. loc_40563C: FnLenStr
  40. loc_40563D: CVarI4
  41. loc_405641: ForVar var_108
  42. loc_405647: LitVarI2 var_118, 1
  43. loc_40564C: FLdRfVar var_C8
  44. loc_40564F: CI4Var
  45. loc_405651: ILdRf var_98
  46. loc_405654: ImpAdCallI2 Mid$(, , )
  47. loc_405659: FStStrNoPop var_8C
  48. loc_40565C: ImpAdCallI2 Asc()
  49. loc_405661: FStI2 var_13E
  50. loc_405664: LitVarI2 var_138, 3
  51. loc_405669: FLdRfVar var_A8
  52. loc_40566C: LitVarI2 var_D8, 3
  53. loc_405671: MulVar var_128
  54. loc_405675: CI4Var
  55. loc_405677: ILdRf var_94
  56. loc_40567A: ImpAdCallI2 Mid$(, , )
  57. loc_40567F: FStStrNoPop var_13C
  58. loc_405682: ImpAdCallFPR4 push Val()
  59. loc_405687: FStFPR8 var_148
  60. loc_40568A: ILdRf var_90
  61. loc_40568D: CR8I4
  62. loc_40568E: FLdI2 var_13E
  63. loc_405691: CR8I2
  64. loc_405692: FLdFPR8 var_148
  65. loc_405695: MulR8
  66. loc_405696: AddR8
  67. loc_405697: CI4R8
  68. loc_405698: FStR4 var_90
  69. loc_40569B: FFreeStr var_8C = ""
  70. loc_4056A2: FFreeVar var_118 = ""
  71. loc_4056A9: FLdRfVar var_A8
  72. loc_4056AC: LitVarI2 var_B8, 1
  73. loc_4056B1: AddVar var_118
  74. loc_4056B5: FStVar
  75. loc_4056B9: FLdRfVar var_A8
  76. loc_4056BC: LitVarI2 var_B8, 39
  77. loc_4056C1: HardType
  78. loc_4056C2: GeVarBool
  79. loc_4056C4: BranchF loc_4056D0
  80. loc_4056C7: LitVarI2 var_B8, 0
  81. loc_4056CC: FStVar
  82. loc_4056D0: FLdRfVar var_C8
  83. loc_4056D3: NextStepVar var_108
  84. loc_4056D9: LitVarI2 var_B8, 1
  85. loc_4056DE: FStVar
  86. loc_4056E2: LitVarI2 var_E8, 4
  87. loc_4056E7: FLdRfVar var_C8
  88. loc_4056EA: ILdRf var_98
  89. loc_4056ED: FnLenStr
  90. loc_4056EE: CVarI4
  91. loc_4056F2: ForVar var_168
  92. loc_4056F8: LitVarI2 var_1B8, 2
  93. loc_4056FD: FLdRfVar var_A8
  94. loc_405700: LitVarI2 var_188, 2
  95. loc_405705: MulVar var_198
  96. loc_405709: CI4Var
  97. loc_40570B: ILdRf var_94
  98. loc_40570E: ImpAdCallI2 Mid$(, , )
  99. loc_405713: FStStrNoPop var_1BC
  100. loc_405716: ImpAdCallFPR4 push Val()
  101. loc_40571B: FStFPR8 var_148
  102. loc_40571E: FLdRfVar var_178
  103. loc_405721: LitVarI2 var_118, 1
  104. loc_405726: FLdRfVar var_C8
  105. loc_405729: CI4Var
  106. loc_40572B: ILdRf var_98
  107. loc_40572E: ImpAdCallI2 Mid$(, , )
  108. loc_405733: FStStrNoPop var_8C
  109. loc_405736: ImpAdCallI2 Asc()
  110. loc_40573B: LitVarI2 var_138, 1
  111. loc_405740: FLdRfVar var_C8
  112. loc_405743: LitVarI2 var_D8, 1
  113. loc_405748: SubVar var_128
  114. loc_40574C: CI4Var
  115. loc_40574E: ILdRf var_98
  116. loc_405751: ImpAdCallI2 Mid$(, , )
  117. loc_405756: FStStrNoPop var_13C
  118. loc_405759: ImpAdCallI2 Asc()
  119. loc_40575E: MulI2
  120. loc_40575F: CR8I2
  121. loc_405760: FLdFPR8 var_148
  122. loc_405763: MulR8
  123. loc_405764: CVarR8
  124. loc_405768: AddVar var_1DC
  125. loc_40576C: FStVar
  126. loc_405770: FFreeStr var_8C = "": var_13C = ""
  127. loc_405779: FFreeVar var_118 = "": var_138 = ""
  128. loc_405782: FLdRfVar var_A8
  129. loc_405785: LitVarI2 var_B8, 1
  130. loc_40578A: AddVar var_118
  131. loc_40578E: FStVar
  132. loc_405792: FLdRfVar var_A8
  133. loc_405795: LitVarI2 var_B8, 39
  134. loc_40579A: HardType
  135. loc_40579B: GeVarBool
  136. loc_40579D: BranchF loc_4057A9
  137. loc_4057A0: LitVarI2 var_B8, 0
  138. loc_4057A5: FStVar
  139. loc_4057A9: FLdRfVar var_C8
  140. loc_4057AC: NextStepVar var_168
  141. loc_4057B2: FLdRfVar var_90
  142. loc_4057B5: CVarRef
  143. loc_4057BA: ImpAdCallI2 push Chr()
  144. loc_4057BF: FStStrNoPop var_8C
  145. loc_4057C2: ImpAdCallI2 push LTrim$()
  146. loc_4057C7: FStStrNoPop var_13C
  147. loc_4057CA: LitStr "-"
  148. loc_4057CD: ConcatStr
  149. loc_4057CE: FStStrNoPop var_1E0
  150. loc_4057D1: FLdRfVar var_178
  151. loc_4057D4: ImpAdCallI2 push Chr()
  152. loc_4057D9: FStStrNoPop var_1BC
  153. loc_4057DC: ImpAdCallI2 push LTrim$()
  154. loc_4057E1: FStStrNoPop var_1E4
  155. loc_4057E4: ConcatStr
  156. loc_4057E5: FStStr var_1E8
  157. loc_4057E8: FFreeStr var_8C = "": var_13C = "": var_1BC = "": var_1E0 = ""
  158. loc_4057F5: FLdRfVar var_8C
  159. loc_4057F8: FLdPrThis
  160. loc_4057F9: VCallAd Text2
  161. loc_4057FC: FStAdFunc var_88
  162. loc_4057FF: FLdPr var_88
  163. loc_405802: = Me.Text
  164. loc_405807: ILdRf var_8C
  165. loc_40580A: ILdRf var_1E8
  166. loc_40580D: EqStr
  167. loc_40580F: FFree1Str var_8C
  168. loc_405812: FFree1Ad var_88
  169. loc_405815: BranchF loc_4058D5
  170. loc_405818: LitI2_Byte 0
  171. loc_40581A: FLdPrThis
  172. loc_40581B: VCallAd Command2
  173. loc_40581E: FStAdFunc var_88
  174. loc_405821: FLdPr var_88
  175. loc_405824: Me.Visible =
  176. loc_405829: FFree1Ad var_88
  177. loc_40582C: LitI2_Byte 0
  178. loc_40582E: FLdPrThis
  179. loc_40582F: VCallAd Command1
  180. loc_405832: FStAdFunc var_88
  181. loc_405835: FLdPr var_88
  182. loc_405838: Me.Visible =
  183. loc_40583D: FFree1Ad var_88
  184. loc_405840: LitI2_Byte &HFF
  185. loc_405842: FLdPrThis
  186. loc_405843: VCallAd Command5
  187. loc_405846: FStAdFunc var_88
  188. loc_405849: FLdPr var_88
  189. loc_40584C: Me.Visible =
  190. loc_405851: FFree1Ad var_88
  191. loc_405854: LitI2_Byte 0
  192. loc_405856: FLdPrThis
  193. loc_405857: VCallAd Command3
  194. loc_40585A: FStAdFunc var_88
  195. loc_40585D: FLdPr var_88
  196. loc_405860: Me.Visible =
  197. loc_405865: FFree1Ad var_88
  198. loc_405868: LitI2_Byte 0
  199. loc_40586A: FLdPrThis
  200. loc_40586B: VCallAd Text2
  201. loc_40586E: FStAdFunc var_88
  202. loc_405871: FLdPr var_88
  203. loc_405874: Me.Visible =
  204. loc_405879: FFree1Ad var_88
  205. loc_40587C: LitI2_Byte &HFF
  206. loc_40587E: FLdPrThis
  207. loc_40587F: VCallAd Frame3
  208. loc_405882: FStAdFunc var_88
  209. loc_405885: FLdPr var_88
  210. loc_405888: Me.Visible =
  211. loc_40588D: FFree1Ad var_88
  212. loc_405890: LitStr "Congratulation "
  213. loc_405893: FLdRfVar var_8C
  214. loc_405896: FLdPrThis
  215. loc_405897: VCallAd Text1
  216. loc_40589A: FStAdFunc var_88
  217. loc_40589D: FLdPr var_88
  218. loc_4058A0: = Me.Text
  219. loc_4058A5: ILdRf var_8C
  220. loc_4058A8: ConcatStr
  221. loc_4058A9: FStStrNoPop var_13C
  222. loc_4058AC: LitStr " !"
  223. loc_4058AF: ConcatStr
  224. loc_4058B0: FStStrNoPop var_1BC
  225. loc_4058B3: FLdPrThis
  226. loc_4058B4: VCallAd Label3
  227. loc_4058B7: FStAdFunc var_1EC
  228. loc_4058BA: FLdPr var_1EC
  229. loc_4058BD: Me.Caption =
  230. loc_4058C2: FFreeStr var_8C = "": var_13C = ""
  231. loc_4058CB: FFreeAd var_88 = ""
  232. loc_4058D2: Branch loc_4058EA
  233. loc_4058D5: LitStr "Try Again!"
  234. loc_4058D8: FLdPrThis
  235. loc_4058D9: VCallAd Text2
  236. loc_4058DC: FStAdFunc var_88
  237. loc_4058DF: FLdPr var_88
  238. loc_4058E2: Me.Text =
  239. loc_4058E7: FFree1Ad var_88
  240. loc_4058EA: ExitProcHresult

没办法,继续找一个好用一点的吧!然后就找到了VB Explorer,代码还是很乱,虽然有一些具体的函数,但是,哎,模模糊糊,看不明白啊!(其实是能看到代码的地址的,但是使用OD查看地址处,发现完全无法解正常析代码!然后使用IDA,发现他解析的代码和VB Explorer的完全不一样,晕死!)

然后继续寻找,发现PCODE由于微软不公开,他的反汇编很稀有,所以才会这样,但是曾经有一个团队专门研究这个,最终发现了VB PCODE的神器,vb decompiler pro,前前后后找了不下5个版本,但是没有一个是能反汇编源码的,因为这个软件pro版本是收费的,费了老大的Jin,终于在一个边边角角里找到了它!反编译之后的VB代码如下:

command2.click

  1. Private Sub Command2_Click() '4058EC
  2. 'Data Table: 403D90
  3. Dim var_90 As Long
  4. Dim var_1CC As Variant
  5. If (Len(Me.Text1.Text) < 5) Then
  6. loc_4055FE: Me.Text2.Text = "At least 5 characters!"
  7. loc_405606: Exit Sub
  8. End If
  9. loc_40560A: var_94 = "0110617121214051216101106141404110614140411091211100810101608040610121608100416"
  10. loc_405622: var_98 = Me.Text1.Text
  11. loc_40562D: var_A8 = 1 'Variant
  12. For var_108 = 4 To CVar(Len(var_98)): var_C8 = var_108 'Variant
  13. loc_405698: var_90 = CLng((CDbl(var_90) + (CDbl(Asc(Mid$(var_98, CLng(var_C8), 1))) * Val(Mid$(var_94, CLng((var_A8 * 3)), 3)))))
  14. If ((var_A8 + 1) >= 39) Then
  15. loc_4056CC: var_A8 = 0 'Variant
  16. End If
  17. Next var_108 'Variant
  18. loc_4056DE: var_A8 = 1 'Variant
  19. For var_168 = 4 To CVar(Len(var_98)): var_C8 = var_168 'Variant
  20. loc_405764: var_1CC = CVar((CDbl((Asc(Mid$(var_98, CLng(var_C8), 1)) * Asc(Mid$(var_98, CLng((var_C8 - 1)), 1)))) * Val(Mid$(var_94, CLng((var_A8 * 2)), 2)))) 'Double
  21. loc_40576C: var_178 = (var_178 + var_1CC) 'Variant
  22. If ((var_A8 + 1) >= 39) Then
  23. loc_4057A5: var_A8 = 0 'Variant
  24. End If
  25. Next var_168 'Variant
  26. If (Me.Text2.Text = LTrim$(Str(var_90)) & "-" & LTrim$(Str(var_178))) Then
  27. loc_405824: Me.Command2.Visible = False
  28. loc_405838: Me.Command1.Visible = False
  29. loc_40584C: Me.Command5.Visible = True
  30. loc_405860: Me.Command3.Visible = False
  31. loc_405874: Me.Text2.Visible = False
  32. loc_405888: Me.Frame3.Visible = True
  33. loc_4058BD: Me.Label3.Caption = "Congratulation " & Me.Text1.Text & " !"
  34. loc_4058D5: Else
  35. loc_4058E2: Me.Text2.Text = "Try Again!"
  36. End If
  37. loc_4058EA: Exit Sub
  38. End Sub

看着很乱,没办法,但是已经比之前的好多了,边搜索,边修改,注释之后如下:

  1. ub Command2_Click() '4058EC
  2. 'Data Table: 403D90
  3. Dim numSub1 As Long
  4. Dim var_1CC As Variant
  5. ' 判断注册码长度,5个以上
  6. If (Len(Me.Text1.Text) < 5) Then
  7. Me.Text2.Text = "At least 5 characters!"
  8. Exit Sub
  9. End If
  10. ' 产生一个码表
  11. var_94 = "0110617121214051216101106141404110614140411091211100810101608040610121608100416"
  12. strText1 = Me.Text1.Text
  13.  
  14. '第一部分
  15. nforStep = 1 'Variant
  16. For nforStart = 4 To (Len(strText1)): nforStep = nforStart 'Variant
  17. ' CLng 转为long, CDbl 转换为double, Asc ASCII
  18. numSub1 = CLng((CDbl(numSub1) + (CDbl(Asc(Mid$(strText1, CLng(nforStep), 1))) * Val(Mid$(var_94, CLng((nforStep * 3)), 3)))))
  19.  
  20. If ((nforStep + 1) >= 39) Then
  21. nforStep = 0 'Variant
  22. End If
  23. Next nforStart 'Variant
  24.  
  25. ' 第二部分
  26. nforStep = 1 'Variant
  27. For nforStart2 = 4 To (Len(strText1)): nforStep = nforStart2 'Variant
  28. var_1CC = ((CDbl((Asc(Mid$(strText1, CLng(nforStep), 1)) * Asc(Mid$(strText1, CLng((nforStep - 1)), 1)))) * Val(Mid$(var_94, CLng((nforStep * 2)), 2)))) 'Double
  29. numSub2 = (numSub2 + var_1CC) 'Variant
  30. If ((nforStep + 1) >= 39) Then
  31. nforStep = 0 'Variant
  32. End If
  33. Next nforStart2 'Variant
  34.  
  35. If (Me.Text2.Text = LTrim$(Str(numSub1)) & "-" & LTrim$(Str(numSub2))) Then
  36. Me.Command2.Visible = False
  37. Me.Command1.Visible = False
  38. Me.Command5.Visible = True
  39. Me.Command3.Visible = False
  40. Me.Text2.Visible = False
  41. Me.Frame3.Visible = True
  42. Me.Label3.Caption = "Congratulation " & Me.Text1.Text & " !"
  43. Else
  44. Me.Text2.Text = "Try Again!"
  45. End If
  46. Exit Sub
  47. End Sub

最终,还在VS上修改了一个可以修改的版本,可是,可是…运行之后的结果完全和调试的不一样!!坑啊!!

----

PS:以上内容虽不多,但是,我为了未见面的012和这个013,从周一就开始准备了(我上周事先大概分析过了)。012因为是使用TPascal编写,语言太过小众,然后还是16位程序!我先先后后使用了Tubo Debuger,TDebug,C32Asm,windows自带Debug,OD,IDA,还有一个古董级别的分析出了汇编代码和信息框位置,但是无法修改和调试!还有一些似乎能用的调试工具,但是均已失败告终!TNND,我都有骂人的冲动了!013相对中规中矩,但是没想到使用了之前从未听说过的PCODE,哎,然后又将所有知道的和搜索到的反汇编工具一一尝试,最终,最终就是你们看到的这个VB代码了!玩完没想到啊!啥也不说了!

4、注册机探索

 

012胎死腹中,有缘再见!

BY  笨笨D幸福

[反汇编练习] 160个CrackMe之013的更多相关文章

  1. [反汇编练习] 160个CrackMe之027

    [反汇编练习] 160个CrackMe之027. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  2. [反汇编练习] 160个CrackMe之026

    [反汇编练习] 160个CrackMe之026. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  3. [反汇编练习] 160个CrackMe之025

    [反汇编练习] 160个CrackMe之025. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  4. [反汇编练习] 160个CrackMe之024

    [反汇编练习] 160个CrackMe之024. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  5. [反汇编练习] 160个CrackMe之022

    [反汇编练习] 160个CrackMe之022. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  6. [反汇编练习] 160个CrackMe之021

    [反汇编练习] 160个CrackMe之021. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  7. [反汇编练习] 160个CrackMe之020

    [反汇编练习] 160个CrackMe之020. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  8. [反汇编练习] 160个CrackMe之019

    [反汇编练习] 160个CrackMe之018. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  9. [反汇编练习] 160个CrackMe之018

    [反汇编练习] 160个CrackMe之018. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

随机推荐

  1. protocol buffer 整数序列化

    http://blog.csdn.net/csfreebird/article/details/7624807 varints用于正整数 (无符号整数) varints 是 一个很不错的技术.将一个整 ...

  2. c# Invoke和BeginInvoke 区别

    原文:http://www.cnblogs.com/mashang/archive/2009/08/01/1536730.html Control.Invoke 方法 (Delegate) :在拥有此 ...

  3. POJ2104 k-th number 划分树

    又是不带修改的区间第k大,这次用的是一个不同的方法,划分树,划分树感觉上是模拟了快速排序的过程,依照pivot不断地往下划分,然后每一层多存一个toleft[i]数组,就可以知道在这一层里从0到i里有 ...

  4. java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提

    这里举个例子讲解,同步synchronized在什么地方加,以及同步的前提: * 1.必须要有两个以上的线程,才需要同步. * 2.必须是多个线程使用同一个锁. * 3.必须保证同步中只能有一个线程在 ...

  5. 彷徨中的成长-记一个文科生的IT成长过程

    纠结了许久,要不要写这篇文章,然而最终还是写了.就权当总结与呻吟吧..当然,呻吟最开始还是发在自己的站点的,忍不住手贱,还是想发博客园. 1 剧透 人算不如天算:时隔多年,我竟然搞起了前端. 2 发端 ...

  6. [主席树]HDOJ3874 Necklace

    题意:n个数 m个询问 询问的是[l, r]区间内不同的数的和 没有修改,静态的主席树即可 与 SPOJ QUERY 一样 将重复的元素建树即可 注意范围:$N \le  50000$ 每个值不超过1 ...

  7. [Unity菜鸟] 射线

    1. 射线用 Physics.Raycast 都可以判断,用 collider.Raycast 只在某些(不明)情况下可以 void Update() { Ray ray = Camera.main. ...

  8. java:I/O 字节流和字符流

    字节流 InputStream和OutputStream的子类:FileInputStream 和 FileOutputStream 方法: int read(byte[] b,int off,int ...

  9. 谷歌上不了?hoststool一键搞定host 支持在线更新

    https://hosts.huhamhire.com/ http://serve.netsh.org/pub/ipv4-hosts/

  10. UDP丢包和无序 问题的解决方法

    最近在做一个项目,在这之前,做了个验证程序. 发现客户端连续发来1000个1024字节的包,服务器端出现了丢包现象. 纠其原因,是服务端在还未完全处理掉数据,客户端已经数据发送完毕且关闭了. 我用过s ...