30903861 发表于 2006-6-4 10:59:58

Bbgs.chinayVB程序的破解

Bbgs.chinayVB程序的破解

VB程序使很多朋友感到头痛,主要是VB程序反编译时产生大量的垃圾代码,而且也找不到有
用的信息,在动态调试过程中,垃圾代码太多,往往迷失于冗余的代码中,找不到方向。   记住VB常用的一些函数:
MultiByteToWideChar 将ANSI字符串转换成UNICODE字符
WideCHatToMultiByte  将UNICODE字符转换成ANSI字符
rtcT8ValFromBstr    把字符转换成浮点数  
vbaStrCmp        比较字符串(常用断点)
vbaStrComp       字符串比较(常用断点)
vbaStrCopy       复制字符串
StrConv        转换字符串
vbaStrMove       移动字符串
__vbaVarCat 连接字符串
rtcMidCharVar 在字符串中取字符或者字符串!
__vbaLenBstr 取字符串的长度
vbaVarTstNe      变量比较
vbaVarTstEq      变量比较
rtcMsgBox       显示对话框
VarBstrCmp       比较字符串
VarCyCmp        比较字符串
  
用OD载入脱壳后的程序,在命令行输入:bpx hmemcpy,然后回车,会弹出程序运行调用的所有的函数,在每个函数上设置好断点!说明:我破VB程序喜欢用这个断点设置方法,通过一步步跟踪,基本可以把握程序保护的思路,所以我破VB程序基本用这个断点,当然你可以用其它的断点,只要能找到关键,任何断点都是用意义的。

关于VB的程序,注册没有提示的二个办法:
第一(提示错误):用GetVBRes来替换里面的提示串,一般是以'111111','222222'之类的替换
因为:VB,用的字来存放提示还有加了点东东,我们用的工具一般是字节分析。换成'22222'之类的就是字节了,用静态分析,就有你该的串了。GetVBRes(网上很多,自己下吧)

第二(没有提示):用vbde这个工具(不知道,有没有用过DEDE,是一样思路),主要是找出破解的按钮窗口的位置,来进行跟踪。

先给出修改能正确反编译VB程序的W32DASM的地址:
======================
offsets 0x16B6C-0x16B6D

修改机器码为: 98 F4
======================

VB程序的跟踪断点:

============
MultiByteToWideChar,
rtcR8ValFromBstr,
WideCharToMultiByte,
__vbaStrCmp
__vbaStrComp
__vbaStrCopy
__vbaStrMove
__vbaVarTstNe
rtcBeep
rtcGetPresentDate (时间API)
rtcMsgBox
=========

时间限制断点:

================
CompareFileTime
GetLocalTime
GetSystemTime
GetTimeZoneInformation
msvcrt.diffTime()
msvcrt.Time()
================

VB断点查找方法

1,VB6.0编写,OD载入程序调出注册窗口,alt+e调出可执行模块窗口找到X:\WINDOWS\system32\MSVBVM60.DLL
双击,在ctrl+n调出窗口找到,名称XXXXXXE区段=ENGINE 导出__vbaVarMove双击来到下面地址(可以直接在命令行 bp __vbaVarMove)
回到程序注册窗口点注册被拦断在刚才下断的地址,断后在ctrl+F9,F8回
2,OD载入程序,命令行下断点。
bp rtcMsgBox
堆栈友好提示
确定注册失败按钮返回。接着向上找出点注册按钮执行的代码第一句,可以吗?当然行,根据我们知道程序员写一个事件执行的代码是如这种,
各种语言都差不多。
3,OD载入程序,命令行下断点。
bp rtcMsgBox
任意填入伪注册码 9999999999999999999
确定后中断
堆栈友好提示
确定注册失败按钮返回。
W32Dasm反汇编程序,Shiht+F12
4,VB中的messagebox是一个消息框,汇编中用rtcMsgBox下断点.用olldbg载入程序,Alt+e,在可执行文件模块中找到Msvbvm60.dll,双击它,
在代码窗口点右键-搜索-当前模块中的名称中的rtcMsgBox函数,双击它,在6A362F29 55 PUSH EBP这一句双击下断点,关掉多余的窗口,只留下
cpu调试主窗口,F9运行程序,点?号按钮,随便输入987654321后,回车后立即中断,然后Ctrt+f9执行到返回地址,因为这是msvbvm60的领空,
我们要回到程序领空.秘密记事本弹出message错误提示信息,点确定,向上看 ,再按F8就回到
5,为Microsoft Visual Basic 6.0。先用SmartCheck找到程序比较注册码点,
6,用vb常用比较断点
vbastrcmp
vbastrcomp
vbavartsteq
在od中设断点找注册码
7,用Od载入程序,运行,填入上面的注册码和顺序号。在Od中下断点,Alt+E,双击Msvbvm60运行库,右键-搜索当前模块中的名称,找到Vbastrcmp,双击下断点。

野猫III 发表于 2006-6-4 12:08:35

很有理论性,复习啦!

感谢楼主的转帖!

hanxiucao 发表于 2006-6-6 22:03:50

这么深奥的东西,先看看再说

pygbian 发表于 2007-1-30 10:56:17

GetVBRes0.90:
http://bbs.xdowns.com/cnc/UploadFile/2006-4/2006411028243115.rar
VBDE
http://www.enet.org.cn/Soft/UploadSoft/200602/20060203015612494.rar

wzwgp 发表于 2007-1-30 11:36:11

学习了,VB的东西有些麻烦的。

xxdoc 发表于 2007-1-30 14:35:20

《QQ斗地主两副牌刷分>

这个程序有点变态,反调试重启:调用exitwindowsex这个函数

004086D0    A1 8C4C4100   MOV EAX,DWORD PTR DS:
004086D5    0BC0            OR EAX,EAX
004086D7    75 02         JZ SHORT QQ斗地主.004086DB将这里改为JNZ
004086D9    FFE0            JMP NEAR EAX
004086DB    68 B8864000   PUSH QQ斗地主.004086B8                      ; user32.dll
004086E0    B8 E0104000   MOV EAX,<JMP.&msvbvm60.DllFunctionCall>
004086E5    FFD0            CALL NEAR EAX
004086E7    FFE0            JMP NEAR EAX

就可以避免重启,方便大家调试哦

另外大家下BP __vbaStrCat,一直按F9就可以看到程序检测的东西:

在堆栈中看到

0012F8E4   0015F71CUNICODE "regsho"

0012F8E4   0015F71CUNICODE "fileMo"

0012F8E4   0015F71CUNICODE "SoftIC"

0012F8E4   0015F71CUNICODE "Regsna"

0012F8E4   00163564UNICODE "Smartche"

0012F8E4   001635B4UNICODE "WKTVBDebug"

0012F9BC   00163604UNICODE "\kugua748.dat"

我在网吧,比较不方便搞,以上是我找的一些,希望对大家破解有帮助,,这个VB的确很难,希望高手搞个动画,给我们这些菜鸟学习下啊1

xinldy 发表于 2008-2-5 23:16:14

我也感到很头疼!!

GGLHY 发表于 2008-2-8 16:13:07

呵呵,严重的学习哦!

lixy8888 发表于 2008-8-7 22:49:41

不错,总结的很好,收藏

一六八 发表于 2011-1-3 16:09:50

加上实例该多好!
页: [1]
查看完整版本: Bbgs.chinayVB程序的破解