飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 11316|回复: 16

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

[复制链接]

该用户从未签到

发表于 2006-7-10 14:31:24 | 显示全部楼层 |阅读模式
【破文标题】VB的小CRACKME的分析破文
【破文作者】caterpilla(惊涛)
【作者邮箱】
【作者主页】
破解工具】搜索引擎,VBEXPLORER,WKTVBDE,OD,计算器
【破解平台】XP SP2
【软件名称】一个VB 的小CrackMe (简单)
【软件大小】
【原版下载】https://www.chinapyg.com/viewthr ... &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后,找到命令按钮对应的事件处理程序。

程序加简单注解如下:

:00402E3C  FEC16CFF182E3505                LitVarI4                   ;取一四位整型立即数
:00402E44  080800                          FLdPr                      ;[SR]=[STACK_0008]
:00402E47  FD865400                        MemStVar                   ;存入变量
:00402E4B  FEC16CFF21529315                LitVarI4                   ;再取一个四位整型立即数
:00402E53  080800                          FLdPr                      ;[SR]=[STACK_0008]
:00402E56  065400                          MemLdRfVar                 ;Push [SR]+STACK_0054
:00402E59  FB9C5CFF                        SubVar                     ;取到的两个数相减
:00402E5D  080800                          FLdPr                      ;[SR]=[STACK_0008]
:00402E60  FD864400                        MemStVar                   ;结果存入变量
:00402E64  0454FF                          FLdRfVar                   ;Push LOCAL_00AC
:00402E67  21                              FLdPrThis                  ;[SR]=[stack2]
:00402E68  0FFC02                          VCallAd                    ;Return the control index 01
:00402E6B  1958FF                          FStAdFunc                  ;
:00402E6E  0858FF                          FLdPr                      ;[SR]=[LOCAL_00A8]
***********Reference To:[propget]TextBox.Text
                              |
:00402E71  0DA0000000                      VCallHresult               ;Call ptr_00402844读出文本框中的值
:00402E76  6C54FF                          ILdRf                      ;Push DWORD [LOCAL_00AC]值存于此处
**********Reference To->msvbvm60.rtcR8ValFromBstr
                               |
:00402E79  0A01000400                      ImpAdCallFPR4              ;Call ptr_00401030; check stack 0004; Push EAX
:00402E7E  FD6B6CFF                        CVarR8                     ;字符串转化成一个实数
:00402E82  080800                          FLdPr                      ;[SR]=[STACK_0008]
:00402E85  FD863400                        MemStVar                   ;
:00402E89  2F54FF                          FFree1Str                  ;SysFreeString [LOCAL_00AC]; [LOCAL_00AC]=0
:00402E8C  1A58FF                          FFree1Ad                   ;Push [LOCAL_00A8]; Call [[[LOCAL_00A8]]+8]; [[LOCAL_00A8]]=0
:00402E8F  FEC144FFDBA80101                LitVarI4                   ;取立即数
:00402E97  080800                          FLdPr                      ;[SR]=[STACK_0008]
:00402E9A  063400                          MemLdRfVar                 ;Push [SR]+STACK_0034读内存数出来
:00402E9D  286CFF0B00                      LitVarI2                   ;PushVarInteger 000B取立即数,其值为0XB即11(十进制)
:00402EA2  FBB45CFF                        MulVar                     ;相乘
:00402EA6  FB9434FF                        AddVar                     ;相加
:00402EAA  2824FF5701                      LitVarI2                   ;PushVarInteger 0157取立即数,值勤为0X157
:00402EAF  FB9414FF                        AddVar                     ;相加
:00402EB3  080800                          FLdPr                      ;[SR]=[STACK_0008]
:00402EB6  065400                          MemLdRfVar                 ;Push [SR]+STACK_0054读出内存中的值
:00402EB9  FB9C04FF                        SubVar                     ;相减
:00402EBD  080800                          FLdPr                      ;[SR]=[STACK_0008]
:00402EC0  FD863400                        MemStVar                   ;保存结果
:00402EC4  36040034FF14FF                  FFreeVar                   ;Free 0004/2 variants
:00402ECB  0454FF                          FLdRfVar                   ;Push LOCAL_00AC
:00402ECE  21                              FLdPrThis                  ;[SR]=[stack2]
:00402ECF  0FFC02                          VCallAd                    ;Return the control index 01
:00402ED2  1958FF                          FStAdFunc                  ;
:00402ED5  0858FF                          FLdPr                      ;[SR]=[LOCAL_00A8]
***********Reference To:[propget]TextBox.Text
                              |
:00402ED8  0DA0000000                      VCallHresult               ;Call ptr_00402844再取文本框中文本
:00402EDD  6C54FF                          ILdRf                      ;Push DWORD [LOCAL_00AC]
******Possible String Ref To->""
                               |
:00402EE0  1B0200                          LitStr                     ;Push ptr_00402858一个空串
:00402EE3  FB30                            EqStr                      ;判断文本是否为空
:00402EE5  2F54FF                          FFree1Str                  ;SysFreeString [LOCAL_00AC]; [LOCAL_00AC]=0
:00402EE8  1A58FF                          FFree1Ad                   ;Push [LOCAL_00A8]; Call [[[LOCAL_00A8]]+8]; [[LOCAL_00A8]]=0
:00402EEB  1CDB00                          BranchF                    ;If Pop=0 then ESI=00402F17为假的分支,相当于IF。。ELSE中的ELSE部分
:00402EEE  2704FF                          LitVar                     ;PushVar LOCAL_00FC
:00402EF1  2714FF                          LitVar                     ;PushVar LOCAL_00EC
:00402EF4  2734FF                          LitVar                     ;PushVar LOCAL_00CC
:00402EF7  F500000000                      LitI4                      ;Push 00000000
******Possible String Ref To->"???????誹纇?????"
                               |
