标题:联众保皇记牌器 3.10 破解流程(微软API加密)
作者:oHuangKeo
目的:技术交流,无心针对性破解。
程序:联众保皇记牌器 3.10
备注:游戏是用来娱乐的,消磨无聊时光的。不应日夜抱着当老婆。
建议:在破解程序时可以打开TTPlayer听听音乐。
1.查壳
用PEid查壳得之为“ASPack 2.12 -> Alexey Solodovnikov”。不管什么壳,尽量手脱。
2.手脱壳
用OD加载,代码如下:
004B1001 > 60 pushad
004B1002 E8 03000000 call LZBH.004B100A
004B1007 - E9 EB045D45 jmp 45A814F7
004B100C 55 push ebp ; LZBH.004B1008
004B100D C3 retn
一开始就有两组花指令,然后是得到重定位基值。我也懒得去花了,只是一般性的壳,自己小心点就好了。一路按F7。当按了14次F7时,来到这里:
004B102F /0F85 65030000 jnz LZBH.004B139A
在这里按回车(为什么要这样做?因为这里是个大跳,去看看后面要做些什么。),将来到:
004B139A B8 E0760500 mov eax, 576E0
向下看看都有些什么东西。哇,有两个"retn".不得了,以脱过几次壳的经验,这里很可能就会去OEP啦。在第二个"retn"下断,然后F9运行程序。
好,程序断在刚才下断这里:004B13BF retn。看上面是什么?刚才明明是"push 0",现在变成"push 4576E0"了。这里过去就是OEP了。F7跟进,就在这里脱壳啦。怎么脱我就不细说了。
3.试着运行一下程序,诶,可以运行。只是会出现一个错误窗口。好,只要能运行就行了,能用于破解就够了。
程序运行后有个软件注册窗口,上面清楚地告诉我们,要想破解,得在C盘建立一个Key文件,文件验证为Key方法验证。(这里向作者道个谢,少了不少的麻烦。而且还告诉我们不是启动式校验。)
4.打开Filemon,重新运行程序。哦,原来是"LZBH.key".好了,没有我就新建个,内容先随便填填。
5.用OD加载脱后的程序(注意:加载时要把以前运行的程序关了,因为程序只能运行一个)。下断,断下这些东西:ReadFile,SetFilePointer. CreateFileA就不用断了,没什么意义。按F9运行。唉呀,OD怎么跑了。原来程序有反调试。别怕,来个狠方法:动态附加。
6.运行原版程序,等到注册框出现时,有OD附加。进入程序的代码空间。然后照上面的方法下断。然后F9程序继续运行。点注册,被OD断下了,断在ReadFile处,看看堆栈,读0个字节,没用,继续F9.断在SetFilePointer了,定位到文件首,没用,F9继续。。。。就这样小心按F9,OD断到又断到ReadFile了,要读0x64大小的内容(我那个Key文件就是这么大。)好,这里回去,后面应该就是判断注册码了。Alt+F9,运行到用户代码区。
来到这里:
00408819 85C0 test eax, eax
然后一路按F8,小心每一个比较和条件跳转。一路上都没有什么,最后来到
00416D32 E8 F1C8FEFF call LZBH.00403628
00416D37 C3 retn
,后面就是retn返回了,这里这个CALL很关键,F7进去。进去后又是这个Call,再进去。(最怕这种一层一层进去CAll了,到后来不知道哪里是哪里了。)这下惨了,进去后,后面有4个CAll,怎么办?不会一个一个F7进去看吧。不急,先去每个Call看看,里面都有些什么。好像都没做什么。那就一路F8吧,反正如果失败了,可以再来。
当来到这里时要小心了:
0045524E 8D45 F8 lea eax, dword ptr ss:[ebp-8]
00455251 50 push eax
00455252 6A 00 push 0
00455254 6A 00 push 0
00455256 68 03800000 push 8003
0045525B 8B45 F0 mov eax, dword ptr ss:[ebp-10]
0045525E 50 push eax
0045525F E8 D4F6FFFF call LZBH.00454938 ; jmp to advapi32.CryptCreateHash
CryptCreateHash----这个好像是一个API函数嘛。(费话!)这个微软的加密解密API嘛,怎么用我就不清楚了,没用过。
此时心里怕怕了,这玩意没搞过,怎么办?怎么办?又一想,再怎么它也要比较吧,不然怎么知道注册码是否正确。再说了,这是Delphi写的程序,一般来说不会做些汇编级的手脚。
那就向下看嘛,找比较。不远的地址就发现一个,而且只有一个:
004552C3 83F8 01 cmp eax, 1
004552C6 1BC0 sbb eax, eax
004552C8 40 inc eax
004552C9 8845 FF mov byte ptr ss:[ebp-1], al
004552CC 33C0 xor eax, eax
分析一下:上面一个API返回的eax和1比较,应该是True或False比较了。
后面又把al传给[ebp-1],这应该是这个局部变量吧。好,那就在004552C3处下断,看看这里的eax是0还是1.
断点后运行,在004552C3处断下了。看看eax。!!!果然,是0,为什么?因为注册码是错的,当然是False了。现在把eax改成1.然后F9运行。(这一步只是先碰个运气。)
运行后,那个注册框不见了。再从右下角调出注册框,哈哈,最喜欢的几个字“软件已注册”。
到这里已经知道如何破解这个软件了,属暴破。我没有安装联众的注册,不知道是否完全OK了,我想应该没问题了。
不可能每次用都要这种用OD破解吧。修改程序行吗?行,但刚才已经知道脱壳后的已经有些问题了,不太好。只有做个内存注册器比较好。
以后有时间了再分析一下这个注册算法吧。
小弟献丑了!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课