VB程序的克星SmartCheck及重启验证型破解实例
本帖最后由 谢鹰杰 于 2019-2-21 09:42 编辑VB程序的克星SmartCheck及重启验证型破解实例
想必大家都知道,VB属于解释执行型的语言,它生成的程序是一边翻译一边执行的。以前老的版本由于语言解释器的存在,我们平时习惯使用的OllyDbg等调试工具在跟踪VB程序的时候经常不停地跳来跳去,让你晕头转向,这是因为我们跟进了解释器的地盘,里面的东西是相当难搞明白的。不过现在的VB6程序已经不再是单纯的解释执行,大部分的内容取而代之变成了编译后的代码。虽然如此,还是不能像VC、Delphi程序反编译后的那么直观:压入一堆你看不明白的参数,call一些不知道什么意思的过程,动辄错误、中止。用OD来跟还是不够方便啊!怎么办呢,对于Native Code程序(P-code是封装代码或者说中间件伪代码,相对的Native Code就是原始的未使用P-code的代码,本文不涉及P-code),我们可以使用SmartCheck来轻易对付它。
这次我们破解的对象是一个网站信息收集工具,用PEiD查看得到的内容是:Microsoft Visual Basic 5.0 /6.0,这说明软件用VB5以上版本编写,未加壳!呵呵,省去脱壳的麻烦了。下面我们进入实战部分。
工具配置
在开始分析前我们需要先把SmartCheck(下文简称SC)配置好,这个步骤很重要,否则有些关键事件可能会没保留下来。运行SC,载入要破解的软件,然后点快捷按钮栏的“程序->设置”,接下来按照图1和图2所示设置即可,其余的可以使用默认配置。
初步分析
设置完后按F5运行软件,首先显示的是一个输入注册码的窗口,这里我们就随便输入“1212121212”吧,点“注册”后程序一声不吭就退出了,看来还是一个重启验证型软件嘛。这时我们看SC的界面,分析已经随着程序退出而中止了,不然我们还得自己按“停止”来结束分析。乍眼看上去一大堆东西,不过只要写过VB程序的人应该不会觉得陌生,就算不懂VB的也不打紧,我们慢慢看自然会明白其中的意思。现在显示的是从软件启动到输入完注册码退出后的特定事件,我们在图3左栏的窗口里逐一点击查看(如果看不到这个界面,把“程序结果”窗口最大化即可,因为分栏是缩在边上的)。
嗯,发现刚才注册窗口显示的序列号了(这个相当于机器码,不同电脑上可能会不一样),估计这之前是计算序列号的过程,不过这个我们不用关心,继续往下面看。展开Command1_Click过程,呵呵,发现我们输入的注册码了,毫无疑问,这个按钮事件就是对应注册码算法的,重点锁定在这里。一路看下来,蛮多VB函数调用的,后面再次出现了序列号,过程结尾处有一串数字“2658271038273406817399346741”,如图4所示。
难道这就是注册码吗?试试看,重新F5运行,输入这串数字,注册,退出。再重新运行(别忘了是重启验证型,就算是正确的注册码也需要第二次运行才能知道是否成功注册),呃,看来不对,还是那个可恶的注册窗口。这串数字到底是什么意思呢? 详细分析 刚才我们一直看的是特定事件分析结果,这样虽然找明码比较快,但现在这种没有明码比较的情况就需要慢慢跟踪流程了。接着上面还是输入那串数字,注册退出后选择快捷栏上的“查看->显示所有事件”,这下出来的东西就多多啦,对应图4字符串的地方下面是一个比较语句,如图5所示。
两个字符串比较,看来关键就在这里,刚才我们经过试验得知String2这串28位的数字不对。而一般情况下比较语句都是比较两者是否相等,这里假设如果String1=String2则注册成功,那么第一步就先搞清楚String2是怎么来的吧。可能有些朋友想说:为什么图5里的String1“15185818151511”就不能是注册码呢?别忘了,我们输入两次不同的假注册码都是显示同一String2字符串,可见它是相对固定的,而String1则是每次都变化,可见跟输入的注册码有关,所以此时的String1不会是注册码,而我们输入的假码是怎么转化成String2(String1=String2注册成功)才是关键! 我们往上面一直拉到Command1_Click,再次逐一看下来,如图6所示。
由于这次是详细分析,所以大家如果不熟悉VB函数的话最好通过搜索引擎来找一下相关函数的作用看看。这次SC显示的事件很多,为了不占用版面,我只挑关键的地方截图,其它的就讲讲大概意思,大家自己跟一下就很清楚了。Command1_Click过程一开始分配空间构成一个字符数组,这里我们把它称为T,内容是:{C,A,J,K,E,3,U,V,4,Q,X,7,S,H,Y,P,5,M,F,W},接下来把我们输入的假注册码前三位去掉,再逐位取剩下的字符和T数组里的字符比较,相等则生成对应数组下标数字的字符。假设我们输入的注册码是xxxCAJKE,那么这里就会生成字符串“01234”。我们前面输入的假码“2658271038273406817399346741”经过一番运算后变成了“11511581558118”,我们先把这设为S1。奇怪,怎么跟图5的String1不一样呢?再往下面看,哦,原来是把S1按奇偶位分别取成两段,然后把偶数位段反取,最后两段连接起来才组成了String1。OK,我们搞清楚其中一半关键了,接下来只要弄清楚String2“2658271038273406817399346741”是怎么来的再逆推回去不就可以得到注册码了吗?看完String1的生成过程后(比较长,大家要有耐心)序列号终于出现了,如图7所示。
<="" dd=""style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;display: inline; width: 550px; height: 302px;">
SmartCheck操作技巧SmartCheck 介绍
配置 SmartCheck
用SmartCheck如何运行所要crack程序
程序在SmartCheck下运行结束后你应看到时如下东西
SmartCheck 常见信息SmartCheck介绍SmartCheck 是 NuMega 公司推出的一款出色的调试解释执行程序的工具,目前最新版是 v6.03 。它非常容易使用,你不需了解汇编程序。我们以前经常用 SOFTICE 和W32Dasm 调试程序,幸好 SmartCheck 出现大大地方便了我们。下面我就介绍SmartCheck的基本用法。 配置SmartCheck首先运行SmartCheck,装载一VB程序。在菜单选择:Program→Settings;出现图一:(如你在SmartCheck下没有打开应用程序,只出现三个菜单选项:Error Detection;Rrporting;Program Info.)Error Detection(图一):选上所有的选项。 "Report errorimmediately",可根据情况调整,选上后程序执行有错误时会立即出现报告,此时在弹出的报告栏上按acknowledge即可,你嫌麻烦可不选此项.如此项没选,则不立即报告.建议不要选。
图一
点击在上图中Advanced后出现图二:
图二
Advanced(图二):选上前面的四项.确信"Suppress system API and OLE calls"没被选上.
Reporting(图三):除了"Report MouseMove events from OCX controls"外其余全选上
.图三用SmartCheck如何运行所要crack程序1) 首先运行;
2) 在"File", "Open",选择你需运行的程序;
3) 按F5或选择 "Program", "Start"运行程序;
4) 停止程序,选择"Program", "End";
你最好是了解SmartCheck的工具栏的用法,大大方便操作。程序在SmartCheck下运行结束后你应看到时如下东西1) 在SmartCheck里你应有3个小窗口。我自己的有时会出现一个主窗口,怎么回事呢?原来其它两个(右边和下边)完全最小,缩到边上(右边、下边)去了,你可用鼠标把它们拖出来。
2) 主窗口被称为"Program Results window"。 这窗口在左上。
3) 右边的窗口主要是显示主窗口的一些详细内容,很多重要详细东西都在此,你有可能看到的序列号就在这里。在你停止程序后,你应该分析SmartCheck给出的信息,你必需选上相关的行,并选择"View", "ShowAll Events"。你需要VB介绍这课相关知识了解各比较方法和断点函数。SmartCheck 常见信息我用粗体表示在SmartCheck中显示的内容。****.Text 如. Text1.Text
如果你点击前面的“+”符号,你将看到其它的几行,寻找SysAllocStringLen。
如.SysAllocStringLen(PTR:00000000, DWORD:00000029) returns LPVOID:410584解释:
从文本框取出你键入字符并放置在内存00410584处。这意味着你可不用SOFTICE下的"s 30 l" 查找字符串命令。我们来验证一下:确信你的SOFTICE己运行,然后在SmartCheck下再次运行程序。当你在SmartCheck下的程序正在运行时,在适当机会用SOFTICE中断(CTRL+D),下命令"d 00410584"。如果你做的正确的话,你将在内存里看到你键入的字符。 如果你的程序没在SmartCheck下运行,你可能在此地址看不到,因为内存可能改变了。或内存“释放”。__vbasrtcmp(String:"zzzzz",String:"yyyyy")returns DWORD:0解释:
__vbastrcmp -- 用来比较字符串 如. "zzzzz" and"yyyyy"
注意:你可能会看到正确序列号和你输入字符串比较。
returns DWORD:0 -- 在SOFTICE里,你将看到比较后, eax = 0__vbafreestr(LPBSTR:0063F3F0)
点击上面 "+" 寻找SysFreeString
如. SysFreeString(BSTR:00410584)解释:
字符串在内存00410584 被清除。__vbaVarCopy(VARIANT:String:"12345", VARIANT:Empty) returnsDWORD:63FA30
点击前面的 "+" 号寻找SysAllocStringByteLen
如. SysAllocStringByteLen(LPSTR:004023F0, DWORD:0000000C) returnsLPVOID:4103CC解释:
"12345"被复制到内存 004103CC
这类似 __vbaVarMove__vbaVarForInit(VARIANT:Empty, PTR:0063F920, PTR:0063F91.....)解释:
移动到上面,为了下一个循环
通常在它下面 __vbaVarForNext 用法与其一样.Mid(VARIANT:String:"abcdefg", long:1, VARIANT:Integet:1)解释:
从位置1得到字符串"abcdefg"第一个字符。
点击上面的 "+"号寻找 SysAllocStringByteLen
如. SysAllocStringByteLen(LPSTR:004103F0, DWORD:00000002) returnsLPVOID:410434解释:
"a"将被复制到内存00410434
它后面通常跟随 __vbaStrVarVal(VARIATN:String"a") returns DWORD:410434Asc(String:"T") returns Integer:84解释:
得到“T”的ASCII码十进制 84SysFreeString(BSTR:004103F0)解释:
释放内存位置:004103F0
这些对我们特别有用,因为当你点击它们,看右边窗口,你将看到被释放的字符串。此时正确的序列号和密码有可能在此。__vbaVarCat(VARIANT:String:"aa", VARIANT:String:"bb") returns DWORD:63F974解释:
连接"bb" 和"aa"形成"aabb"__vbaFreeVar(VARIANT:String:"abcdefg")
点击"+"寻找SysFreeString
例. SysFreeString(BSTR:0041035C)解释:
从内存 0041035C释放 "abcdefg"
这儿,点击这行在右边有可能发现你所要的东西。__vbaVarTstEq(VARIANT:****, VARIANT:****) returns DWORD:0解释:
__vbaVarTstEq 通常用来比较变量.如果它们不一样 , DWORD=0 (so eax=0)
如果它们一样, DWORD将为FFFFFFFF (so eax=FFFFFFFF)
类似__vbaVarCmpEqLen(String:"Cracker") returns LONG:7解释:
得到字符串 "Cracker" 的长度为7****.Text <-- "Wrong!Try Again!!" (String)解释:
在文本框中显示g "Wrong! Try Again!!"__vbaVarAdd(VARIANT:Integer:2, VARIANT:Integer:97) returns .....解释:
2+97=97,返回99
But if both are Strings instead of Integers, you will get 297instead.__vbaVarDiv(VARIANT:Integer:97, VARIANT:Long:1) returns.....解释:
97除以1__vbaVarMul(VARIANT:String:"1", VARIANT:String:"2") returns ...Explanation:
1乘2__vbaVarSub(VARIANT:String:"2", VARIANT:String:"34") returns ...解释:
"34"-"2", 返回 32MsgBox(VARIANT:String:"Nope!That's not right", Integer:0,VARIANT:String:"Wrong",VARIANT.....)解释:
创建一个消息框,标题是 "Wrong" 内容为 "Nope! That's notright" 这工具,可是老多年了! 太古老了,很难碰到这种程序了。, 好深奥,回炉再造 感谢分享。。。。。。 谢谢楼主的分享。 昨晚杀一个VB弹窗,搞不定,老是在VB模块是转,返不回主程序,不知这个工具是否可以找到按钮事件地址。 不错,拿走看看。{:17_1078:}{:300_950:}{:300_962:} 学习一下下 云验证的VB不知道能不能搞得定
页:
[1]
2