VB初级逆向与利用
发表于:
2004-8-17 00:50
8776
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...;)
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)