新CrackMe160之001 - wanao's CrackMe#1-2048

使用PEiD工具分析可知程序是VB编写的, 所以直接使用VB Decompiler v11.5反编译查看源码, 注册按钮事件代码如下(在Form3中):

Private Sub Command3_Click() '412E00
  loc_00412E8C: var_30 = Form3.Text1.Text
  loc_00412F10: var_28 = Form3.Text2.Text
  loc_00412F27: var_8004 = Proc_3_0_413520(Form3.Text2.Text, var_28, Me)
  loc_00412F2F: If var_8004 = 0 Then GoTo loc_00413017
  loc_00412F43: var_B8 = Form3.TestReg(var_28)
  loc_00412FF6: MsgBox("序列号错误!", 16, "错误", 10, 10)
  loc_0041301F: GoTo loc_0041304F
  loc_0041304E: Exit Sub
  loc_0041304F: ' Referenced from: 0041301F
End Sub

其中调用了两个方法Proc_3_0_413520( ) 和 TestReg( ), 代码分别是:

Private Sub Proc_3_0_413520(arg_C) '413520
  loc_00413599: If (Me = global_0040CDA4) Then GoTo loc_00413630
  loc_004135D9: var_58 = "错误"
  loc_004135DB: var_80 = "用户名不能为空!"
  loc_00413605: MsgBox(var_80, 16, var_58, 10, 10)
  loc_0041362B: GoTo loc_0041398D
  loc_00413630: ' Referenced from: 00413599
  loc_0041363E: If Len(var_58 = %S_edx_S) >= 5 Then GoTo loc_00413688
  loc_0041367A: var_58 = "错误"
  loc_0041367C: var_80 = "用户名不能少于5个字符!"
  loc_00413683: GoTo loc_004135E2
  loc_00413688: ' Referenced from: 0041363E
  loc_00413693: call edi(global_0040CDA4, arg_C, "婱餱婨躝^d?", 0, 0, 0)
  loc_00413697: If edi(global_0040CDA4, arg_C, "婱餱婨躝^d?", 0, 0, 0) Then GoTo loc_004136E1
  loc_004136D3: var_58 = "错误"
  loc_004136D5: var_80 = "序列号不能为空!"
  loc_004136DC: GoTo loc_004135E2
  loc_004136E1: ' Referenced from: 00413697
  loc_004136E4: var_800C = Len(ecx = %S_edx_S)
  loc_004136E9: If var_800C = 12 Then GoTo loc_00413733
  loc_00413725: var_58 = "错误"
  loc_00413727: var_80 = "序列号错误!"
  loc_0041372E: GoTo loc_004135E2
  loc_00413733: ' Referenced from: 004136E9
  loc_00413789: For var_20 = 1 To 12 Step Len(ecx = %S_edx_S)
  loc_004137A2: If var_D8 = 0 Then GoTo loc_00413937
  loc_004137C1: var_80 = arg_C
  loc_004137EE: var_38 = CStr(Mid(var_80, CLng(var_20), 1))
  loc_004137F5: var_8014 = Asc(var_38)
  loc_00413804: var_A0 = var_8014
  loc_00413815: var_34 = var_8014
  loc_00413883: var_8020 = CBool((var_34 < Asc(var_38)) Or (var_34 > 57))
  loc_0041388C: If var_8020 = 0 Then GoTo loc_0041391A
  loc_004138FD: MsgBox("序列号错误!", 16, "错误", var_68, 10)
  loc_0041391A: ' Referenced from: 0041388C
  loc_0041392C: Next var_20
  loc_00413932: GoTo loc_004137A0
  loc_00413937: ' Referenced from: 004137A2
  loc_0041394F: var_8024 = (var_20 = CBool(var_68))
  loc_00413958: If var_8024 = 0 Then GoTo loc_00413961
  loc_00413961: ' Referenced from: 00413958
  loc_00413966: GoTo loc_0041398D
  loc_0041398C: Exit Sub
  loc_0041398D: ' Referenced from: 0041362B
  loc_0041398D: ' Referenced from: 00413966
End Sub

Public Function TestReg(s) '413300
  loc_0041337E: var_68 = s
  loc_00413388: If 1 > 10 Then GoTo loc_004133F5
  loc_004133C1: var_800C = CInt("" + Int(Mid(var_68, 1, 1)))
  loc_004133F0: GoTo loc_0041335A
  loc_004133F5: ' Referenced from: 00413388
  loc_0041344F: cwd
  loc_0041347F: var_88 = CInt("" + Int(Mid(s, 12, 1))) Mod 0000000Ah
  loc_004134A6: var_8020 = (&H8002 = Int(Mid(s, 11, 1)))
  loc_004134C4: If var_8020 = 0 Then GoTo loc_004134CD
  loc_004134CD: ' Referenced from: 004134C4
  loc_004134D2: GoTo loc_004134F0
  loc_004134EF: Exit Function
  loc_004134F0: ' Referenced from: 004134D2
End Function

