首页
社区
课程
招聘
VB初级逆向与利用
发表于: 2004-8-17 00:50 8775

VB初级逆向与利用

nbw 活跃值
24
2004-8-17 00:50
8775

VB初级逆向与利用

作者: nbw[NE365][FCG][BCG][DFCG]
HP  : www.vxer.com
    感谢一位不愿透漏姓名的朋友

    今天做一个VB程序的自显注册码。我也不知道该怎么叫,就是找到出现注册码的地方,然后用对话框弹出来。说白了就是用MessageBox把一个字符串给弹出来(没追求阿。。。)
    为了有点追求,今天不导入user32里面的API,而是把VB里面自带的Msgbox函数给挖出来调用,就是引用MSVBVM60.rtcMsgBox函数。我手头没有OP资料,自己分析一下这个函数的调用吧。
    自己用VB写了一个东东,弹出对话框“Made by nbw”,逆向看了看,大体如下:

* Possible StringData Ref from Code Obj ->"Made by nbw"
                                  |
:00401A25 C745A4CC144000          mov [ebp-5C], 004014CC        ;指向字符串
:00401A2C C7459C08000000          mov [ebp-64], 00000008

* Reference To: MSVBVM60.__vbaVarDup, Ord:0000h
                                  |
:00401A33 FF1568104000            Call dword ptr [00401068]        ;一个函数,风晓得干么用
:00401A39 8D45AC                  lea eax, dword ptr [ebp-54]
:00401A3C 8D4DBC                  lea ecx, dword ptr [ebp-44]
:00401A3F 50                      push eax
:00401A40 8D55CC                  lea edx, dword ptr [ebp-34]
:00401A43 51                      push ecx
:00401A44 52                      push edx
:00401A45 8D45DC                  lea eax, dword ptr [ebp-24]
:00401A48 56                      push esi
:00401A49 50                      push eax

* Reference To: MSVBVM60.rtcMsgBox, Ord:0253h
                                  |
:00401A4A FF1518104000            Call dword ptr [00401018]        ;关键函数
:00401A50 8D4DAC                  lea ecx, dword ptr [ebp-54]

现在关键是找到MSVBVM60.rtcMsgBox函数的参数数量和类型。这也是很多朋友经常问的问题。
    参数数量其实很好找。一般来说,参数数量的查找根据堆栈平衡性原则。查看堆栈的变化,就可以查出来用到的参数数量。
    用TRW下断点中断到:00401A4A(rtcMsgBox)处。看看这时候堆栈里面的数据,我这里如下:
        Esp        :        63F938
        Esp+4        :        000000
        Esp+8        :        63F948
        Esp+C        :        63F958
        Esp+10        :        63F968
        Esp+14        :        378F24
    然后F10运行过去这个Call,会发现堆栈停在了Esp+14  : 378F24这个地方,说明上面的5个数据为函数的参数。当然,有时候不是这种情况,但是我们要坚信*的主流思想还是好滴。。。
    其中那个Esp+4应该是风格之类的,君不见对话框里面的风格都用什么0,1之流来表示么?把这个000000改为000001,对话框果真就变了个样子。其他几个63**应该是地址,因为对话框参数一般都是地址,用于指引caption 和 content。
    那么找到这几个地方看看,如下:
63F938:                0A 00 00 00 58 F9 63 00 - 04 00 02 80 2C 06 00 00
63F948:                0A 00 00 00 01 00 00 00 - 04 00 02 80 80 0F 51 00
63F958:                0A 00 00 00 00 00 00 00 - 04 00 02 80 E4 FA 63 00
63F968:                08 00 00 00 20 16 07 01 - C0 0F 51 00 01 10 00 00
    4个变量明显是4个结构体,目前还不清楚代表什么意思。追进rtcMsgBox,会发现这个函数的核心其实调用了User32里面的 MessageBoxIndirect 函数。而上面变量中63F970处为对话框中显示的字符串地址,就是“C0 0F 51 00”(读地址的时候为:00510FC0)。
    结构体里面数据是什么意思呢?或许里面有些数据对我们无所谓吧。抱着这样的心理,我一个一个在内存中把这些数据改为00,最后得到下面这个情况:

