本帖最后由 Pnmker 于 2015-5-28 19:05 编辑
最近朋友给了一个五子棋的游戏让帮忙 破解,把悔棋需要注册码给破掉。因他说程序比较老,不能在现在的64位系统上运行,故而询问他得知是90年代的。一听到是这个年代,我一阵暗喜,想那个时候程序应该加壳的意识不强,即便有应该也不会多么强的壳,OD几下子应该就可以搞定了。 不过,没想到当程序拿到手之后OD加载运行直接提示不是有效的PE格式,无视继续调试时搜索字符串无论是ASCII还是UNICODE都无法搜出悔棋时提示的字符串。使用ResHacker查看资源也有类似的提示。如果是这样的话,,麻烦就有点大了,OD可能就无法进行破解了,因为C/C++方面我所熟悉的破解工具就只有OD而已。 后来,在家中经过多方面的工具查找验证原来这个五子棋程序是16位NE 格式的可执行程序。呵呵,这下我可大开了眼界,原来除了PE格式之外还有一种叫做New Executable格式的可执行程序,只好恶补了一下这方面的历史知识。不过这对破解帮助不大,我还是不知道该用什么工具去破解。 于是去论坛里问大牛,大牛们回复说用windbg、softice或者TRW2000。windbg和softice曾经安装感受过,当时是感觉它们都过于复杂了,现在更是心里一点怵怕的感觉。至于TRW2000则完全没有用过,我自信自己是一个接触新东西很快的人,对它就没有什么怕的。 大牛们说TRW2000 要在win9x 系统下使用,临时下系统装系统,(当然是在虚拟机环境下),经过验证win98 运行有点问题,win95 则完全正常! 好了,至此废话说了一大堆,主要是想把整个的破解过程写下来,也算是日后自己反悟的一个历程,当然同时也希望对各位痴迷于破解的道友有所帮助。下面正式进入破解话题。
首先,明确一下破解目标,就是把下图中的关于注册码的弹窗去掉,并能够正常实现悔棋。
第一步,当然是开TRW2000载入五子棋的程序,然后出现经典的TRW2000调试界面,如下:
果断下断点bpx messagebox,返回五子棋界面运行程序,结果并没有达到预期的弹窗出现时中断的效果。
2
看来,注册码提示窗口还不是经典的MessageBox 弹窗,那会是怎么弹出来的呢?这下我又蒙了,TRW2000 这是我第一次用,更深入的功能暂时不会,一时之下就不知道该如何是好了。这时我的第一个想法就是,如果能像IDA一样把程序整个反汇编出来该多好,静态分析是我最擅长的,说不定可以通过阅读汇编代码找到一个窍门。马上上网查找16 位程序的静态分析工具,呵呵,下面该W32DSM 出场了。 在W32DSM中打开五子棋程序,进行反汇编如下:
3
嗯,效果不错,反汇编的额外注释也比较丰富,读起来也比较轻松,大致浏览代码发现其中有几处出现call USER.DIALOGBOX :
好吧,就在此函数下断,马上在TRW2000中输入bpx dialogbox回车,运行程序进行悔棋,哈哈,成功中断!!!
然后,马上执行PMOUDLE命令返回五子棋模块WMAKE5所在的领空,发现紧接着call USER.DIALOGBOX下一条指令的偏移值IP位0BED。下面又轮到W32DSM出场了
切换到W32DSM,查找到偏移值为0BED的那一条指令,然后仔细阅读这条指令前后的代码可以得出以下结论:
切换回TRW2000,在0C25、0C3E、0C55、0DEE、0E59处下断:
切换到五子棋程序,进行悔棋操作,哈哈,程序又成功中断在了0DEE处,这下就可以找到程序判断注册码是否有效的代码段了!
再切换到W32DASM中转到0DEE处,仔细阅读前后的代码,可知偏移0DD6处的je 0DEA 代码即是跳转到弹出注册码无效提示执行的关键指令,只要修改此处不进行跳转即可!
现在,关键指令行已经找到,现在只要对其进行修改就OK了,W32DASM的强大之处就在于此,它不仅可以静态反汇编,也可以调试32位程序(可惜的是不支持16位),而且还可以对指令进行修改! 由于je0DEA指令对应的机器码为2字节,因此只需要两个nop即可,但对应16位的nop我不确定,而且恰好其上一行的指令or ax,ax也是2字节又不影响后续指令的执行,因此暂时就用or ax,ax来替换je 0DEA吧。
替换为之后点击“应用”就大功告成了!用W32DASM打开应用之后生成的破解后的程序Wmake5_bak.exe,转到0DD6处查看,嗯,修改成功!去运行程序操作一下看吧,哈哈,悔棋再也没有那个讨厌的弹窗了,而且也可以正常悔棋了!!!!
欢迎大家拍砖!
五子棋程序下载链接: http://pan.baidu.com/s/1qWysrcK 密码: p9p5 |