这是我第一次尝试破解加密程序,颇费了些周折,但还好,最终成功完成任务。希望能与各位分享交流这次破解的经验。
  一个月前下了一个QQ外挂手写板软件(FreeShow2005II),很快就到了试用期限,找了很久也没找到注册版本,于是前几天在论坛上发了求助帖,但无人回复,最后只得自己搞掂。出于对作者的尊重及对国产软件业的维护,本文不提供破解具体细节,主要是提供我的思路和大家分享,不足之处请高手们多多见谅。
软件的情况:
1、PeComp2.X壳;
2、VB6程序,P-code编译;
3、注册码保护+30天限制+防调试器装入运行;
4、运行后先是一个Splash画面(VB常用的),随后出现注册提示;
5、过期后每超一天,注册提示窗体显示时间延时一秒(如过期100天,窗体显示时间100秒);
分析过程:
1、脱壳,很顺利,但程序变得好大!原来589KB,现在3044KB!!!!运行程序,按提示输入信息和试炼码(随便输);
2、通过字符串参考查找线索,由于是VB编写,没找到有价值的东东;
3、找来OD和SOFICE调试,发现装OD载入后一运行程序就终止,而SOFICE的Symbol Loader 就根本载入不了。
动态附加后总是在一堆DLL中打转,几次F9就跟丢了。我的汇编也不是那么差的啊,当年毕业设计是个工控项目,全是用汇编写的,怎么到这儿就菜成这样儿?可能工控程序更朴实一些吧……没那么多乱七八糟的花指令、伪指令之类的东东。
  不死心,运行程序,试着用Sofice 下断Createwindowexa、Showwindow……还有各类消息断点都用上了,没用。注册窗体也被隐藏了,用SPY++倒是可以看到,但Sofice下Hwnd提示没有活动的窗体,无奈,放弃!
4、用SmarkCheck看,提示不能打开P-code程序,遂放弃,但也因此知道了P-code这个词,作为新手的我根本就不知道这回事,惭愧惭愧  :);
5、大概知道P-code是怎么一回事后就上看雪找了个WKTVDB(对于它的作者,我的崇敬如涛涛江水,绵绵不断啊………..太牛了!!!!!)。安装时提示一个DLL文件写错误,但还好,安装后能运行。
6、接下来的难题是,我不懂P-code(有几个人真懂?),但是小弟略知E文,在装入程序后,一眼就看到了那个“Analyze BranchX”,真是救命稻草啊!!!
7、一切都从Branch开始!!!!立即用分支分析器分析,得出4个分支。好!就在第1个上面下断,修改其跳转,BINGOOOOO!!!!防调试器装入运行的设置被破了!程序能继续往下走了,出现了注册提示窗体。不信试试,退出来,用UltraEdit把脱壳文件里的相应机器码改掉,用OD装入,成功运行!
8、有了上面的启示,能否这样认为,完全可以绕开复杂的注册码算法,只在分支点上下功夫,如果是在汇编调试器里这么做那无异于自杀,那里有浩如烟海的各类转移指令。但这是在WKTVDB里啊,伪代码的好处体现出来了吧!!!呵呵…..。
9、接下来有一点要说明一下,WKTVDB对于p-code是逐段装入解释执行的,如果断点在其所在代码段未装入前就设置的话,是没用的。也就是说,每段程序代码装入后,其分支分析结果是不一样的,有时是空的。
10、为了能抓到注册窗体出现时的断点,我在API断点管理器里找得眼都花了,楞是没找到!是我太菜了。只能用笨办法啦:按F5运行,在Splash欢迎画面启动后的2秒内,激活调试窗口,再迅速按下F8键,记住,这些动作要一气呵成,幸亏我原来常玩CS,手眼协调还行。点分支分析器(ANALYZE BRANCHX),弹出分支若干(好在不多),然后耐心地逐个修改测试,如果注册窗体弹出或程序提示出错就排除这个断点,再重复上述工作,分析时千万要记住指令所在地址和原来的机器码(纸和笔比较方便),不然会弄得你欲哭无泪的,到时别怪我不提醒你啊。很快就找到了那个关键分支,修改后不再出现注册提示,打开关于窗体看看,一切都是你的了!
11、接下来用UltraEdit修改脱壳文件里的机器码,注意!要把第7步中的修改还原,不然在系统下程序不能运行,我搞不明白,这也许是程序的保护措施之一吧。
12、补丁:因为加了壳,内存补丁打不上,程序的防调试设置在补丁制作程序装入源程序前就阻断了装入进程,现在才知道这招的厉害。而SMC技术我又不行,索性用PeCompact软件给打过补丁的脱壳程序再加个壳,程序小了许多(不到600KB),用它作补丁,覆盖源程序。运行,OK!
心得总结:
1、学破解要做好充分的思想准备,我就吃了准备不足的亏,没有先上论坛看看前辈的经验文章。
2、要有耐心和耐力。在此前的10天里,我都是在挣扎着想说服自己没有学习破解的天份,干脆放弃吧,可最终还是忍不住好奇心继续分析。这种感觉就象是在炼狱里煎熬一般。可最后关键的突破也就是在2个小时里完成的(其中一个小时是用来写这个帖)。这和软件工程一样,系统分析和可研才是重头,而代码的编写只是小节。
3、客观、冷静,不要把破解看得太神奇,也不要把成败看得太重,分析得累了就休息,换换脑,放个10天半月也无妨,没人会说你笨的,我就很笨,但笨并不可耻啊,我努力还不行吗?
4、学习资料要慎重选择,论坛中有不少精品帖子,作者都是本着认真负责的态度撰写文章,比如看雪、CCDebugger等,对于这些人,我深表敬意。他们提供的很多教程虽然称为入门,其实很了不起。《加密与解密》不可不备,我已经买来细细研读,很多读不懂也没关系,实践会解决的。
5、有很多所谓“高人”发的帖子真的是很烂,一上来二话不说就是大段汇编,故弄玄虚,先把人镇住,然后象先知一样在某几行代码旁指点着“跳,还是不跳”,搞得人一头雾水,就怕别人不拿他当“高人”看。最后仔细一看,我晕,这东西我也会解,而真正关键的东东,他也不懂。这样的帖,不看也罢,消费时间。要知道计算机科学是一门多门类学科交叉引入和应用的学科,在这里,没有人是全才,所以不必太过强求自己,一知半解也无妨,别急,慢慢来。
6、不要因为是P-code就犯难,中间代码毕竟比汇编高级,可读性也略强,而且不必全懂,关键还在于你对破解对象的了解程度。
7、与其把破解看成是与作者的一场较量,倒不如看成是一次思想的交流,应该怀着惺惺相惜的心情,互相尊重,共同进步,这也该算是破解之道的一部分吧。
8、用CrackMe这种的东东做教程效果不会太好,作者没有太多的功利驱动,所以加密的功夫就不会下得太大,而且针对性太强,学究气太浓,往往是为研究而研究,少了乐趣。实际应用中,保护手段往往是多种类型齐上阵,前面学了那么多,突然用不上,极易产生挫折感,积极性会受到打击。与其这样还不如直接拿难度适中的商用产品入手,首先心理就有所准备,遇到困难不至于太狼狈。其次,正因为对手强,所以我才会强,大家互相促进嘛。
  以上是我在破解之路上迈出第一步所经历的,愿与朋友们分享,贻笑大方也无所谓。