VB初级逆向与利用

来源:互联网 发布:快快红包平台源码系统 编辑:程序博客网 时间:2024/05/17 05:58

今天做一个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...;)

原创粉丝点击