第一个方法 Proc_3_0_413520( ) 验证用户名是否小于5位, 系列号是否为纯数字
第二个方法 TestReg( ) 验证第11位是否等于其它位和 模 10
到这里似乎没用户名什么事~ 只要5位以上即可, 系列号, 11个数的和mod 10 = 第11个数, 我们可以让前10个数都为0, 那就是11位=12位即可满足条件, 如: 000000000011, 测试正常, 成功看到恭喜的提示框, 到这里以为成功了, 按提示重开应用, 发现注册按钮还在, 并没有成功注册~, 所以再分析一下Form1所有事件(VB Decompiler中查看), Form_Load事件中看到了RegStart方法, 代码如下:

Public Sub RegStart() '410780
  Dim var_68 As CommandButton
  loc_004107DA: On Error Resume Next
  loc_00410807: Set var_30 = CreateObject("wscript.shell", 0)
  loc_0041086D: var_68 = IsError(var_30.regread("HKEY_LOCAL_MACHINE\SOFTWARE\2048\name"))
  loc_00410880: If var_68 = 0 Then GoTo loc_00410887
  loc_00410882: GoTo loc_00410A5A
  loc_00410887: ' Referenced from: 00410880
  loc_004108E3: var_2C = var_30.regread("HKEY_LOCAL_MACHINE\SOFTWARE\2048\name")
  loc_0041094E: var_28 = var_30.regread("HKEY_LOCAL_MACHINE\SOFTWARE\2048\serial")
  loc_00410971: var_24 = Proc_3_0_413520(var_2C, var_28, -1)
  loc_00410982: If var_24 = 0 Then GoTo loc_004109D5
  loc_004109A2: var_68 = Form1.TestRegist(var_2C, var_28)
  loc_004109E5: If global_92 = 0 Then GoTo loc_00410A5A
  loc_00410A08: var_68 = Form1.Command3
  loc_00410A16: var_68.Visible = False
  loc_00410A1E: var_6C = var_68
  loc_00410A5A: ' Referenced from: 00410882
  loc_00410A5F: GoTo loc_00410A74
  loc_00410A73: Exit Sub
  loc_00410A74: ' Referenced from: 00410A5F
End Sub

看到需要读取注册表, 这个是Form3注册成功时写入的, 接着又用了两个方法验证是否注册成功 Proc_3_0_413520( ) [这个和上面的一样] 和 TestRegist( ), 代码如下:

Public Sub TestRegist(n, s) '410AC0
  loc_00410B3B: var_20 = "wanao"
  loc_00410B60: If Len(n) <= 7 Then GoTo loc_00410BA6
  loc_00410B97: var_28 = Left(n, 7)
  loc_00410BA6: ' Referenced from: 00410B60
  loc_00410BAC: global_96 = var_28
  loc_00410BDA: If 1 > Len(var_28) Then GoTo loc_00410C83
  loc_00410C4C: var_30 = (Asc(CStr(Mid(var_28, 1, 1))) * var_30)
  loc_00410C7E: GoTo loc_00410BD3
  loc_00410C83: ' Referenced from: 00410BDA
  loc_00410D0F: var_30 = (Asc(CStr(Mid(var_20, esi+1, 1))) * var_30)
  loc_00410D31: GoTo loc_00410C85
  loc_00410D46: var_8C = var_30
  loc_00410DD5: If 1 > 10 Then GoTo loc_00410E8A
  loc_00410E6E: If (Mid(Left(var_30, 10), 1, 1) <> Mid(Left(s, 10), 1, 1)) Then GoTo loc_00410E87
  loc_00410E7F: var_18 = 1+var_18
  loc_00410E82: GoTo loc_00410DCE
  loc_00410E87: ' Referenced from: 00410E6E
  loc_00410E8A: ' Referenced from: 00410DD5
  loc_00410E8E: If var_18 <> 11 Then GoTo loc_00410E99
  loc_00410E93: global_92 = &HFFFFFF
  loc_00410E99: ' Referenced from: 00410E8E
  loc_00410E9F: GoTo loc_00410ECD
  loc_00410ECC: Exit Sub
  loc_00410ECD: ' Referenced from: 00410E9F
End Sub

可看到这里算法跟用户名有关~
1). 用户名取前7位
2). 每位值相乘
3). 再与"wanao"的每一位相乘直到大于100000000
4). 结果前10位与sn前10位要相等
再结果前面分析的结果, sn前10位和加最后一位模10后要等于第11位
到这里我们便可以写注册机了

user = inputbox("请输入用户名(5位以上)")
ulen = len(user)
sum = 1
for i=1 to ulen
  sum = cdbl(sum * asc(mid(user,i,1)))
next
i = 1
str = "wanao"
while sum < 1000000000
  sum = cdbl(sum * asc(mid(str, i, 1)))
wend
Randomize

str = cstr(sum)
n12 = Int(10 * Rnd)
sum = 0
for i=1 to 10
  sum = sum + int(mid(str,i,1))
next
n11 = (sum + n12) mod 10
n12 = cstr(n12)
str = "用户名: " & user & chr(13) & chr(10) & "系列号: " & str & n11 & n12
msgbox str, 0, "注册机"

运行示例:
用户名: abcde
系列号: 950504940004

这节大佬没有尹录视频

 
 
 

使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载

下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~
OD界面布局

posted @ 2024-12-09 08:54  hankerstudio  阅读(71)  评论(0)    收藏  举报