好友
阅读权限30
听众
最后登录1970-1-1
|
本帖最后由 pk8900 于 2017-6-26 01:47 编辑
今天晚上练习【160个Crackme之 013- badboy】,VB程序,无壳,这个程序是P-CODE编码,有不少朋友遇见P-CODE的程序,用OD调试就会找不着门道,对于P-CODE的文章网上也很多,还有许多关于P-CODE指令的文章,可以参考。
废话不多说,附上CrackMe 下载地址:http://pan.baidu.com/share/link?shareid=541269&uk=4146939145
对于P-Code编码的VB程序,静态反编译分析是一个不错的方法,而我选择的工具是:【VB.Decompiler.Pro.v10.1】,吾爱工具包集成。
【N0.1】程序截图:(两种模式,一种是序列号,一种是名字+序列号,失败字样:Try Again!)
【No.2】算法分析写注册机 VB.Decompiler反编打开:先查看窗体、事件等信息,粗略的看一遍,这样你会对程序的全局有一个了解,我个人认为破解程序中,对于程序全局的掌控和熟悉是第一要素,其次是定位关键代码段并定位关键代码位置。我记得我开始接触逆向的时候就是发现一个认为有用的线索就跟,结果跟了16875,一无所获,时间也就是浪费在这里了。说远了,还是看我们的程序吧:
通过对Combo1_Click() 事件的分析,看出【注册方式1】事件按键为:Command4,接下来分析Command4事件:
注册方式1的序列号我们已经知道是怎么来的了,下面就做个注册机算一下:
VB建个工程,加一个按钮和文本框:(VB.Decompiler反汇编的代码可以直接拿来用)
按钮事件代码如下:
[Visual Basic] 纯文本查看 复制代码 Private Sub Command1_Click()[/size][/font]
[font=Tahoma][size=3]var_88 = CLng((((Day(Now) * Day(23)) + (Month(Now) * Month(2))) + (Year(Now) * Year(3))))[/size][/font]
[font=Tahoma][size=3]var_1D0 = CStr((((var_88 + var_88) + CLng((Day(14) * Year(2020)))) + CLng((Day(14) * Year(2020)))))[/size][/font]
[font=Tahoma][size=3]Text1.Text = var_1D0[/size][/font]
[font=Tahoma][size=3]MsgBox "注册方式1-OK"[/size][/font]
[font=Tahoma][size=3]End Sub
算法相信大家一看就懂了,【VB函数的返回值参照我注册监视窗口的数据】,运行注册机,得到注册“7715242”,注册方式1到这里已经完成,随便说一下,我后来看了论坛里的帖子,大家在输入了正确的序列号后,点TRY,显示"Congratulation !"和“OK”按钮,点OK按钮后,回到序列号页,又输入刚才的序列号,点TRY会显示"Try Again!",因为在我们注册成功的时候,Label3.caption被赋值:“Congratulation !”,这里我们只有输入Congratulation !才能再次成功,不会跳出来一个Try Again!,弄得你不知所措。
接下来是注册方式2:
【注册方式2】事件按键为:Command2,接下来分析Command2事件:看图:
跟据以上分析,可以用VB生成一个注册机,算出用户名与序列号:
VB中加入相关控件:
事件代码如下:[Visual Basic] 纯文本查看 复制代码 Private Sub Command2_Click()loc_40560A: var_94 = "0110617121214051216101106141404110614140411091211100810101608040610121608100416"
loc_405622: var_98 = Me.Text2.Text
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)))))
oc_4056C4: If ((var_A8 + 1) >= 39) Then ' "实际这里早就应该看得出,如果var_A8不累加,这些代码就没有用了。"
loc_4056CC: var_A8 = 0 'Variant
loc_4056D0: End If
var_A8 = var_A8 + 1 ' "用OD追码后添加的累加计数器"
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_40579D: If ((var_A8 + 1) >= 39) Then
loc_4057A5: var_A8 = 0 'Variant
loc_4057A9: End If
var_A8 = var_A8 + 1 ' "用OD追码后添加的累加计数器"
loc_4057AC: Next var_168 'Variant
Me.Text3.Text = LTrim$(Str$(var_90)) & "-" & LTrim$(Str$(var_178))
End Sub
说一下这个注册机,按VB.Decompiler反汇编的代码算法分析部分,直接写注册机,算出的用户名和密码是不对的,我之前认为成功了,结果生成后输入程序测试,跳出来一个Try Again!,反复检查VB中的代码无误,没法只能用OD追一下,发现VB.Decompiler反汇编的算法少了一部分,var_A8 计数器没有累加,Mid$(var_94, CLng((var_A8 * 3)), 3始终取的第3到5位“106“,而程序第二次取的是“171“,说明计数器var_A8累加了。在注册机里加上这两句代码就能算出正确的序列号,用OD追码的方法论坛里有很多,大家可以参考。如果有对这个CrackMe不太明白追码具体方法步骤的,可以@我,我有时间整理一下。
【No.3】爆破程序 爆破就比算法部分轻松多了,看图说话。
至此CrackMe分析完成,因为程序用有两个TRY按键,位置一样,点击其它按钮时,会切换显示状态,有时会弄混,可以用VB EXPLORER 修改,方便观察。
附:VB P-CODE 常用爆破代码几枚:
跳转指令:
Branch ---- 无条件跳转 1E
BranchT ---- 栈顶数据为真则跳 1D
BranchF ---- 栈顶数据为假则跳 1C
比较指令:
EqVarBool----比较变量相等: FB 33
NeVarBool----比较变量不相等: FB 40
EqStr 比较字符串相等: FB 30
NeStr 比较字符串相等 FB 3D
Eq 判断是否相等,并把结果(0或1)入栈
Ne 判断是否相等,并把结果(0或1)入栈
Lt ---- 判断是否小于
Gt ---- 判断是否大于
常用其它指令:
Len---- 得到字串长度
St ---- Store,把当前栈顶的数据放在内存里
Ld ---- Load,把内存某处的数据压入堆栈
Lit---- Literal,把一个“立即数”压入堆栈
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|