本类共有 70 篇文章,今日更新 0

菜鸟挑战VB程序 - 跟踪经验和实例

[ 来源:http://www.91now.com/down/ | 作者: | 时间:2007-5-18 18:30:39 | 浏览: 人次 ]


经过上一次破解sunson’s crackme No.1的成功,对VB程序的信心增强了一些,也多少积累了一些经验: 

1、  要熟悉VB经常调用的函数,一般是以__vba和rtc前缀开头的,像__vbaStrCmp, rtcMsgbox, rtcMidCharVar等; 
2、  重点要放在我们所分析的程序代码上,比如我们调试的exe文件名为:crackme.exe,那么在OD中就要注意Call crackme.xxxxxx一类的调用,而对于Call &MSVBVM60.xxxxxx、Call User32.xxxxxx、OLEAUT32. xxxxxx一类的系统函数一般步过就行了; 
3、  VB程序的For、While、Do…Loop循环结尾常常用jo跳转来判断是否要继续循环还是结束循环; 
4、  SmartCheck是分析VB程序的一大利器,配合ollyDbg使用,常常能赶到事半功倍的效果。 

一些别的程序语言也适合的经验: 

1、  碰到WndProc、ProcClass这类窗口和消息函数调用,一般不要步入,否则很难退出来(其它程序也适用); 
2、  对于分段验证的程序:正确- ABCDE,试练-12345,如果A错了,根本就不会运行到B。在跟踪分析出A的要求后,重启,试练改为A2345,再跟踪分析。用这种方法就能一步步地走到目标; 
3、  这点不是技术问题,也不只是适用于VB程序,但可能重要过很多技术因素:耐心! 

前面成功分析过happytown的crackme #06、#07,比较喜欢他的作品(因为适合我这样的初学者啊!),看了看本站他发表的Crackme #1,也是VB程序,好像现在还没有人分析过算法,那就把它作为我的第二个VB程序练习吧。 


【软件名称】:happytown CrackMe ###1.exe 
【原贴参考】:http://bbs.pediy.com/showthread.php?s=&threadid=15354 
【软件下载】:因为原贴中下载有时候有问题,我就传上一个附件:happytown-crackme-01.zip  
【软件信息】: VB 6.0,无壳,64 KB,用户名-注册码方式,无错误提示 
【破解工具】:OllyDbg 1.10聆风听雨汉化第二版, SmartCheck 6.20 


启动后运行一下,随便输入个用户和试练码,没有任何提示,用SmartCheck打开,F5运行,输入: 

Name: hud 
Serial: 123123 

点击Check按钮,回到SmartCheck中,察看Events。 

Events中有:FormCreate,Form_Load,txtName和txtSerial的GotFocus/LostFocus事件,都没有什么和注册码验证相关的内容,那么所有的验证都在按钮Check的Click事件中完成了。 

点击cmdCheck_Click左边+号展开,发现的动作有: 
1.  取得Name的字符和长度 
2.  取得试练码的字符和长度 

然后就结束了。说明输入的用户名或者试练码不符合要求! 

现在轮到OD上场了,用OD打开并按F9运行,在Crackme中输入上述Name及试练码,回到OD中,先试试下断点在__vbaStrCmp上,断不下来;再试__vbaStrCopy,断下了: 


004079A3    .  8B3D 80>mov edi,dword ptr ds:[<&MSVBVM60._>;  MSVBVM60.__vbaStrCopy 
004079A9    .  33DB    xor ebx,ebx 
004079AB    .  BA 5871>mov edx,CrackMe_.00407158          ;  UNICODE "Congratulations" 
004079B0    .  8D4D D8 lea ecx,dword ptr ss:[ebp-28] 
004079B3    .  895D E8 mov dword ptr ss:[ebp-18],ebx 
004079B6    .  895D DC mov dword ptr ss:[ebp-24],ebx 
004079B9    .  895D D8 mov dword ptr ss:[ebp-28],ebx 
004079BC    .  895D D4 mov dword ptr ss:[ebp-2C],ebx 
004079BF    .  895D D0 mov dword ptr ss:[ebp-30],ebx 
004079C2    .  895D CC mov dword ptr ss:[ebp-34],ebx 
004079C5    .  895D C8 mov dword ptr ss:[ebp-38],ebx 
004079C8    .  895D B8 mov dword ptr ss:[ebp-48],ebx 
004079CB    .  895D A8 mov dword ptr ss:[ebp-58],ebx 
004079CE    .  895D 98 mov dword ptr ss:[ebp-68],ebx 
004079D1    .  895D 88 mov dword ptr ss:[ebp-78],ebx 
004079D4    .  899D 78>mov dword ptr ss:[ebp-88],ebx 
004079DA    .  899D 68>mov dword ptr ss:[ebp-98],ebx 
004079E0    .  899D 58>mov dword ptr ss:[ebp-A8],ebx 
 004079E6    .  FFD7    call edi                           ;  <&MSVBVM60.__vbaStrCopy> 
004079E8    .  BA 7C71>mov edx,CrackMe_.0040717C          ;  UNICODE "Good Job!" 
004079ED    .  8D4D DC lea ecx,dword ptr ss:[ebp-24] 

很快看到下面有”Congratilations”和”Good Job!”,心中一阵狂喜!是SmartCheck错了吗?一路F8按下去: 

…… 

00407A2D    > \8B5>mov edx,dword ptr ss:[ebp-30]        ;  这里出现了试练码hud 
00407A30    .  8B3>mov edi,dword ptr ds:[<&MSVBVM60.__v>;  MSVBVM60.__vbaStrMove 
00407A36    .  8D4>lea ecx,dword ptr ss:[ebp-2C] 
00407A39    .  895>mov dword ptr ss:[ebp-30],ebx 
00407A3C    .  FFD>call edi                             ;  <&MSVBVM60.__vbaStrMove> 
00407A3E    .  8D4>lea ecx,dword ptr ss:[ebp-38] 
00407A41    .  FF1>call dword ptr ds:[<&MSVBVM60.__vbaF>;  MSVBVM60.__vbaFreeObj 
00407A47    .  8B4>mov eax,dword ptr ss:[ebp-2C] 
00407A4A    .  50  push eax 
00407A4B    .  FF1>call dword ptr ds:[<&MSVBVM60.__vbaL>;  MSVBVM60.__vbaLenBstr 
00407A51    .  8BC>mov ecx,eax                          ;  得到的Name长度3放到ecx中 

走到这里,发现不对啊,这不是和SmartCheck里“先取Name的字串和长度”的过程是一致的吗? 

那么为什么有”Congratilations”和”Good Job!”字串呢?想了一下,可能是happytown为了避免破解者通过查找这两个字串很快定位,然后逆流而上,很快就能找到关键算法,所以提前在这里处理。这样看还没开始呢!但是断点应该下对了(这里有点运气成分,正好把这两个字串提前处理,调用了这个函数,在大部分VB程序中,用这个函数并不能断到关键处)!继续F8: 
…… 

00407A97    > \8B5>mov edx,dword ptr ss:[ebp-30]        ;  试练码出现,预料之中 
00407A9A    .  8D4>lea ecx,dword ptr ss:[ebp-18] 
00407A9D    .  895>mov dword ptr ss:[ebp-30],ebx 
00407AA0    .  FFD>call edi 
00407AA2    .  8D4>lea ecx,dword ptr ss:[ebp-38] 
00407AA5    .  FF1>call dword ptr ds:[<&MSVBVM60.__vbaF>;  MSVBVM60.__vbaFreeObj 
00407AAB    .  8B5>mov edx,dword ptr ss:[ebp-18] 
00407AAE    .  52  push edx 
00407AAF    .  FF1>call dword ptr ds:[<&MSVBVM60.__vbaL>;  MSVBVM60.__vbaLenBstr 
00407AB5    .  8BC>mov ecx,eax                          ;  试练码长度 
00407AB7    .  FF1>call dword ptr ds:[<&MSVBVM60.__vbaI>;  MSVBVM60.__vbaI2I4 
00407ABD    .  66:>cmp word ptr ss:[ebp-1C],5 

哈哈,原来问题出在这里,Name要5位以上!按F9,将Name改为hud01,将前面的断点关闭,在这里下个断点,再按F9向下继续: 

00407AC2    . /0F8>jl CrackMe_.004081C4                 ;  跳就over了 
00407AC8    . |66:>cmp ax,0A 

另一个问题出现了,注册码不小于10位长,如法炮制,试练码改为:1234567890,F9继续: 

00407ACC    . /0F8>jl CrackMe_.004081C4                 ;  跳就over了 
00407AD2    . |8B3>mov esi,dword ptr ds:[<&MSVBVM60.#63>;  MSVBVM60.rtcMidCharVar 
00407AD8    . |8D4>lea eax,dword ptr ss:[ebp-18] 
00407ADB    . |8D4>lea ecx,dword ptr ss:[ebp-48] 
00407ADE    . |894>mov dword ptr ss:[ebp-80],eax 
00407AE1    . |51

[1] [2] [3] [4] [5] [6] 下一页

广告位