caterpilla 发表于 2006-7-10 14:31:24

VB的小CRACKME(P-CODE)的分析破文

【破文标题】VB的小CRACKME的分析破文
【破文作者】caterpilla(惊涛)
【作者邮箱】
【作者主页】
【破解工具】搜索引擎,VBEXPLORER,WKTVBDE,OD,计算器
【破解平台】XP SP2
【软件名称】一个VB 的小CrackMe (简单)
【软件大小】
【原版下载】https://www.chinapyg.com/viewthread.php?tid=5918&extra=page%3D1
【保护方式】
【软件简介】
------------------------------------------------------------------------
VB P-CODE的CRACKME,P-CODE从来没弄过,只好现学现用。。。。。。

1、搜索引擎
充分利用百度、GOOGLE在网上寻找参考资料,其实这点对于找到解决问题的方法是很有效的途径,希望大家能够记住这一点。
把P-CODE VB当作关键词搜索,找到了很多有价值的东西,有PYG的,也有看雪学院上的文章。一一看下先~~~~~~~~

2、根据文章所述,寻找适合自己的工具
对P-CODE有静态和动态两类分析工具,静态有VB EXPLORER,VB-PARSER等,动态的有WKTVBDE。把这些工具收集下来备用,
其中WKTVBDE在安装时有点小问题,参考了PYG老大们的说明,安妥了,呵呵。

3、静态分析
喜欢用VB EXPLORER,用它打开这个CRACKME后,找到命令按钮对应的事件处理程序。

程序加简单注解如下:

:00402E3CFEC16CFF182E3505                LitVarI4                 ;取一四位整型立即数
:00402E44080800                          FLdPr                    ;=
:00402E47FD865400                      MemStVar                 ;存入变量
:00402E4BFEC16CFF21529315                LitVarI4                 ;再取一个四位整型立即数
:00402E53080800                          FLdPr                    ;=
:00402E56065400                          MemLdRfVar                 ;Push +STACK_0054
:00402E59FB9C5CFF                      SubVar                     ;取到的两个数相减
:00402E5D080800                          FLdPr                    ;=
:00402E60FD864400                      MemStVar                 ;结果存入变量
:00402E640454FF                          FLdRfVar                 ;Push LOCAL_00AC
:00402E6721                            FLdPrThis                  ;=
:00402E680FFC02                          VCallAd                    ;Return the control index 01
:00402E6B1958FF                          FStAdFunc                  ;
:00402E6E0858FF                          FLdPr                    ;=
***********Reference To:TextBox.Text
                              |
:00402E710DA0000000                      VCallHresult               ;Call ptr_00402844读出文本框中的值
:00402E766C54FF                          ILdRf                    ;Push DWORD 值存于此处
**********Reference To->msvbvm60.rtcR8ValFromBstr
                               |
:00402E790A01000400                      ImpAdCallFPR4              ;Call ptr_00401030; check stack 0004; Push EAX
:00402E7EFD6B6CFF                      CVarR8                     ;字符串转化成一个实数
:00402E82080800                          FLdPr                    ;=
:00402E85FD863400                      MemStVar                 ;
:00402E892F54FF                          FFree1Str                  ;SysFreeString ; =0
:00402E8C1A58FF                          FFree1Ad                 ;Push ; Call [[]+8]; []=0
:00402E8FFEC144FFDBA80101                LitVarI4                 ;取立即数
:00402E97080800                          FLdPr                    ;=
:00402E9A063400                          MemLdRfVar                 ;Push +STACK_0034读内存数出来
:00402E9D286CFF0B00                      LitVarI2                 ;PushVarInteger 000B取立即数,其值为0XB即11(十进制)
:00402EA2FBB45CFF                      MulVar                     ;相乘
:00402EA6FB9434FF                      AddVar                     ;相加
:00402EAA2824FF5701                      LitVarI2                 ;PushVarInteger 0157取立即数,值勤为0X157
:00402EAFFB9414FF                      AddVar                     ;相加
:00402EB3080800                          FLdPr                    ;=
:00402EB6065400                          MemLdRfVar                 ;Push +STACK_0054读出内存中的值
:00402EB9FB9C04FF                      SubVar                     ;相减
:00402EBD080800                          FLdPr                    ;=
:00402EC0FD863400                      MemStVar                 ;保存结果
:00402EC436040034FF14FF                FFreeVar                 ;Free 0004/2 variants
:00402ECB0454FF                          FLdRfVar                 ;Push LOCAL_00AC
:00402ECE21                            FLdPrThis                  ;=
:00402ECF0FFC02                          VCallAd                    ;Return the control index 01
:00402ED21958FF                          FStAdFunc                  ;
:00402ED50858FF                          FLdPr                    ;=
***********Reference To:TextBox.Text
                              |
