pk8900 发表于 2017-6-26 01:20

[反汇编练习]160个Crackme之 013- badboy-VB程序静态分析及注册机And爆破

本帖最后由 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反汇编的代码可以直接拿来用)
按钮事件代码如下:
Private Sub Command1_Click()
var_88 = CLng((((Day(Now) * Day(23)) + (Month(Now) * Month(2))) + (Year(Now) * Year(3))))
var_1D0 = CStr((((var_88 + var_88) + CLng((Day(14) * Year(2020)))) + CLng((Day(14) * Year(2020)))))
Text1.Text = var_1D0
MsgBox "注册方式1-OK"
End Sub





算法相信大家一看就懂了,【VB函数的返回值参照我注册监视窗口的数据】,运行注册机,得到注册“7715242”,注册方式1到这里已经完成,随便说一下,我后来看了论坛里的帖子,大家在输入了正确的序列号后,点TRY,显示"Congratulation !"和“OK”按钮,点OK按钮后,回到序列号页,又输入刚才的序列号,点TRY会显示"Try Again!",因为在我们注册成功的时候,Label3.caption被赋值:“Congratulation !”,这里我们只有输入Congratulation !才能再次成功,不会跳出来一个Try Again!,弄得你不知所措。
接下来是注册方式2:
【注册方式2】事件按键为:Command2,接下来分析Command2事件:看图:

跟据以上分析,可以用VB生成一个注册机,算出用户名与序列号:
VB中加入相关控件:
事件代码如下: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,把一个“立即数”压入堆栈

pk8900 发表于 2020-2-17 08:28

我是小明的同学 发表于 2020-2-17 00:31
请问大佬,注册方式1最后一张图那里,表达式和值我怎么看不出来是怎么对应上的啊?
比如Year(2020)怎么是1 ...

这个函数我也没深入研究,只在VB里调用,如果想知道可以查一下VB的相关函数

pk8900 发表于 2019-11-11 21:20

CHILAS_LEE 发表于 2019-11-11 17:25
利用消息断点的方法,怎么也回不去程序代码领空,哭了
VB的p-code字节码是解释器逐条加载后运行,你只能通过内存断点中断在读取字节码的部分,根本不会看到整段的代码。

pk8900 发表于 2017-6-26 01:32

写个帖子好难啊,过半夜了,该去睡觉了。

jun57663796 发表于 2017-6-26 01:44

楼主真厉害

qq710665449 发表于 2017-6-26 09:12

开开眼界啦

yu逍遥 发表于 2017-6-26 09:48

谢谢楼主分享

ihuihui 发表于 2017-6-26 18:06

海天一色001 发表于 2017-6-26 22:37

楼主写得非常清楚明了,从中学到了很多知识!因为用手机浏览的,明天给你评分表示感谢!

丶落墨 发表于 2017-6-27 01:42

感谢发布原创教程,吾爱因你更精彩!!!

qwe124040 发表于 2017-6-27 22:52

谢谢,分享

zt185 发表于 2017-6-28 08:36

进来学习了,向高手致敬!
页: [1] 2
查看完整版本: [反汇编练习]160个Crackme之 013- badboy-VB程序静态分析及注册机And爆破