63F938:                0A 00 00 00 58 F9 63 00 - 04 00 02 80 00 00 00 00
63F948:                0A 00 00 00 00 00 00 00 - 04 00 02 80 00 00 00 00
63F958:                0A 00 00 00 00 00 00 00 - 04 00 02 80 00 00 00 00
63F968:                08 00 00 00 00 00 00 00 - C0 0F 51 00 00 00 00 00

    就是说上面那一堆数据可以用下面这些数据来代替。关键的地方也就是:63F970 处,用于指出字符串地址。这样一来我们在内存中手工开辟这么一段数据就可以了。
    由此看来VB里面还是有些垃圾滴。。

    然后就来分析软件了。软件是“大道至简外汇分析系统”,有次数限制。输入注册码以后下次开启的时候验证。破解过程大家都会,我也不多说了,就是在:004374A5 下断点,EDX里面是注册码的地址,这个地址是随机的,每次都不一样。D  edx 就可以找到真正的注册码,当然是Unicode格式,这也是不用Messageboxa的好处,要不然显示出来的数据不好看。如此一来,在:004374A5 使用SMC,跳到我们自己的代码,利用rtcMsgBox把字符串显示出来就可以了。

    然后找剩余空间。把软件脱壳,没找到好用的剩余空间,最后自己添了一块也不好用,好在最后用我的土方法搞定,累了一身汗。。。

    具体空间地址和地址转换我也不说了,毕竟本文的重点不是这个。把数据说说吧。

原来为:
:004374A2 8B4634                  mov eax, dword ptr [esi+34]
:004374A5 52                      push edx
:004374A6 F7DB                    neg ebx
:004374A8 1BDB                    sbb ebx, ebx
:004374AA 50                      push eax
:004374AB F7DB                    neg ebx
:004374AD FFD7                    call edi

改为:
:004374A2 8B4634                  mov eax, dword ptr [esi+34]
                                  jmp  47F076
:004374AA 50                      push eax
:004374AB F7DB                    neg ebx
:004374AD FFD7                    call edi

覆盖掉:
:004374A5 52                      push edx
:004374A6 F7DB                    neg ebx
:004374A8 1BDB                    sbb ebx, ebx
记下来,以后补上。

参数设置:
: MSVBVM60.rtcMsgBox
:47F038  ------ 存放注册码地址
47F000:                0A 00 00 00 58 F9 63 00 - 04 00 02 80 00 00 00 00
47F010:                0A 00 00 00 00 00 00 00 - 04 00 02 80 00 00 00 00
47F020:                0A 00 00 00 00 00 00 00 - 04 00 02 80 00 00 00 00
47F030:                08 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00

:47F077                pushad                                ;这里需要保存环境,下面的函数会改变当前环境
                mov        dword [47F038], edx        ;注册码地址
                push        47F000                        ;参数入栈
                push        47F010
                push        47F020
                push        000
                push        47F030
                Call dword ptr [00401070]        ;rtcMsgBox
                popad
                push        edx                        ;恢复覆盖的数据
                neg        ebx
                sbb        ebx,ebx
                jmp        354AA                        ;注意这里的地址

    然后运行程序,自动把注册码显示出来了,输入注册码看看,--------不好用。我也不管了,反正。。。。。。。。阿?
    不过说正经的,哪位有Opcode资料还请给小弟E一份,3KS...;)


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (11)
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
2
支持
P-Code资料001论坛应该有,你找找
2004-8-17 01:47
0
雪    币: 97697
活跃值: (200829)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
3
2004-8-17 02:03
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
4
多谢2位

深更半夜都不睡觉么?  :o
2004-8-17 02:23
0
雪    币: 241
活跃值: (145)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
不错。学习中...
2004-8-17 11:09
0
雪    币: 216
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习中。。。。。。。。。。。。:D
2004-8-17 14:40
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
7
牛头厉害...
2004-8-17 14:59
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
8
不错。学习中...
2004-8-17 15:05
0
雪    币: 3686
活跃值: (1036)
能力值: (RANK:760 )
在线值:
发帖
回帖
粉丝
9
弓虽
2004-8-17 19:49
0
雪    币: 201
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
学习中。厉害!!
2004-10-10 20:38
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
11
历害!:D
2004-10-10 20:51
0
雪    币: 241
活跃值: (145)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
codebreaker上有类似的文章,但不是VB的。学习中。。。。
但是如果是F1(用户名)=F2(注册码)是不是不好办??
2004-10-10 22:10
0
游客
登录 | 注册 方可回帖
返回
//