:00402EFC  3A6CFF0300                      LitVarStr                  ;PushVarString ptr_00402860
:00402F01  4E5CFF                          FStVarCopyObj              ;[LOCAL_00A4]=vbaVarDup(Pop)
:00402F04  045CFF                          FLdRfVar                   ;Push LOCAL_00A4
**********Reference To->msvbvm60.rtcMsgBox
                               |
:00402F07  0A04001400                      ImpAdCallFPR4              ;Call ptr_00401036; check stack 0014; Push EAX
:00402F0C  3608005CFF34FF14                FFreeVar                   ;Free 0008/2 variants
:00402F17  080800                          FLdPr                      ;[SR]=[STACK_0008]
:00402F1A  063400                          MemLdRfVar                 ;Push [SR]+STACK_0034//取刚才计算出的结果
:00402F1D  080800                          FLdPr                      ;[SR]=[STACK_0008]
:00402F20  064400                          MemLdRfVar                 ;Push [SR]+STACK_0044//取程序开始计算出的结果
:00402F23  FB33                            EqVarBool                  ;比较是否相等
:00402F25  1C1801                          BranchF                    ;If Pop=0 then ESI=00402F54//如果是爆破的话,在这把1C改成1D就可以了
:00402F28  2704FF                          LitVar                     ;PushVar LOCAL_00FC
:00402F2B  2714FF                          LitVar                     ;PushVar LOCAL_00EC
:00402F2E  2734FF                          LitVar                     ;PushVar LOCAL_00CC
:00402F31  F500000000                      LitI4                      ;Push 00000000
******Possible String Ref To->"??????蟟菼?"
                               |
:00402F36  3A6CFF0500                      LitVarStr                  ;PushVarString ptr_00402884成功
:00402F3B  4E5CFF                          FStVarCopyObj              ;[LOCAL_00A4]=vbaVarDup(Pop)
:00402F3E  045CFF                          FLdRfVar                   ;Push LOCAL_00A4
**********Reference To->msvbvm60.rtcMsgBox
                               |
:00402F41  0A04001400                      ImpAdCallFPR4              ;Call ptr_00401036; check stack 0014; Push EAX
:00402F46  3608005CFF34FF14                FFreeVar                   ;Free 0008/2 variants
:00402F51  1E4101                          Branch                     ;ESI=00402F7D
:00402F54  2704FF                          LitVar                     ;PushVar LOCAL_00FC
:00402F57  2714FF                          LitVar                     ;PushVar LOCAL_00EC
:00402F5A  2734FF                          LitVar                     ;PushVar LOCAL_00CC
:00402F5D  F500000000                      LitI4                      ;Push 00000000
******Possible String Ref To->"?睩翫??????"
                               |
:00402F62  3A6CFF0600                      LitVarStr                  ;PushVarString ptr_0040289C失败
:00402F67  4E5CFF                          FStVarCopyObj              ;[LOCAL_00A4]=vbaVarDup(Pop)
:00402F6A  045CFF                          FLdRfVar                   ;Push LOCAL_00A4
**********Reference To->msvbvm60.rtcMsgBox
                               |
:00402F6D  0A04001400                      ImpAdCallFPR4              ;Call ptr_00401036; check stack 0014; Push EAX
:00402F72  3608005CFF34FF14                FFreeVar                   ;Free 0008/2 variants
:00402F7D  13                              ExitProcHresult            ;
:00402F7E  0000                            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 编辑 ]
PYG19周年生日快乐!

该用户从未签到

发表于 2006-7-10 14:36:54 | 显示全部楼层
详细 ,强,学习啊。。。。。。。。。。。。。。。。。。。。。。。
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-2-2 20:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2006-7-10 14:38:14 | 显示全部楼层
    哈哈   最怕VB   所以我是一定要收下来哈
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-5-6 16:27
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2006-7-10 14:38:35 | 显示全部楼层
    惊涛 兄,能否做个语音动画来学习?
    PYG19周年生日快乐!
  • TA的每日心情
    难过
    前天 14:49
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2006-7-10 14:50:51 | 显示全部楼层
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 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兄~~~~~~~~~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-7-10 15:21:04 | 显示全部楼层
    P-CODE 一定要往死里顶,呵呵
    支持惊涛兄~~!!~~
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2006-7-10 18:41:38 | 显示全部楼层
    原帖由 野猫III 于 2006-7-10 14:38 发表
    惊涛 兄,能否做个语音动画来学习?

    已做,请兄弟们一观,呵呵~~~~~~~~~
    破解录像,WKTVBDE
    https://www.chinapyg.com/viewthr ... a=page%3D1#pid36193
    也可到我PYG目录下下载。

    [ 本帖最后由 caterpilla 于 2006-7-10 18:47 编辑 ]
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-7-10 21:45:22 | 显示全部楼层
    顶起
    PYG越来越有教学气氛了,飘云领导有方,众版主尽职
          [PYG]后缀符号会越叫越响的!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-7-10 23:22:25 | 显示全部楼层
    这样详细的资料太珍贵了,收藏先 。。。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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