打印本文 打印本文  关闭窗口 关闭窗口  
EBOOK文章类软件的破解
作者:陈鹏  文章来源:eNet  点击数  更新时间:2009/9/11 19:28:06  文章录入:陈鹏  责任编辑:陈鹏

一、简介

【郑重声明】:本文只为技术而破解,纯属技术交流, 请勿用于非法用途。
【软件名称】:国产的东东,就不说了
【下载页面】:http://www1.skycn.com/soft/20059.html
【软件简介】:EBOOK小说系列
【调试环境】:WinXP SP2、ODbyDYK、regedit、HIEW7.10、PEID0.93
【软件限制】:共享软件,10次使用限制,无功能限制

二、破解过程

1、查找OEP,脱壳
用PEID0.93查看主程序,壳为UPX壳,UPX 0.89.6 - 1.02 / 1.05 - 1.24 (Delphi) stub -> Markus & Laszlo [Overlay]

用ODbyDYK载入后如下:

004C9A40 60 pushad
004C9A41 BE 0050480>mov esi,古龙.00485000
004C9A46 8DBE 00C0F>lea edi,dword ptr ds:[esi+FFF7C000]
004C9A4C C787 9CC00>mov dword ptr ds:[edi+9C09C],B6128192
004C9A56 57 push edi
004C9A57 83CD FF or ebp,FFFFFFFF
004C9A5A EB 0E jmp short 古龙.004C9A6A
.........
.........
004C9BA4 FF96 14B30> call dword ptr ds:[esi+CB314]
004C9BAA 61 popad
004C9BAB ^ E9 AC30FDFF jmp 古龙.0049CC5C ;跳转到OEP
004C9BB0 C8 9B4C00 enter 4C9B,0
004C9BB4 D89B 4C009CD0 fcomp dword ptr ds:[ebx+D09C004C]
004C9BBA 49 dec ecx
004C9BBB 0000 add byte ptr ds:[eax],al
004C9BBD 0000 add byte ptr ds:[eax],al
004C9BBF 0000 add byte ptr ds:[eax],al
004C9BC1 0000 add byte ptr ds:[eax],al
004C9BC3 0000 add byte ptr ds:[eax],al
004C9BC5 0000 add byte ptr ds:[eax],al
004C9BC7 0000 add byte ptr ds:[eax],al
004C9BC9 0000 add byte ptr ds:[eax],al

标准的UPX壳,PUAHAD 和 POPAD对应,所以上面的4C9BAB处就是跳转到OEP处执行,很简单的以为LOADPE脱壳,RecImport160修复就可以运行。脱壳后才发现程序挂接的数据段已经不见了,23M大小的程序变成了800多K,而且程序不能正常运行了。
(用PEID的UPX UPACKER插件也很容易脱壳,但脱壳后效果跟上面一样)

2、研究注册方法

程序的注册,是利用机器号的方法,而且看来EBOOK为了防止写出注册机,在算法上也是下了很大功夫,并不是很容易就跟踪出来的。查找漏洞吧,软件既然给了50次的试用机会,那就一定有机可乘了:)!
研究程序目录并没有什么INI之类的软件,估计使用信息是在注册表里。动态反编译软件,发现一个注册表串\Software\eBook Edit Pro,HOHO,REGEIDT打开注册表一看,在LOGIN里有2个键值SD和SO,最可疑的就是SO键值,后来研究表明,SD中写着失效标志,SO中是使用的次数。中断程序中所有标记为SO的代码,GO,截获后得到EBOOK读写SO的代码段如下:

00498C6C 8BCE mov ecx,esi ;此处ECX为使用次数
00498C6E BA D48C4900 mov edx,古龙.00498CD4 ; ASCII "SO"
00498C73 8B45 FC mov eax,dword ptr ss:[ebp-4]
00498C76 E8 01D7F9FF call 古龙.0043637C
00498C7B 33C0 xor eax,eax


中断上面498C6C处就能发现,ECX中的数字,就是注册表中已经使用次数+1,所以在执行call 0043637C之前,修改程序,使ECX中的次数少于50次,不就可以了!这就需要修改代码里的ECX数值。
但问题又出来了,程序脱壳后就无法正常执行,又不知道如何来修复壳中数据段,如何才能修改这里的ECX呢?所以只好引入动态PATCH了。

3、UPX壳的PATCH

UPX壳的OEP简单明了,从上面1中也能看出,执行到OEP前的所有代码都是很明了的,所以不需要我们学大虾们PATCH猛壳那样DUMP一次内存了。当程序运行到CS:004C9BAA 的时候,所有的代码已经完成解压缩,全部恢复到内存中去了,我们选择在这个时候PATCH我们的代码,就是修改CS:00498C76
本来想给程序加一个SECTION,然后加入我们的PATCH代码的,后来发现CS:004CC4A0 的下面恰好有很大的一段代码段是空闲的,刚好能放下我们的PATCH代码,HOHO,又便宜我们了,还犹豫什么,GOGOGO!

用HIEW7.10改写的代码如下:

004C9BAA 61 popad
004C9BAB - E9 FE280000 jmp 古龙.004CC4AE ;不去执行OEP,而是执行我们的PATCH代码
004C9BB0 C8 9B4C00 enter 4C9B,0
004C9BB4 D89B 4C009CD0 fcomp dword ptr ds:[ebx+D09C004C]
004C9BBA 49 dec ecx
004C9BBB 0000 add byte ptr ds:[eax],al
004C9BBD 0000 add byte ptr ds:[eax],al
004C9BBF 0000 add byte ptr ds:[eax],al


PATCH代码:
004CC4AE 60 pushad ;PATCH开始,保护现场
004CC4AF BE C8C44C00 mov esi,古龙.004CC4C8 ;改编后的指令代码
004CC4B4 BF 768C4900 mov edi,古龙.00498C76 ;PATCH的目标代码
004CC4B9 B9 05000000 mov ecx,5 ; 5字节指令
004CC4BE F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[esi]
004CC4C0 61 popad ;PATCH结束,恢复现场
004CC4C1 - E9 9607FDFF jmp 古龙.0049CC5C ;去执行OEP,大功告成
004CC4C6 0000 add byte ptr ds:[eax],al
004CC4C8 E975380300 ;修补后,CS:498C76处就变成了 jmp 004CC4F0


004CC4EA 0000 add byte ptr ds:[eax],al
004CC4EC 0000 add byte ptr ds:[eax],al
004CC4EE 0000 add byte ptr ds:[eax],al
004CC4F0 B9 01000000 mov ecx,1 ;在让ECX变成1
004CC4F5 E8 829EF6FF call 古龙.0043637C ;执行被改为跳转的代码部分
004CC4FA - E9 7CC7FCFF jmp 古龙.00498C7B ;返回程序原地点继续执行
004CC4FF 90 nop


怎么样?把修改保存,然后运行一下看看吧,HOHO,不错吧?

三、总结
EBOOK的保护方式,就是注册表键\Software\eBook Edit Pro、Login下面的SD和SO,SD中记录了失效标志,而SO中是使用次数。只要删除这个根键,EBOOK打开书籍时候又认为第一次打开了。
看来内存PATCH也是很不错的方法,而EBOOK本身,个人认为,虽然在算法和防DUMP上用了很多功夫(也可能是我这种菜鸟私家感觉:)),但小小的注册表,却是致命伤。


谢谢你看到这里,就当是PATCH壳的一个小过程了,也许能给一些人CRACKER EBOOK类的开一个思路。如转载请保持信息的完整性,谢谢。
打印本文 打印本文  关闭窗口 关闭窗口