新手破解练习Crackme160之014 - bjanes.1

  1. 暴力破解
    应用点击有错误提示, 直接打开OD搜索界面找错误信息, 果然一眼看到关键字, 定位到Good job 00403A69, 向上找到00403787关键跳
    jg改为jmp, 测试发现还是错, 说明前面还有判断, 继续向前找到这个方法的入口00403620, 下个断点, 开始单步执行, 到00403704处发现大跳, 应该就是这里了, nop掉保存测试, 暴力破解成功

  2. 正常破解
    汇编太难看懂了, 想要从汇编中找到算法对我来说行不通, 只能靠工具了,
    应用是VB开发的, 继续搬出VB Decompiler, 找到点击事件代码:

Private Sub Command1_Click() '403620
  loc_004036BB: var_1C = CrackmeV20a.Text1.Text  '输入框值
  loc_00403704: If (Len(var_1C) <> 9) Then GoTo loc_00403A24 '必须是9位长度'
  loc_00403727: var_1C = CrackmeV20a.Text1.Text '输入框值
  loc_00403787: If var_18 > Len(var_1C) Then GoTo loc_00403AA4 '长度<var_18跳转'
  loc_004037AA: var_1C = CrackmeV20a.Text1.Text '输入框值
  loc_004037E5: var_24 = CrackmeV20a.Text1.Text '输入框值
  loc_004038AD: If ((Asc(Mid$(var_24, vbNull, 1)) > 57) And (Asc(Mid$(var_1C, vbNull, 1)) < 48)) Then GoTo loc_00403A22 '第N位不是数字跳转'
  loc_004038D3: var_1C = CrackmeV20a.Text1.Text '输入框值
  loc_00403909: var_58 = var_18 xor 0002h 'var_18 异或 2'
  loc_0040391B: var_28 = Str$(2) '把数字2转字符型'有什么用没看出来
  loc_00403942: var_8028 = Asc(Mid$(var_1C, vbNull, 1)) '取第N位的acsii值'
  loc_0040394B: var_48 = var_8028
  loc_004039A5: var_80 = Right(0, 1) '取某处的后一位' 其实真实代码是这样的var_80 = Right(var_28, 1)
  loc_00403A04: If ((Str$(var_8028) - 48) <> var_80) Then GoTo loc_00403A22  '第N位不等于最后一位则跳转'
  loc_00403A18: var_18 = 1+var_18 'var_18+1,  这里看应该上面的程序是循环的'
  loc_00403A1D: GoTo loc_0040377C '这里应该循环处'
  loc_00403A22: ' Referenced from: 004038AD
  loc_00403A24: ' Referenced from: 00403704
  loc_00403A8C: MsgBox("Sorry, try again!", 0, "Wrong serial!", 10, 10)
  loc_00403AA2: GoTo loc_00403B22
  loc_00403AA4: ' Referenced from: 00403787
  loc_00403B0C: MsgBox("Good job, tell me how you do that!", 0, "Correct serial!", 10, 10)
  loc_00403B22: ' Referenced from: 00403AA2
  loc_00403B36: GoTo loc_00403B87
  loc_00403B86: Exit Sub
  loc_00403B87: ' Referenced from: 00403B36
End Sub

(可能是VB Decompiler版本问题还是我用法不对, 我看到反汇编代码与论坛中高手们发出来的反汇编码总有部分长的不一样, 可能我用的是破解的原因吧, 人家用正版的)

整体分析下来, 可以得到的信息是, 这个输入的系列号必须是纯数字的9位数, 接下来到OD中单步分析, 00403620点击事件入口下断点
输入123456789, 点击check it进入断点, 004036D9处获取输入值, 004036DD处获取长度, 00403783处判断循环次数是否达到输入字符长度算法就是下面了, 重点关注, 00403826从字符串中取出一位, 下面几行则是比较是否在0x300x39就是字符09之间, 单步过程中好几次看到一个固定串"lFi", 不知道有没有用, 这里先记录一下, 00403909处将当前循环数异或2后存入ebp-0x58这个位置(0019F210=3),
在反汇编代码中我们知道计算出来的值要与对应位数输入串中的值对比 是否一致执行到00403A04处发现程序跳转到失败处了, 说明我们输入的系列号第一位就错了, 不能是1, 到这里突然有个邪恶的想法, 就是既然程序第一位就验证失败跳走了, 我们是不是就可以一位一位来试着破解?, 理论上完全可行的哈~ 就在此处下个断点, 其它处断点全删除, 试到3时, 不再跳, 说明第一位就是3了, 接着试第二位(第几位就需要F9几次, 看跳转处是否会跳转, 不跳则正确), 0就成功了, 同理找出所有为301674501, 在不用搞懂算法的情况下, 把系列号破解出来了_
一大堆的汇编代码看到晕乎晕乎的, 大概思路已经出来了, 就是有一个9位数字, 循环数与2异或, 再取后面一位再与取出来的数对比是不是一致, 现在已经了解算法了, 那就开始写注册机程序吧, 注册机就是反过来计算
计算公式就是: right(N xor 2, 1) = str[N], 下面代码保存为 KeyGen.vbs

for i=1 to 9
	a = i xor 2
	a = right(a,  1)
	str = str & a
next
msgbox(str)

相关软件与破解示例程序可到前十个练习处下载

posted @ 2024-04-17 16:11  hankerstudio  阅读(35)  评论(0)    收藏  举报