VB程序破解
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 程序。 --------------------------------------------------------------------------------
虽然大部分 VB 程序仍调用 Win32 API 函数,但如想在 VB dll 运行库中设断的话,你就必须把 VB dll 运行库加入 SOFTICE 配制里去。具体你可参考第五课中的《 SOFTICE 安装及使用》。 下例是在 win95/98 下你把相关的 VB DLL 运行库加入 winice.dat 配制文件里。 ( 部分 )
; EXP=c:/windows/system/msvbvm60.dll ; Visual Basic 6 这样配制好后,重新启动,就可设 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你将看到: 下命令:d ebp+0c 2、 __vbaR8Str 在 VB5中是如下情况: 在这行fcomp qword ptr [00401028] Type: DL 00401028 将看到*real* serial #. DL 是显示 Long/real 型,SOFTICE默认时是DB状态。 3、 __vbastrcmp 例:
2 、警告窗口函数
-------------------------------------------------------------------------------- VB 序列号破解技巧 在大部分 VB 程序中,我们能用 bpx Hmemcpy 命令设断,但是你将发现自己不久进入 VBRUNxxx.DLL 运行库,很快陷入 Vb dll 中,在大多数情况下,你很难到达其 EXE 文件中的真正比较核心。你通常是依靠字符串的线索来跟踪程序,你们还应记得 VB ( VB4 以上) 程序储存和比较字符是用 wide character 格式(本质是中在各字符间填 20h )。如:
Wide 字符串格式 : C R A C K Z (43h 20h 52h 20h 41h 20h 43h 20h 4Bh 20h 5Ah).
有些情况下应该用 DL (长实型)命令,才能看到正确数字序号。( SOFTICE 默认时为 DB (字节型)) 在多数情况下,在 VB 中设置正确断点是较困难的。断点设置好后,尝试输入序列号,运行后,应返回 VBRUNxxx.DLL 里,现在查找寄存器 (EAX & EBX) 中的值,那里放有你输入字符串长度,如果没发现什么,你应按 ctrl+D 再次返回到 VB dll 中另一处 ,继续查看,一直重复。 一但当你在寄存器中发现字符串长度时,你应一步一步注意观察,如果你幸运的话,你会发现输入字符串躺在寄存器或其显示附近内存里。这时你在 SOFTICE 里的数据窗口中用 ALT+ 光标键滚动查找,说不定会发现正确序列号懒洋洋躺在那附近。 -------------------------------------------------------------------------------- Visual Basic 程序比较方法 在 Visual Basic 里有 8 种以上的方法检测正确的序列号 / 密码。我这里将谈谈这 8 种方法,它们都是较容易并用得较多。首先是最普通的 3 种: 1) 串(string) 比较 在这比较方法里,正确密码串如: "Correct Password" 和你输入的密码串如: "Entered Password" 比较。 串是由相邻的字符按顺序排列组成,一个串包括字母、数字、空格和标点符号。一个固定长度的串可储存 0 到 63K 字符。如是动态的串其储存字符个数可达 20 亿字符。
VB 串比较代码一般格式:
GoTo Correct Message Else GoTo Wrong Message End if
i) __vbastrcomp or __vbastrcmp (下划线是两短线 _ 组成) <-- 串比较函数
如: bpx msvbvm60!__vbastrcomp or bpx msvbvm60!__vbastrcmp
如: 56,57,8b,7c,24,10,74,0c,4c,14,33,c0,f3,66,a7
在这方法中,两个变量(变量数据类型)互相比较。变量数据类型是一种特殊数据类型,包括数字、字符串或日期数据及一些用户定义的类型。这种类型储存数字长度是 16 字节或字符 22 字节(加上串长度)。
correct = Correct Password <-- 设置 "correct" 放置 "Correct Password" entered = Text1.Text <-- 设置 "entered" 作为你输入密码 If correct = entered Then <-- 用变量方法比较 GoTo Correct Message Else GoTo Wrong Message End If
__vbastrcomp 等 ...
i) __vbavartsteq <-- 测试变量是否相等
例: bpx msvbvm60!__vbavartsteq
这也是一个普通的方法。两个变量(长整型)互相比较。 long 型数据类型是 4 字节( 32 位)整数,其范围 -2,147,483,648 到 2,647 。因此该种方法存在只能比较数字的局限性。 一个此类型范例:
correct = 12345 <-- 设置 "correct" 为正确密码 entered = Text1.Text <-- 设置 "entered" 为输入密码 If entered = correct Then <-- 用长整型方法比较 GoTo Correct Message Else GoTo Wrong Message End If
--------------------------------------------------------------------------------
这个方法用两单精度实数数据彼此比较。 它的数据类型是单精度浮点实数,在内存中占 4 字节( 32 位),数值范围 -3.402823E38 到 -1.401298E-45 为负值, 1.401298E-45 到 3.402823E38 为正值。 因此这方法一个限制是仅仅能比较数字,但是有时,程序能把我们的姓名和序列号转换成实数比较。 这种类型格式 :
correct = Correct Password <-- 设置 "correct" 为 "Correct Password" entered = Text1.Text <-- 设置 "entered" 为你输入密码 If correct = entered Then <-- 在此比较 GoTo Correct Message Else GoTo Wrong Message End If
5) 双精度(Double)比较 这个方法是用两个双精度数据比较。 它的数据类型是双精度浮点实数,在内存占 8 个字节( 64 位), -1.79769313486232E308 到 -4.94065645841247E-324 是正数, 4.94065645841247E-324 到 1.79769313486232E308 是负数。 你可能发现双精度比较非常类似单精度比较。因此这方法一个限制是仅仅能比较数字,但是有时,程序能把我们的姓名和序列号转换成实数比较。
correct = Correct Password <-- 设置 "correct" 为 "Correct Password" entered = Text1.Text <-- 设置 "entered" 为你输入的密码 If correct = entered Then <-- 在此比较 GoTo Correct Message Else GoTo Wrong Message End If
这方法是用两个整型数据进行彼此比较。 它的数据在内存是以 2 个字节存放。范围 -32,768 到 32,767 。同样这方法一个限制是仅仅能比较数字,但是有时,程序能把我们的姓名和序列号转换成实数比较。
这种类型格式 :
correct = Correct Password <-- 设置 "correct" 为 "Correct Password" entered = Text1.Text <-- 设置 "entered" 为你输入的密码 If correct = entered Then <-- 在此比较 GoTo Correct Message Else GoTo Wrong Message End If
这个方法是两个字节数据进行比较。 它是 0-255 范围的整数,其通常存储是 1 字节( 8 位)。 其限制不超过 255,但有时它通过计算把你姓名转换成数字,以此比较。
correct = Correct Password <-- 设置 "correct" 为 "Correct Password" entered = Text1.Text <-- 设置 "entered" 为你输入的密码 If correct = entered Then <-- 在此比较 GoTo Correct Message Else GoTo Wrong Message End If
它的数据范围: -922,337,203,685,477.5808 到 922,477.5807. 用这数据类型进行货币和一些需高精度的场合上很重用。 因此此种方法局限性也是只能比较数字,但有时它通过计算把你姓名转换成数字,以此比较。
Dim correct As Currency,entered As Currency <-- 定义 "correct" 和 "entered" 为 Currency 型 correct = Correct Password <-- 设置 "correct" 为 "Correct Password" entered = Text1.Text <-- 设置 "entered" 为你输入的密码 If correct = entered Then <-- 在此比较 GoTo Correct Message Else GoTo Wrong Message End If
上述8个比较方式是不是意味着我们每次能中断在其单个某一类型的比较程序里?回答是否定的。这是因为程序有可能同时采用两种方法来比较,如Currency和String,Variant 和 Long 等... 比较类型列表 String V = Variant 型比较 SD = 在比较前字符串( String )转换成双精度型( Doubl ) SC = 在比较前字符串( String )转换成 Currency 型 SS = 在比较前字符串( String )转换成双单精度型( Single ) Sin to D = 在比较前单精度型转换成双精度型( Double ) DC = 直接比较 __vbaFpCmpCy =Currency 型浮点比较
-------------------------------------------------------------------------------- 一些可能用上的断点 1) 数据类型转换 i) 字符串( String )转换字节( Byte )或整型( Integer ) : __vbai2str ii) 字符串( String )转长型( Long ) : __vbai4str iii) 字符串( String )转换单精度型( Single ) : __vbar4str iv) 字符串( String )转换双精度型( Double ) : __vbar8str v) 字符串( String )转 Currency 型 : VarCyFromStr ( 适合 VB6. 你的 WINICE.DAT 必须有 OLEAUT32.DLL) vi) 整型( Integer )转字符串型( String ) : VarBstrFromI2 ( 适合 VB6. 你的 WINICE.DAT 必须 OLEAUT32.DLL)
i) 字符串( String )到内存 : __vbaStrCopy ii) 变量( Variant )到内存 : __vbaVarCopy or __vbaVarMove
i) 加法 : __vbavaradd <-- 增加变量 ii) 减法 : __vbavarsub <-- 减去变量 iii) 乘法 : __vbavarmul <-- 乘以变量 iv) 除法 : __vbavaridiv <--Dividing Variant to get answer in Integer v) XOR: __vbavarxor <--XOR
i) __vbavarfornext <--Used in codes where there is a For... Next... Statement (Loop) ii) __vbafreestr iii) __vbafreeobj iv) __vbastrvarval <--Get the value from a specific location in a String v) multibytetowidechar vi) rtcMsgBox vii) __vbavarcat <--Joining 2 Variants together viii) __vbafreevar ix) __vbaobjset ============================= crack VB程序的一些建议 1 )用SmartCheck配合。 首先:运行 SmartCheck 后,点击 Program -> Settings. 在 Error Detection 这一栏中选中所有的 ERROR 报告。Report errors immedietly 可不选。在 Advanced 中仅仅顶部 3 个 Report 必须选上。
例如:你设置 __vbafreestr 断点,在你点击 OK 后,有很多次中断。如果你在 SmartCheck 下查看是在第 10 处: 10th __vbafreestr 离出错信息最近,在 SOFTICE 下你可按 F5 九次来到 __vbafreestr 。 记得在 VB6,设断时前面加上 msvbvm60! 。 5) 运行程序输入序列号,按 OK,SOFTICE 将会中断,除非你断点没找对。有一点需注意:在 VB6 下有可能需在运行程序前设置断点,才能中断。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/vaststudio/archive/2005/03/19/323961.aspx (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |