新手破解练习Crackme160之088 - unlock
- 暴力破解
程序是VB写的, 所以我们优先使用VB Decompiler v11.5来反编译程序, 直接看伪源码
工具分析可知, 程序有4个窗口, (Main, Form1, Form2, wait), 我们输入注册码, 点按钮验证后, 会弹出计数窗口(wait), 然后再跳到最窗口(工具看了可知是Form2)
查看Main窗口的CheckCode事件, 有看到关键算法, 但没有关键跳转, 代码如下:
Public Sub CheckCode() '412EB7
loc_00412F23: var_28 = Main.Code.Text
loc_00412F47: var_1C = var_28
loc_00412F5E: var_80 = Len(var_1C)
loc_00412F6B: If 1 > var_80 Then GoTo loc_00412FDD
loc_00412FBD: var_24 = (Asc(CStr(Mid(var_1C, 1, 1))) * var_24)
loc_00412FDB: GoTo loc_00412F67
loc_00412FDD: ' Referenced from: 00412F6B
loc_00412FEC: var_800C = ((var_24 / 10) / 67125465716)
loc_00412FF4: GoTo loc_00413019
loc_00413018: Exit Sub
loc_00413019: ' Referenced from: 00412FF4
End Sub
于是我们看第二个窗口(wait)的事件, 结果也没看到关键跳, 继续看第三个窗口(Form2)的Form_Load事件(这个窗口也只有一个事件), 终于看到了很多跳, 代码如下:
Private Sub Form_Load() '4130A3
Dim var_2C As Variant
loc_0041311B: Me = global_00414010.UnkVCall_00000314h
loc_00413131: global_00414010.UnkVCall_00000314h.UnkVCall_0000005Ch
loc_00413166: var_8008 = (global_0041402C = global_00411430)
loc_00413172: If var_8008 = 0 Then GoTo loc_00413185
loc_00413174: var_3C = Time
loc_0041317E: global_0041402C = var_3C
loc_00413183: GoTo loc_004131D8
loc_00413185: ' Referenced from: 00413172
loc_00413185: var_2C = Time
loc_004131C9: var_800C = (DateDiff("s", global_0041402C, var_3C, 1, 1) > 20)
loc_004131D1: If var_800C = 0 Then GoTo loc_004131D8
loc_004131D3: var_8010 = Proc_2_0_413454(0, 0, 0)
loc_004131D8: ' Referenced from: 00413183
loc_004131E1: If global_00414026 <> 444 Then GoTo loc_00413400
loc_00413210: global_00414010.UnkVCall_00000318h
loc_00413229: var_28 = global_00414010.UnkVCall_00000318h.UnkVCall_000000A0h
loc_0041324D: var_18 = var_28
loc_00413264: var_80 = Len(var_18)
loc_0041326F: If 1 > var_80 Then GoTo loc_004132E2
loc_004132A5: var_28 = CStr(Mid(var_18, 1, 1))
loc_004132C5: var_20 = (Asc(var_28) * var_20)
loc_004132E0: GoTo loc_0041326B
loc_004132E2: ' Referenced from: 0041326F
loc_00413323: global_0041403C = ((((var_8020*666 / 8) / 60) - -2) - 0.325)
loc_00413338: global_00414044 = (((var_20 / 10) / 6780496716) * 3)
loc_0041333E: var_8024 = Len(var_18)
loc_00413373: global_0041404C = (((((var_8024*333 / 8) / 60) - -2) - 0.325) - 0.8375)
loc_00413388: If var_8024*333 <> global_00401098 Then GoTo loc_004133B2
loc_004133B0: GoTo loc_004133D7
loc_004133B2: ' Referenced from: 00413388
loc_004133D7: ' Referenced from: 004133B0
loc_004133D8: var_8030 = Global.LoadResStringOld 2, var_28
loc_004133F9: global_00414028 = var_28
loc_00413400: ' Referenced from: 004131E1
loc_00413409: GoTo loc_0041342E
loc_0041342D: Exit Sub
loc_0041342E: ' Referenced from: 00413409
End Sub
我们直接看最后一个关键跳00413388, 在OD中下个断点, 随便输入, 点验证, 断点处"跳转已实现", 说明跳到失败去了, 我们nop掉, 不让跳, 正常就是到成功了~ 保存测试正常~
2. 正常破解
上面分析可知, 00413388处是关键跳, 那它上面代码肯定就是关键算法了, 循环是从0041326F开始的, 我们就在这里下断点, 重新F8单步观察数据, 具体的算法是
将注册码中的每一位asc值相乘再乘2, 除于10, 除以6780496716, 最后再乘以3
其中的 global_0041403C = ((((var_8020*666 / 8) / 60) - -2) - 0.325) 这个var_8020变量不知道怎么来的, 先放一边
其它信息伪代码中也看不太出来了, 只能OD中单步跟踪查看了
00413388关键跳的上面是0041337F fcomp qword ptr ds:[0x401098], ds:[0x401098]这个是固定浮点值72.0, 就是最终计算结果要与这个值比较, 相等就成功了~
也就是注册码每一位相乘的最终结果应该等于这个值( 72 / 3 * 6780496716 * 10 / 2[反过来算] = 813659605920) 因为是多位相乘的结果, 所以我们把这个数因式分解一下
813659605920 = 2^5 * 3^5 * 5 * 7^3 * 17 * 37 * 97
我们的大写字线是65~90, 小写字母是 97 ~ 122, 所以将上面的数字重组一下, 让每一组结果刚好能在这些大小写字母中, 刚好有个97, 那就独立一个了
813659605920 = (97) * (37 * 3[111]) * (17 * 3 * 2[102]) * (7 * 7 * 2[98]) * (7 * 5 * 3[105]) * (2 * 2 * 2 * 3 * 3[72]) = a * o * f * b * i * H = Habfio(从小到大排序)
输入Habfio验证正确, 这几个字母不限顺序, 都可以~
1~160每个破解过程,在吾爱破解论坛都有高手破解过了,也有整理好现成的, 我这边主要就是自己动手操作的过程,与他们的不太一样
附上高手们的连接: 点击前往查看
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载
新人入门教程"玩玩破解,写给新人看" 点击前往查看
我就是从这里开始的,对我这样的小白感觉超级友好~
下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~


浙公网安备 33010602011771号