:00402ED80DA0000000                      VCallHresult               ;Call ptr_00402844再取文本框中文本
:00402EDD6C54FF                          ILdRf                    ;Push DWORD
******Possible String Ref To->""
                               |
:00402EE01B0200                          LitStr                     ;Push ptr_00402858一个空串
:00402EE3FB30                            EqStr                    ;判断文本是否为空
:00402EE52F54FF                          FFree1Str                  ;SysFreeString ; =0
:00402EE81A58FF                          FFree1Ad                 ;Push ; Call [[]+8]; []=0
:00402EEB1CDB00                          BranchF                    ;If Pop=0 then ESI=00402F17为假的分支,相当于IF。。ELSE中的ELSE部分
:00402EEE2704FF                          LitVar                     ;PushVar LOCAL_00FC
:00402EF12714FF                          LitVar                     ;PushVar LOCAL_00EC
:00402EF42734FF                          LitVar                     ;PushVar LOCAL_00CC
:00402EF7F500000000                      LitI4                    ;Push 00000000
******Possible String Ref To->"???????誹纇?????"
                               |
:00402EFC3A6CFF0300                      LitVarStr                  ;PushVarString ptr_00402860
:00402F014E5CFF                          FStVarCopyObj              ;=vbaVarDup(Pop)
:00402F04045CFF                          FLdRfVar                 ;Push LOCAL_00A4
**********Reference To->msvbvm60.rtcMsgBox
                               |
:00402F070A04001400                      ImpAdCallFPR4              ;Call ptr_00401036; check stack 0014; Push EAX
:00402F0C3608005CFF34FF14                FFreeVar                 ;Free 0008/2 variants
:00402F17080800                          FLdPr                    ;=
:00402F1A063400                          MemLdRfVar                 ;Push +STACK_0034//取刚才计算出的结果
:00402F1D080800                          FLdPr                    ;=
:00402F20064400                          MemLdRfVar                 ;Push +STACK_0044//取程序开始计算出的结果
:00402F23FB33                            EqVarBool                  ;比较是否相等
:00402F251C1801                          BranchF                    ;If Pop=0 then ESI=00402F54//如果是爆破的话,在这把1C改成1D就可以了
:00402F282704FF                          LitVar                     ;PushVar LOCAL_00FC
:00402F2B2714FF                          LitVar                     ;PushVar LOCAL_00EC
:00402F2E2734FF                          LitVar                     ;PushVar LOCAL_00CC
:00402F31F500000000                      LitI4                    ;Push 00000000
******Possible String Ref To->"??????蟟菼?"
                               |
:00402F363A6CFF0500                      LitVarStr                  ;PushVarString ptr_00402884成功
:00402F3B4E5CFF                          FStVarCopyObj              ;=vbaVarDup(Pop)
:00402F3E045CFF                          FLdRfVar                 ;Push LOCAL_00A4
**********Reference To->msvbvm60.rtcMsgBox
                               |
:00402F410A04001400                      ImpAdCallFPR4              ;Call ptr_00401036; check stack 0014; Push EAX
:00402F463608005CFF34FF14                FFreeVar                 ;Free 0008/2 variants
:00402F511E4101                          Branch                     ;ESI=00402F7D
:00402F542704FF                          LitVar                     ;PushVar LOCAL_00FC
:00402F572714FF                          LitVar                     ;PushVar LOCAL_00EC
:00402F5A2734FF                          LitVar                     ;PushVar LOCAL_00CC
:00402F5DF500000000                      LitI4                    ;Push 00000000
******Possible String Ref To->"?睩翫??????"
                               |
:00402F623A6CFF0600                      LitVarStr                  ;PushVarString ptr_0040289C失败
:00402F674E5CFF                          FStVarCopyObj              ;=vbaVarDup(Pop)
:00402F6A045CFF                          FLdRfVar                 ;Push LOCAL_00A4
**********Reference To->msvbvm60.rtcMsgBox
                               |
