VB的拆解习题

习题一 chap7-01 序列号保护;难度:易。

习题一 我要看答案

       

该程序是VB5程序,下面用两种方法简述一下。
1 、用 SmartCheck 破解
SmartCheck 装载该程序,输入任意序列号如 9876543210 ,点击 register ,它会告诉你错误。此时不要点 OK, SmartCheck 下按停止按钮(红色的那个), CrackMe 停止退出。
展开 Reg_Click  来到 + MsgBox 这行,用 "Show All Events" 命令。你会看到:
+ _vbaFreeObjList
+ SysFreeString    <--  你输入的序列号
+ SysFreeString    <--  正确的序列号,看右边: "rkh1oyie"
..... 省略一部分 .........
+ SysFreeString
_vbaVarTstEq returns DWORD:0
+ _vbaVarDup returns DWORD: 63F3AC
+ _vbaVarDup returns DWORD: 63F3BC
+ MsgBox     <--  展开后你停在此,向上看,需用滚动条向上翻。
2 、用 SOFTICE 破解
Step1  运行 CrackMe 并输入任意序列号;
Step2  SOFTICE 下设断: bpx__vbastrcomp, register ,将被 SOFTICE 拦截;
Step3  F10  向下 ...... 
:0F003577      MOV   ESI , [EAX - 04] 
EAX =  假的序列号
Step4  一直向下 ....... 
:0F003588      MOV   EDI , [ECX-04] 
d  ecx-04 => .r.k.h.1.o.y.i.e. (wide char
注:注册成功后,你还想练习,请在CrackMe菜单FILE选择restart

 

习题二 chap7-02 序列号保护;难度:易。

习题二 我想看到答案

       

 

名称 : VB5-CrackMe 1.0 by Blaster99 [DCD]
作者: h4Ck07iC
翻译:看雪(译于
2000/2/27)
工具 :SmartCheck
难度:极易
目的:让新手熟悉 SmartCheck

 本篇教学只是为初学者熟悉 SmartCheck 用法,你应该看过前一节的简单介绍,才能较好理解。

 首先运行 SmartCheck ,按上一节配制好, SmartCheck 装载该程序,(如 setting Error Detection  "Report error immediately" 选上,将出现错误报告,此时按 acknowledge 即可,建议不要选);点击 Registrieren ,你将被告知注册出错(对话框中不知是哪国鸟语 ^-^ )。

好了,你现在停止此程序。

 在 SmartCheck 主窗口下,点击 Commang1_Click  中的“+”号,将出现 3 行:

Text1.Text

Text1.Text

MsgBox(VARIANT:String:"Error!..."...)...

再也没有多余的信息了,看 Text1.tex 这一行右边窗口空空如也,该如何办呢?

光标点击选中第一行的 Text1.tex ,在 SmartCheck 菜单中 "View"   "Show All Events"

现在你将看到许多信息,如果没有,说明你的 SmartCheck 配制有问题,重新配制一下。

立即把光标移到 Text1.Text 的下一行,你将看到我上节提到的:

__vbaStrCmpreturns...     在右窗口:  String:"2G83G35H...",String:"12345678..."

哇,找到了,这就是你找的: 2G83G35Hs2

如果你读过我前面的文章,你将理解 __vbaStrCmp  是个非常普通的断点函数。

另外:在 SOFTICE 下,你可设断 :
bpx __vbaStrCmp 

拦截后,跟进去,进去两三个CALL后,你会看到一个 RCMP....比较指令,在这里,下指令:

D EDI

你将在内存里看到序列号,它是 widechar 格式:2.G.8.3.G.3.5.H.s.2

=====================================================================================================

习题三 chap7-03 Name/Code保护;难度:易

习题三 我要看答案

       

1、这是VB5程序,保护很简单;
2、这程序是用__vbaStrCmp比较序列号;
3、因此用习题2我教的方法来开刀
下bpx hmemcpy
按F10或F12回到VB5的领空,下 :
s 0 l ffffffff 56,57,8B,7C,24,10,8B,74,24,0C,8B,4C,24,14,33,C0,F3,66,A7
当然在我们配制好的SOFTICE下 ,按alt+F4,即可;
bpx xxxxxxx(在刚拦截地址处设断)
d esi  你输入的序列号;下 d edi  看到正确的序列号。
用SmartCheck也很简单对付。

习题四chap7-04 Code保护;难度:中

习题四 我要看答案

       

这是VB6程序
这个程序用 SmartCheck 好象查不出什么名堂,只好用 SOFTICE 了。 但是 SmartCheck 还是给了我们点线索:
- register_Click   InputBox  ; 较有趣 ...
Label1.Caption <- "NEIN" (String)
MsgBox returns Integer:1  ;N?Probier's nochmal
因此我们以警告窗口函数设断 : rtcmsgbox ;也可用 rtcInputBox 设断
1) bpx rtcinputbox,  有用 !
:0040208E  CALL [MSVBVM60!rtcInputBox]  ; 显示对话框
:00402094  LEA  EDX,[EBP-00A8]
:0040209A  LEA  ECX,[EBP-24]
:0040209D  MOV  [EBP-00A0], EAX   ;d EAX: 我的序列号 (wide chars)
:004020A3  MOV  DWORD PTR [EBP-00A8],00000008 ; 设置变量  ?
2)   
:004020E0  LEA  ECX,[EBP-24]   
:004020E3  LEA  EDX,[EBP-00B8]   
:004020E9 mov dword ptr [ebp+FFFFFF50], 00401C50 (*); 放正确序列号地址于;[EDX+8]
:004020F3 push ecx
:004020F4 push edx
:004020F5 mov dword ptr [ebp+FFFFFF48], 00008008
:004020FF Call dword ptr [MSVBVM60.__vbaVarTstEq] ; 变量比较  ( 非常重要的BPX)
:00402105 test ax, ax                             ;jmp =  错误的序列号
:00402108 je 004021B4
一旦你跟踪到时这段代码 :004020E9 处,看看 401C50 ecx edx
注意:此时你如检测 ecx/edx 你什么将看不到,这是因为 VB 用了一些特殊的地址方式,牢记此时用 ecx+8   edx+8 查看内存。你将发现你输入的序列号和正确的序列号的偏移地址。
会发现 ecx+8,
bc 02 41 00.. .. ..    D 4102bc  你输入的序列号
edx+8 为:
50 1C 40 00.. .. ..    d 401c50  正确序列号
我们真实序列号为 : 3484

