• 标 题:VB初级逆向与利用
  • 作 者:nbw
  • 时 间:004-08-17,00:50
  • 链 接:http://bbs.pediy.com

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 eaxdword ptr [ebp-54]
:00401A3C 8D4DBC                  lea ecxdword ptr [ebp-44]
:00401A3F 50                      push eax
:00401A40 8D55CC                  lea edxdword ptr [ebp-34]
:00401A43 51                      push ecx
:00401A44 52                      push edx
:00401A45 8D45DC                  lea eaxdword 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 ecxdword 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 eaxdword ptr [esi+34]
:004374A5 52                      push edx
:004374A6 F7DB                    neg ebx
:004374A8 1BDB                    sbb ebxebx
:004374AA 50                      push eax
:004374AB F7DB                    neg ebx
:004374AD FFD7                    call edi

改为:
:004374A2 8B4634                  mov eaxdword 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 ebxebx
记下来,以后补上。


参数设置:
: 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...