:00402F6D0A04001400                      ImpAdCallFPR4              ;Call ptr_00401036; check stack 0014; Push EAX
:00402F723608005CFF34FF14                FFreeVar                 ;Free 0008/2 variants
:00402F7D13                            ExitProcHresult            ;
:00402F7E0000                            LargeBos                 ;IDE beginning of line with 00 byte codes


4、动态分析
静态分析完了,用WKTVBDE载入CRACKME,把其中的立即数找出来,看看是不是我们所想的样子。。。。。。。

用FORM MANAGER打开窗口,在COMMAND1按钮上下断点,然后GO运行,之后就就行单步执行,这里关键在于要时刻注意堆栈和内存的变化。要打开MEMORY DUMP窗口,
观察每一步执行后,内存中值的变化,同时注意右上角堆栈中地址的变化。VB中内存值比较有趣,由于是变体类型,所以不是在我们所看到内存地址处直接存放值的,而在地址+8的这个偏移处存放,有时是值,有时是指针,根据变体的实际类型来决定。

P-CODE第一次调,本想再细点写的,不过单位机器上WKTVBDE不好用了,呵呵,只能凭记忆写些了,兄弟们有兴趣,可用搜索引擎在网上找到相应的资料。

CODE:31371821,为固定码

有五个常数参与计算
#define C1 0x010AA8DB
#define C2 0x157
#define C3 0xB
#define C4 0x5352e18
#define C5 0x15935221

根据算式来计算CODE
CODE * C3+C1+C2-C4=C5-C4
即:CODE*0xb+0x0101a8db+0x157-0x5352e18=0x15935221-0x5352e18

解出来CODE=31371821


------------------------------------------------------------------------
题外话:用好搜索引擎,提高自学能力,敢于猜想,小心求证~~~~~~~~~~~~~~~~
------------------------------------------------------------------------
【版权声明】

[ 本帖最后由 caterpilla 于 2006-7-10 15:16 编辑 ]

lgjxj 发表于 2006-7-10 14:36:54

详细 ,强,学习啊。。。。。。。。。。。。。。。。。。。。。。。

eszwaq123 发表于 2006-7-10 14:38:14

哈哈   最怕VB   所以我是一定要收下来哈

野猫III 发表于 2006-7-10 14:38:35

惊涛 兄,能否做个语音动画来学习?

飘云 发表于 2006-7-10 14:50:51

建议初学者先看这几篇,再看 惊涛 的文章,会有事半功倍之效果!
https://www.chinapyg.com/viewthread.php?tid=3270
https://www.chinapyg.com/viewthread.php?tid=3277
https://www.chinapyg.com/viewthread.php?tid=3334

https://www.chinapyg.com/viewthread.php?tid=5056

caterpilla 发表于 2006-7-10 14:56:12

原帖由 飘云 于 2006-7-10 14:50 发表
建议初学者先看这几篇,再看 惊涛 的文章,会有事半功倍之效果!
https://www.chinapyg.com/viewthread.php?tid=3270
https://www.chinapyg.com/viewthread.php?tid=3277
https://www.chinapyg.com/viewthread.p ...
也是初学,继续学习,谢谢PY兄~~~~~~~~~

snetluck 发表于 2006-7-10 15:21:04

P-CODE 一定要往死里顶,呵呵
支持惊涛兄~~!!~~

caterpilla 发表于 2006-7-10 18:41:38

原帖由 野猫III 于 2006-7-10 14:38 发表
惊涛 兄,能否做个语音动画来学习?
已做,请兄弟们一观,呵呵~~~~~~~~~
破解录像,WKTVBDE
https://www.chinapyg.com/viewthread.php?tid=6007&page=1&extra=page%3D1#pid36193
也可到我PYG目录下下载。

[ 本帖最后由 caterpilla 于 2006-7-10 18:47 编辑 ]

快雪时晴 发表于 2006-7-10 21:45:22

顶起
PYG越来越有教学气氛了,飘云领导有方,众版主尽职
      后缀符号会越叫越响的!

Mysoft 发表于 2006-7-10 23:22:25

这样详细的资料太珍贵了,收藏先 。。。
页: [1] 2
查看完整版本: VB的小CRACKME(P-CODE)的分析破文