经过上一次破解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] 下一页