破解FlashExtractor.exe

说到破解软件,恐怕我从4,5年前就开始接触了,那个时代还是trw,softice等盛行的时代。记得当时简单的爆破了一款破解LINUX登录密码的软件(LC4),不过就是用OD跳来跳去找到了一个关键跳转然后再用反汇编软件找到该位置进行了语句的更改就完成了破解,当时还想把那文章发表到网友世界上晒晒(当时经常看的杂志)。现在看来当时还真是有些幼稚弱啊~~连汇编语言都不懂的情况下竟然也蒙到了这关键的跳转。

经过了这么长的时间虽然也在逐渐了解这方面内容,但也一直是含蓄点冰,未能深入了解。在大学3年纪借着做一个软件加壳项目的机会,有了一个突飞猛进的学习机会。这里顺带总结一下鄙人的学习旅程好了。这个项目主要是做一个壳,以前还没怎么脱过壳,现在居然要写壳了,多少有些措手不及。于是我从最基本的PE文件结构开始了解,写了个简单的PE文件格式读取程序,接下来为了能尽快进入shell部分的编写,加上对32位汇编并不是很熟悉(课程里仅学习过16位的)。因此我用BamBam这个VC++写成的壳来加以修改。很快我了解到了壳代码仅仅是作为字串形式写入被加壳的文件以及如何在VC环境下完成代码的汇编以及代码的注入。这样剩下的工作就很简单了,创建一个新的区段供我的壳代码使用,添加各种ANTI功能的汇编代码到shell.asm中就可以了。当然入口点要开到我的区段位置。外层是原来BAMBAM的压缩壳。api的调用机理,内部构造,与动态链接库的关系,以及很多系统的知识也都是在这个过程中了解到的。这方面的内容以后我会单独写一篇文章来介绍,这里就当做是预告吧。想到什么就写了什么,估计文字看来会有些混乱~~

好了,闲话说了不少正式开始破文。该软件主要是用来提取Flash里的图片音频资源,当年我编写的一个坦克大战游戏用到的声音就是从一个Flash游戏里提取出来的。可惜这个软件只能使用10次。虽然也不怎么常用,但今天刚好有空就拿起来进行了一下调试。软件注册后提示重新运行软件来检测注册码,这样的话,注册码多半是存在了注册表中,下一次运行软件时会读取该注册码和用户名来运算验证。我以前也尝试过类似方式的软件的破解(比如winavi,估计转视频的都用过,虽然网上公布有他的注册码),但由于其算法很复杂实在跟不下去了,就放弃了。

找到注册码验证的位置就比较关键了,可以再regopen类似的api上下断点,不过我并没有这样。首先我用regmon进行注册表监视,excluded无关的操作,再运行一次注册过程。然后将regmon的记录进行include。接下来就用olldbg来加载该软件吧,并没有壳。方便了很多,也没有加入各种Anti,用delphi编写的(peid的结果)。载入后,显然是软件开始的引导部分包含了大概10个call吧,以前调过MFC的程序好像也是类似的结构,这样的过我就F8过每一个call同时观察REGMON的结果,直到我发现过某个CALL时,REGMON有反应,重新载入程序,然后F7该call就行了,当然进去以后还是很多call,用类似的方法逐层深入。最终到达一个界面下,可以看到OLLDBG有相关ASCII提示,看到注册表项,估计到了注册表的读取了。等到注册表读取完毕后,下面的call可以F7进去看看,发现了一些比较短小的CALL估计是字符串求长度,移动等操作用的也没细分析。接下来到了某一个CALL中了,发现有明显的循环处理。估计到了注册码的验证了。程序首先用“wanghouli”这个字符串对用户名一位一位异或操作(仅对低四位),高四位不变。跳出后,又进入一个函数和注册码4位4位进行比较,判断是否相同,当然其中涉及到很多长度的考虑,很复杂,越分析越复杂。

最后看了大概的验证过程,就选

wanghouli 作为用户名
p````p`` 作为注册码

直接运行就通过了,当时那叫一个激动啊,第一次分成功整出了一个注册码。虽然crackme玩过一些,但真正对一个实用的软件进行注册码级别的破解还真是头一次,这里记录一下。