吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 12492|回复: 20
收起左侧

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

  [复制链接]
pk8900 发表于 2017-6-26 01:20
本帖最后由 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!)


Image 2.png

【No.2】算法分析写注册机 VB.Decompiler反编打开:先查看窗体、事件等信息,粗略的看一遍,这样你会对程序的全局有一个了解,我个人认为破解程序中,对于程序全局的掌控和熟悉是第一要素,其次是定位关键代码段并定位关键代码位置。我记得我开始接触逆向的时候就是发现一个认为有用的线索就跟,结果跟了16875,一无所获,时间也就是浪费在这里了。说远了,还是看我们的程序吧:


Image 1.png

Image 3.png

通过对Combo1_Click() 事件的分析,看出【注册方式1】事件按键为:Command4,接下来分析Command4事件:


Image 5.png

注册方式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



Image 7.png


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


Image 9.png

Image 10.png

至此CrackMe分析完成,因为程序用有两个TRY按键,位置一样,点击其它按钮时,会切换显示状态,有时会弄混,可以用VB EXPLORER 修改,方便观察。
Image 13.png Image 14.png Image 15.png Image 16.png
附: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,把一个“立即数”压入堆栈

免费评分

参与人数 10威望 +1 吾爱币 +17 热心值 +9 收起 理由
wei5383079 + 1 + 1 我很赞同!
好啦好啦 + 1 + 1 先收藏了,以后慢慢学习
海天一色001 + 1 + 1 感谢大神对我帖子的评分和指导!确实学到了知识,今天特来评分!
Three_fish + 1 + 1 热心回复!
w20064360 + 1 热心回复!
肥牛 + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Sound + 1 + 8 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
wangteng_13 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
兰陵笑笑生 + 1 + 1 虽然看不懂,但是看楼主这么用心,支持一下
朱朱你堕落了 + 1 + 1 楼主很有耐心,膜拜了。

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 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
写个帖子好难啊,过半夜了,该去睡觉了。

点评

主要是贴图上传定位,各种重复,下次CSDN上用windows live writer发布就一次到位啦~~  发表于 2017-6-26 18:44
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
进来学习了,向高手致敬!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-22 16:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表