160个CrakeMe程序之013
本帖最后由 海天一色001 于 2017-6-24 17:53 编辑第12个CM程序经一个多星期的努力终于无奈宣布失败,NE程序实在是不知道如何去爆破和追码!
第13个CM程序,作者badboy,难度一星,保护方式是Name/Serial,Serial(VB5),也显示出仍是一个VB程序。
先运行看一下程序基本情况,有两种情况,CrackMe 1.0版和CrackMe 2.0版,1.0只有序列号,2.0则是用户名/序列号方式。两种方式输入假码后,按Try按钮均不弹出窗口,在Serial文本框中显示出“Try Again!”的提示。
先查壳,无壳,VB5/6程序。
第一步,爆破(没完成!!!!):
导入OD,第11个CM时试用了按钮事件断点,这次再练一下:
在反汇编窗口中右键查找二进制字串或快捷键“Ctrl+B”,输入“816C24”,确定,
这一次没找到按钮事件断点!查字符串吧:
竟然也没找到任何字符串!
既然如此,只有用一下插件中的VB断点了:
点开VB,将“BP__vbaStrComp”选上,则在OD下方的命令窗口已出现了这条命令。F9运行程序,点开CrackMe 1.0,输入“1111111111”,点击“Try”按钮,程序马上中断于74023563处,这是msvbvm50.dll的地盘,不是程序领空:
本想在堆栈窗口选返回到反汇编窗口,可仔细观察堆栈窗口,发现了疑似序列号的数字“7714890”!!!!
将这串数字复制入文本框,再点“Try”按钮,程序返回成功界面!
再切换到CrackMe 2.0,输入用户“52pojie.cn”,密码“1111111111”,点击“Try”按钮,程序直接中断,堆栈中出现了“UNICODE "106993-697776"”的字符串!
和CrackMe 1.0相似,再将“106993-697776”复制入Serial文本框中,再试,成功了!
等会儿,这个“OK”按钮又有什么作用?试一试!返回到用户名/序列号界面了!再点击一次“Try”按钮,没动静!再看堆栈,又有变化了!
出现了"Congratulation 52pojie.cn !"和“Try Again!”这两个字符串!试着将字符串“Congratulation 52pojie.cn !”复制入Serial文本框中,点击“Try”,程序界面如下,没有什么变化了。
那么再返回CrackMe 1.0中点击OK按钮看看:
在文本框中输入“1111111111”,点“Try”按钮,程序中断,堆栈中的数字变了!
昨天是“7714890”,今天是“7714934”!将这个数值复制入文本框,点“Try”,程序成功!
点击“OK”,程序又返回右上图界面:
点击“Try”,程序中断,F9运行,程序界面失败了!
而此时堆栈中出现了UNICODE "Congratulation !"的字符串!将这串字符复制入Serial文本框中,再点“Try”,又成功了!
再点“OK”,程序返回右下图界面,再点“Try”,程序再次变成左侧成功界面。说明本程序中需要输入两次序列号,一次是计算出来的注册码,一次是成功后界面上的“Congratulation !”
昨天是一个注册码,今天是另一个,中间的数字在后三位不一样了,追码时要看看是怎么回事。
序列号在堆栈中很简单地以明码形式出来了,那么就要爆破及追码了!
在堆栈中第一行看到返回到XXXXX,还是在msvbvm50.dll中间。点右键到反汇编窗口跟随,再上下查找,没找到有用的返回用户代码的地方!选“返回到用户代码”反复执行,还是在msvbvm50.dll中打转。
还是换SmartCheck,一个调试VB的工具:
点击打开SmartCheck,出现如下界面:
点击“继续打开程序”,点“程序”菜单选“运行”命令或者按F5快捷键,CM程序启动,同时SmartCheck中出现被调试的CM程序的每一步动作:
输入序列号,点击“Try”按钮,程序动作到89了!
根据相关的VB编程知识,程序运行顺序是窗体创建(14号)—窗体引导(35号),然后是鼠标在窗体上经过(44号、48号),点击下拉框选CrackMe1.0(52号),又是鼠标在窗体上经过(76号、80号),点击“Try”按钮(84号),鼠标移动(89号)!依次点开各序号查看内容:
在52号下拉框中已经根据时间生成了序列号“7714934”!其中调用了几个非常熟悉的函数year、month 、day、now(年月日现在),但是具体计算过程看不出来。
再向下查看到84号,可以猜测是将text3.text与label3.caption比较,正确,则label3.caption输出“Congratulation !”;错误,则输出“Try Again!”。
那么将序列号复制入Serial文本框中,点“Try”,程序出现成功界面了,继续查看177号按钮事件,猜测是先得到序列号文本与标签的标题内容进行比较,正确了,则Frame3面板显示,一堆按钮或隐或显,标签3显示“Congratulation !”。
继续看CrackMe2.0:点下拉框选CrackMe2.0,输入用户名“52pojie.cn”,序列号“1111111111”,点“Try”,再查看SmartCheck中的事件记录:
从392至471号处,可以看出,是取用户名的每一位进行运算,得出“106993”和“697776”两个字符串,结合OD可知用“-”连接起来就是CrackMe2.0的第一次序列号;输入序列号后,继续运行,从SmartCheck的事件记录中看出第二次序列号是“Congratulation 52pojie.cn !”,也就是在CrackMe1.0的第二个序列号中间加了个用户名。
从SmartCheck这款软件中可以看出很多信息,但是想爆破和追码还是远远不够的。那么继续换工具,VB Decompiler来了!
根据SmartCheck中的记录,先查看Combo1_Click_405550区段的代码,与OD对照,发现竟然对不上!!!在代码中看到这两句:
loc_4053A8: var_88 = CLng((((Day(Now) * Day(23)) + (Month(Now) * Month(2))) + (Year(Now) * Year(3))))
loc_4053DB: var_1D0 = CStr((((var_88 + var_88) + CLng((Day(14) * Year(2020)))) + CLng((Day(14) * Year(2020)))))
验证了一下,这就是利用当前时间来得到CrackMe1.0第一个序列号的算法:
再看Command4_Click_4052AC中的代码:
Private Sub Command4_Click() '4052AC
'Data Table: 403D90
Dim var_88 As Variant
loc_4051AD: var_8C = Me.Text3.Text
loc_4051D3: var_88 = "" 'Ignore this
loc_4051DA: If (var_8C = Me.Label3.Caption) Then
loc_4051E9: Me.Command2.Visible = False
loc_4051EE: var_88 = vbNull 'Ignore this
loc_4051FD: Me.Frame3.Visible = False
loc_405202: var_88 = vbNull 'Ignore this
loc_405211: Me.Command1.Visible = False
loc_405216: var_88 = vbNull 'Ignore this
loc_405225: Me.Command5.Visible = False
loc_40522A: var_88 = vbNull 'Ignore this
loc_405239: Me.Command3.Visible = True
loc_40523E: var_88 = vbNull 'Ignore this
loc_40524D: Me.Text2.Visible = False
loc_405252: var_88 = vbNull 'Ignore this
loc_405261: Me.Frame3.Visible = True
loc_405266: var_88 = vbNull 'Ignore this
loc_405275: Me.Command4.Visible = False
loc_40527A: var_88 = vbNull 'Ignore this
loc_40528A: Me.Label3.Caption = "Congratulation !"
loc_40528F: var_88 = vbNull 'Ignore this
loc_405295: Else
loc_4052A2: Me.Text3.Text = "Try Again!"
loc_4052A7: var_88 = vbNull 'Ignore this
loc_4052AA: End If
loc_4052AA: Exit Sub
loc_4052AB: IDE.GoTo loc_4052C3 'Ignore this
End Sub
从代码中可以很轻松地看出程序第二个注册码应该是这一句中显示的:
loc_40528A: Me.Label3.Caption = "Congratulation !"
CrackMe1.0的注册机用VB编写应该如下:
Serialcode = CLng((((Day(Now) * Day(23)) + (Month(Now) * Month(2))) + (Year(Now) * Year(3))))
Serial1 = CStr((((Serialcode + Serialcode) + CLng((Day(14) * Year(2020)))) + CLng((Day(14) * Year(2020)))))
Serial2="Congratulation !"
Text1.text=Serial1
Text2.text=Serial2
再看CrackMe2.0的“OK”按钮事件Command2_Click_4058EC():
Private Sub Command2_Click() '4058EC
'Data Table: 403D90
Dim var_88 As Variant
Dim var_118 As Variant
Dim var_8C As String
Dim var_138 As Integer
Dim var_13C As String
Dim var_90 As Long
Dim var_1BC As String
Dim var_1CC As Variant
Dim var_1E0 As String
loc_4055D9: var_8C = Me.Text1.Text
loc_4055EB: var_88 = vbNull 'Ignore this
loc_4055EE: If (Len(var_8C) < 5) Then
loc_4055FE: Me.Text2.Text = "At least 5 characters!"
loc_405603: var_88 = vbNull 'Ignore this
loc_405606: Exit Sub
loc_405607: End If
loc_40560A: var_94 = "0110617121214051216101106141404110614140411091211100810101608040610121608100416"
loc_405622: var_98 = Me.Text1.Text
loc_405625: var_88 = vbNull 'Ignore this
loc_40562D: var_A8 = 1 'Variant
loc_405641: For var_108 = 4 To CVar(Len(var_98)): var_C8 = var_108 'Variant
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)))))
loc_40569B: var_8C = "" 'Ignore this
loc_4056A2: var_118 = "" 'Ignore this
loc_4056C1: HardType 'Ignore this
loc_4056C4: If ((var_A8 + 1) >= 39) Then
loc_4056CC: var_A8 = 0 'Variant
loc_4056D0: End If
loc_4056D3: Next var_108 'Variant
loc_4056DE: var_A8 = 1 'Variant
loc_4056F2: For var_168 = 4 To CVar(Len(var_98)): var_C8 = var_168 'Variant
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
loc_40576C: var_178 = (var_178 + var_1CC) 'Variant
loc_405770: var_8C = "": var_13C = "" 'Ignore this
loc_405779: var_118 = "": var_138 = "" 'Ignore this
loc_40579A: HardType 'Ignore this
loc_40579D: If ((var_A8 + 1) >= 39) Then
loc_4057A5: var_A8 = 0 'Variant
loc_4057A9: End If
loc_4057AC: Next var_168 'Variant
loc_4057E8: var_8C = "": var_13C = "": var_1BC = "": var_1E0 = "" 'Ignore this
loc_405802: var_8C = Me.Text2.Text
loc_405812: var_88 = vbNull 'Ignore this
loc_405815: If (var_8C = LTrim$(Str$(var_90)) & "-" & LTrim$(Str$(var_178))) Then
loc_405824: Me.Command2.Visible = False
loc_405829: var_88 = vbNull 'Ignore this
loc_405838: Me.Command1.Visible = False
loc_40583D: var_88 = vbNull 'Ignore this
loc_40584C: Me.Command5.Visible = True
loc_405851: var_88 = vbNull 'Ignore this
loc_405860: Me.Command3.Visible = False
loc_405865: var_88 = vbNull 'Ignore this
loc_405874: Me.Text2.Visible = False
loc_405879: var_88 = vbNull 'Ignore this
loc_405888: Me.Frame3.Visible = True
loc_40588D: var_88 = vbNull 'Ignore this
loc_4058BD: Me.Label3.Caption = "Congratulation " & Me.Text1.Text & " !"
loc_4058C2: var_8C = "": var_13C = "" 'Ignore this
loc_4058CB: var_88 = "" 'Ignore this
loc_4058D5: Else
loc_4058E2: Me.Text2.Text = "Try Again!"
loc_4058E7: var_88 = vbNull 'Ignore this
loc_4058EA: End If
loc_4058EA: Exit Sub
loc_4058EB: IDE.GoTo loc_405903 'Ignore this
End Sub
和CrackMe1.0差不多找到了注册码算法,其中下面这六句代码中直接将loc_4056C4和loc_40579D地址中的“If ((var_A8 + 1) >= 39) Then”改成两句
var_A8 = var_A8 + 1;
if var_A8>=39 then
才能在VB中正常运行。
loc_4056C4: If ((var_A8 + 1) >= 39) Then
loc_4056CC: var_A8 = 0 'Variant
loc_4056D0: End If
loc_40579D: If ((var_A8 + 1) >= 39) Then
loc_4057A5: var_A8 = 0 'Variant
loc_4057A9: End If
VB中CrackMe2.0的注册码算法是:
Private Sub Command3_Click()
username = Text3.Text
If Len(username) < 5 Then
'Text1.Visible = True
Text3.Text = "请至少输入5个字符!!!"
Exit Sub
End If
'If username = "" Then username = "52pojie.cn"
Key = "0110617121214051216101106141404110614140411091211100810101608040610121608100416"
Z = 1
For i = 4 To CVar(Len(username))
fcode = CLng((CDbl(fcode) + (CDbl(Asc(Mid$(username, CLng(i), 1))) * Val(Mid(Key, CLng((Z * 3)), 3)))))
'Print fcode
Z = Z + 1
If Z >= 39 Then Z = 0
Next
X = 1
For j = 4 To CVar(Len(username))
result = CVar((CDbl((Asc(Mid(username, CLng(j), 1)) * Asc(Mid$(username, CLng((j - 1)), 1)))) * Val(Mid$(Key, CLng((X * 2)), 2)))) 'Double
scode = scode + result 'Variant
X = X + 1
If X >= 39 Then Z = 0
Next
'Print scode
Text1.Text = LTrim$(Str$(fcode)) & "-" & LTrim$(Str$(scode))
Text2.Text = "Congratulation " & Text3.Text & " !"
End Sub
本想先爆破的,可是却找到了注册码的明码和算法,怎么也没找到爆破点在哪里!P-code代码真的是搞不懂!到处搜索,在本论坛找到一篇,内容非常好,虽然我照着大神的方法去做,可是还是对WKTVBDebugger这个软件不熟悉啊!在虚拟机的XP系统中安装了,打开badboy.exe,错误频出,提示要运行在NT/2000系统下!好吧,又搜索win2000的虚拟机镜像,很不好找,下不来!最后下了一个2000的安装程序光盘iso镜像,新建了一个虚拟机的2000系统,WKTVBDebugger才正常打开!
具体爆破内容推荐《160个CrackMe之013 badboy》,网址是:http://www.52pojie.cn/thread-452085-1-1.html。
附件,含CM原程序、爆破后的程序及013注册机。
百度链接是:http://pan.baidu.com/s/1skMkJY9密码: 86pm,160个CM、我已练习过的前13个crackme程序(不含012)都在里面。
好帖咋没人回呢。 看不懂,白学了这么多天 好帖!怪不得我WKTVBDebugger用不了!
页:
[1]