习题五chap7-05 Code保护;难度:易

习题五 我要看答案

       

这是 VB6 程序
一、用 SOFTICE

如此设断: bpx MSVBVM60!__vbastrcomp (  记住在 VB6 前要加 MSVBVM60! )
在第一个 Call [6610EE58]
直到跟踪  Test ecx,ecx
 Then do D ecx -->  3.Q.r.5.3.p.X...
         ....R.E.G.I.S.T.
         R.E.D....N.3.f..
注册码 : 3Qr53pX
二、用 SmartCheck
展开 cmdReg_Click 
"Show All Events" 
__vbaStrCmp(String"3Qr53pX", String"1133557799.."......) 

 

习题六chap7-06 Code保护;难度:中

习题六 我要看答案

       

程序 : Visual Basic 6
工具 :NuMega SmartCheck
方法 : SmartCheck 里理解并分析数据
1 、这个软件在检查序列号前,先查长度,如不是 9 位则不进比较。然后依次一个一个比较序列号,正确就往下进行,错误就停止比较。那是如何知道的?呵,试呗。
2 、按要求配制好 SmartCheck ,然后在 SmartCheck 下运行该程序,你先输入 123456, 点击 "Check It" ,最后我们再来到 SmartCheck 主窗口分析一下。再次强调一下,在 SmartCheck 下有左右两个窗口,下面一个窗口,如你的是一个窗口,请用鼠标把右边和下面的拖出,它们有可能最小化了(我的刚才就是这情况)。
展开 Command1_Click. 只有 3 个信息,其中: Len(String:"123456") returns LONG:6
** 这意味着是检查你输入的字符串的长度,你就多试几次,最后应是 9 位才对 .....
3 、好,当我们输入 9 个字符 "999999999" 时:
最后展开 Command1_Click.  这次你将看到许多函数,如 Asc and Mid... ,所以长度是 9 位。
光标在 Command1_Click 一行,选择 "Show All Events"
下面几行较有趣 :
1) Mid$(String:"999999999", long:1, VARIANT:Integer:1)
** 这意味着,取出你序列号的第一个字符。
2) __vbaVarTstNe(VARIANT:Const Double:9, VARIANT:String:"3")...
3 ”是从哪来的?它同序列号的第一字符 9 比较。
**__vbaVarTstNe  意味着不同变量进行比较,看其是否相等。
因此我们假设第一字符是 3.
然后重输入 "399999999" 重复上面的步骤,你将会看到更多的内容。
这次在第一个 __VbaVarTstNe 后面,将看到下面这行:
Mid$(String:"399999999", long:2, VARIANT:Integer:1)
** 意味着取出第二个字符  "9"
往下在其附近寻找:
__vbaVarTstNe(VARIANT:Const Double:9, VARIANT:String:"0")...
神秘数字 "0"  出现,这就是第二个字符。
因此重复以上操作输入 "309999999" ,一直将 9 个数字全找出。
最后序列号是: 301674501

