VB程序破解

VB 程序简介

  现在不少程序是用 VB 写的,你通过反汇编或跟踪调试时很容易鉴别某个程序是否为 VB 程序,VB EXE 文件并不是真正的编译可执行文件,它们需其动态链接库才能正常运行,各版本的链接库如下:

VB3 链接库为 vbrun300.dll

VB4 链接库为  vb40016.dll - 16 位,较少见;

VB4 链接库为  vb40032.dll - 32 位;

VB5 链接库为 msvbvm50.dll

VB6 链接库为 msvbvm60.dll

  VB 程序执行时从本质上讲是解释执行,它们只是调用  VBRUNxxx.DLL 中的函数   ,这样可使程序员不需写大量的程序代码就可编写出较好的图形界面的 windows 程序,不过 VB 是真正的程序吗?

 当然 VB 程序大大方便了程序编写者,但对我们来说, VB 程序向来是谁见谁头痛,一般用 VB 做的程序无论注册码也好, 30 天到期也好,如果用常规方法都很难有被破解的可能。原因很简单, VB exe 是伪代码,程序都在 vbXXX.dll 里面执行,你只能在 vbdll 里面用 sice 打转转,什么都改不成,而且代码质量不高,结构还颇复杂。

 不过你学完这一课,你就不用怕 Vb 程序,在这里我就谈谈两种常用方法,一、用 SOFTICE 对付;二、用 SmartCheck 。这一节就讲讲 SOFTICE 破解 VB 程序。

--------------------------------------------------------------------------------

SOFTICE 配制

 虽然大部分 VB 程序仍调用 Win32 API 函数,但如想在 VB dll 运行库中设断的话,你就必须把 VB dll 运行库加入 SOFTICE 配制里去。具体你可参考第五课中的《 SOFTICE 安装及使用》。

下例是在 win95/98 下你把相关的 VB DLL 运行库加入 winice.dat 配制文件里。 ( 部分 )

; 注意分号后是描述语言,不被执行。每次只装载需要的一种 VB dll ,不要同时装载两个以上,把要装载那种 VB dll 那一行的分号去掉,重新启动即可。另外,判断软件是何种 VB dll 有几种方法,最直接一种用 WDasm89 查看,还有一种方法是用十六进制工具打开程序,观察。或用 SOFTICE 跟进去(用 bpx hmemcpy) ,稍转一圈,你观察一下调试窗口领空处会出现何种 VB DLL 即可。

; EXP=c:/windows/system/msvbvm60.dll   ; Visual Basic 6
; EXP=c:/windows/system/msvbvm50.dll   ; Visual Basic 5
; EXP=c:/windows/system/vb40032.dll    ; Visual Basic 4(32-bit)
; EXP=c:/windows/system/vb40016.dll   ;Visual Basic 4(16-bit) 较少见
; EXP=c:/windows/system/vbrun300.dll   ; Visual Basic 3

   这样配制好后,重新启动,就可设 VB 运行库中各函数的断点了。

--------------------------------------------------------------------------------

VB dll 常用函数

1 、字符处理函数

MultiByteToWideChar, rtcR8ValFromBstr, WideCharToMultiByte, __vbaStrCmp, __vbaStrComp, __vbaStrCopy, __vbaStrMove, __vbaVarTstNe .

注意:这些函数前的下划线 __ 是由两根短线 _ 组成的,不要弄错。 如果你是 crack VB6 程序,你应在断点前增加 msvbvm60! 如:  bpx msvbvm60!__vbastrcomp 

VB5以前版本就没此限制 。如 bpx __vbaStrCmp

一些常用字符串函数

Val()  转换字符串为数字 .

Str$() -  转换数字为字符串 .

Left$() -  按要求从左取字符。例如:  Left$(Theodolite, 4) = "Theo".

Right$() -  按要求从右取字符 .

Ltrim$() -  去除字符串左边空格例如:  Ltrim$ (" Hello ") = "Hello ".

Rtrim$() -  去除字符串左边空格 .

Trim$()  去除字符串两边空格 .

Asc() -  转换字符为 ANSI 编码  . 例如: Asc("A") = 65. (注:65是ASCII码的十进制)

Chr$() -  转换 ANSI 编码为字符 . 例如  Chr$(65) = "A".

几个常用函数简解:

1、 __vbavartstne

如是在VB5中CALL MSVBVM50!___vbavartstne

进去后在0F04E351你将看到:
push dword ptr [ebp+0c] ;Push address *真* serial 的地址
push dword ptr [ebp+10] ;Push address 你输入的serial地址

下命令:d ebp+0c
你将在数据窗口看到 4字节地址倒序排列,你再次D 地址(己纠正顺序的), 就可看到序列号了。


2、 __vbaR8Str

在 VB5中是如下情况:
Push ebp-20
Call MSVBUM50.__vbaR8Str ;转换 string 到 Integer/Real
fcomp qword ptr [00401028] ;数据比较

在这行fcomp qword ptr [00401028] Type: DL 00401028 将看到*real* serial #.

DL 是显示 Long/real 型,SOFTICE默认时是DB状态。


3、 __vbastrcmp

例:

:005BDC32 CALL [MSVBVM50!__VbaFreeVar]
:005BDC38 MOV ESI,[EBP+08]
:005BDC3B PUSH ESI
:005BDC3E CALL [ECX+00000790] <-- 值返回到 EDX.
:005BDC44 MOV EDX,[ESI+4C] <-- 输入的号码,但倒转
:005BDC47 MOV EAX,[005E0078] <-- 正确号码
:005BDC4C PUSH EDX
:005BDC4D PUSH EAX <-- Push参数给 __vbaStrCmp.
:005BDC4E CALL [MSVBVM50!__vbaStrCmp] <-- Visual Basic 字符串比较
:005BDC54 TEST EAX,EAX <-- 测试比较结果
:005BDC56 JNZ 005BDC64 <-- 不相等跳走

 

2 、警告窗口函数

rtcBeep, rtcGetPresentDate (time API), rtcMsgBox

--------------------------------------------------------------------------------</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值