习题七chap7-07 Code保护;难度:易

习题七 我要看答案

       
类型 : Visual Basic 5
工具 :SmartCheck
SmartCheck 下运行该程序,在你输入字符于注册框前,看看 SmartCheck 主窗口,会发现  Crackmefrm_Load ,我们应有随时观看 SmartCheck 的习惯。
展开 Crackmefrm_Load Double (3.15751e+008) -> Long (315751288)
Ok... 这里较特殊,我们很少在输入序列号前看到数字,我们先记下。
键入 "123456789" 点击 "Check".
然后展开 Checkcmd_Click
String("123456789")-> Double(1.23457e+008)
Double(-1.92294e+008)->Double(-1.92294e+008)
Ok. 数字  -1.92294e+008 从哪里来 ??? 
( 这时,开动我们的第六感觉,想想 ????)
"123456789"   315751288  ,将得到:  -19229449 ,然后转换成双精度实数 -1.92294e+008
你们试一下键入 315751288
.. 成功,我总感觉 crack 有时想搞侦破一样,去猜,去试,再去验证 .......
这时你再次展开 Checkcmd_Click ,会看到:
String("315751288")-> Double(3.15751e+008)
习题八chap7-08 Name/Code;难度:易

习题八 我要看答案

       

工具: SmartCheck
SmartCheck 装载该程序,迅速输入姓名和序列号,最好快点,然后关闭程序(可按 SmartCheck 绿按钮)。现在你会发现许多 "Timer1_Timer" ,不要管它,在 "Show errors and specific Events" 模式下,查找特殊的地方。
你会发现几个 "PWSerialTxt_Change".  点击 "+", 去看到:
PWSerialTxt_Change
PWNameTxt.Text   得到姓名的第一字符
PWNameTxt.Text
PWNameTxt.Text
Left(VARIANT:String"Volatili...", long:1)
Right(VARIANT:String:"V", long1)
Asc(String:"V") returns Integer:86
Right(VARIANT:Integer:86, long:2
PWNameTxt.Text
Left(VARIANT:String"Volatili...", long:2)
Right(VARIANT:String:"Vo", long:1)
Asc(String:"o")returns Integer:111
Right(VARIANT:Integer:111, long:2)
*** 切断部分***
Left(VARIANT:ByRef String:"21160508...", long:10)  .... 这里正确的序列号
大家咸兴趣可仔细分析这段算法:姓名换算成序列号。

习题九 chap7-09 需分析计算,难

习题九 答案

习题十 chap7-10

习题十 答案