金盘电子阅览室管理系统.docx
《金盘电子阅览室管理系统.docx》由会员分享,可在线阅读,更多相关《金盘电子阅览室管理系统.docx(20页珍藏版)》请在冰点文库上搜索。
金盘电子阅览室管理系统
金盘电子阅览室管理系统破解流程+算法分析
金盘电子阅览室管理系统破解流程
作者:
笨虫虫
软件名称:
金盘电子阅览室管理系统
整理日期:
2006-12-3
最新版本:
V7.0
文件大小:
软件授权:
共享软件
使用平台:
win2000+SQL
发布公司:
荣天信息
第一节 查壳和脱壳
一、认识壳
在脱壳之前,我们得明白“壳”的概念。
在自然界中,我想大家对壳这东西应该都不会陌生了,植物用它来保护种子,动物用它来保护身体等等。
同样,在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。
它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。
就像动植物的壳一般都是在身体外面一样理所当然(但后来也出现了所谓的“壳中带籽”的壳)。
由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,大家就把这样的程序称为壳了[1]。
就像计算机病毒和自然界的病毒一样,其实都是命名上的方法罢了。
二、查壳
我们首先用PEID工具软件来查看,该软件的Gders.exe主程序有没有加载壳。
图3.1 PEID查壳
PEID显示该主程序加壳ASPack2.11->AlexeySolodovnikov的壳。
(如图3.1)
ASPack是一款压缩壳,不是加密壳,相当于WinRar、Winzip之类的压缩软件,但不同于WinRar、Winzip工具,他只能压缩EXE、和DLL文件。
而且在使用EXE时,不需要再用工具解压,他会在内存中自动解压自动使用文件。
所以脱掉这些壳,不需要很花功夫。
三、ESP定律
如果我们要返回父程序,则当我们在堆栈中进行堆栈的操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入栈中的地址。
这也就是著名的“堆栈平衡”原理。
ESP定律的原理就是“堆栈平衡”原理[2]。
我们可以把壳假设为一个子程序,当壳把代码解压前和解压后,他必须要做的是遵循堆栈平衡的原理,让ESP执行到OEP的时候,使ESP=0012FFC4。
它可以使用在大部分的压缩壳,部分加密壳。
只要是在JMP到OEP后,ESP=0012FFC4的壳,理论上我们都可以使用。
是不是只能下断12FFA4的访问断点?
那只是ESP定律的一个体现,我们运用的是ESP定律的原理,而不应该是他的具体数值,不能说12FFA4,或者12FFC0就是ESP定律,他们只是ESP定律的一个应用罢了。
四、脱壳
既然知道软件加的壳是ASPack2.11压缩壳,那么我们就可以用ESP定律[3]来快速的脱掉这个壳了。
首先,用OD来加载主程序Gders.exe,加载好后我们选按F8运行一步,看到ESP的值是0012FFA4(图3.2)
图3.2 ESP的值
我们在命令行里打入DD0012FFA4,我们在数据窗口在地址0012ffa4上右键菜单上选择断点,选择设置硬件断点访问,再选择Word来设置硬件一个断点。
(如图3.3)
图3.3 设置硬件断点
我们按F9运行程序。
然后调试器会将程序自动停下到我们设置的硬件断点地址006803AB(如图3.4)
图3.4 硬件断点位置
按着我们按几下F8,让调试器运行程序到Retn后返回程序的领空,(如图3.5)
图3.5 返回程序领空
地址0058F36C就是该程序的真正入口点了,我们使用OD的OllyDump来把程序Dump出来。
在0058F36C使用右键菜单我们选择OllyDump脱壳调试进程。
把入口点修正改为18F36C,(如图3.6)
图3.6 修正程序OPE
然后点脱壳按钮,选择一个文件名,我填的是UnPack。
让软件自动保存后,Unpack.exe就是Gders.exe脱壳后的文件了。
我们再用PEID检查一下是不是已经脱壳了(如图3.7)所示。
图3.7 PEID查壳
PEid显示该程序是由BorlandDelphi6.0-7.0编写的,这说明我们已经把程序的外壳给去掉了。
第二节 找出注册码的算法
一、API
因为在破解软件的过程用,经常要使用到API的调用,所以我们必须要了解到API是什么。
Win32程序是构筑在Win32API基础上的[4]。
在Win32API中,包括了大量的的函数、结构和消息等,它不公为应用程序所调用,也是Windows自身的一部分,Windows自身的运行也调用这些API函数。
二、寻找算法的详细过程
脱完壳后,我们首先要找找看该软件有什么好的提示我们怎么破解该程序的提示。
我们运行程序来到执行它的注册码模块(如图3.8):
图3.8 程序的注册框
我们也不是知道产品序列号是多少,我们先随便填一个注册码。
我们填一个123456789看看软件有什么提示。
点注册后,系统提示我们要重启起程序检查是否注册成功(如图3.9):
图3.9 注册后的提示
既然有提示窗口出现,我们首先可以试试API函数MessageBox下断点[5],看能不能让程序断下来。
用OD加载脱壳程序Unpack.exe,在OD的命令行窗口输入bpMessageBoxA,然后按F9,OD运行程序,在产品序号输入123456789,点注册按钮。
OK程序在MessageBox函数上断下来了,我们看到堆栈窗口,上面显示,MessageBoxA来自Unpack.00580617,这说明该程序在00580617地址调用了MessageBoxA函数。
(如图3.10)
图3.10 程序调用MeesagBoxA
按Ctrl+G,我们在OD的输入需要的跟随表达语句窗口输入地址00580617(如图3.11)。
图3.11 OD的输入需要的跟随表达语句窗口
调式器就返回到程序的领空了。
(如图3.12)
图3.12 返回程序领空
MessageBoxA是已经执行完成的语句提示,所以我们得看向上看代码,看有什么可以利用的信息。
以下是金盘电子阅览室管理系统注册按钮代码:
***************************************************************************
00580490 . 55 pushebp
00580491 . 8BEC movebp,esp
00580493 . 33C9 xorecx,ecx
00580495 . 51 pushecx
00580496 . 51 pushecx
00580497 . 51 pushecx
00580498 . 51 pushecx
00580499 . 51 pushecx
0058049A . 53 pushebx
0058049B . 56 pushesi
0058049C . 57 pushedi
0058049D . 8945FC movdwordptrss:
[ebp-4],eax
005804A0 . 33C0 xoreax,eax
005804A2 . 55 pushebp
005804A3 . 6843065800 pushUnpack.00580643
005804A8 . 64:
FF30 pushdwordptrfs:
[eax]
005804AB . 64:
8920 movdwordptrfs:
[eax],esp
005804AE . 33C0 xoreax,eax
005804B0 . 55 pushebp
005804B1 . 68DF045800 pushUnpack.005804DF
005804B6 . 64:
FF30 pushdwordptrfs:
[eax]
005804B9 . 64:
8920 movdwordptrfs:
[eax],esp
005804BC . 8D55F8 leaedx,dwordptrss:
[ebp-8]
005804BF . 8B45FC moveax,dwordptrss:
[ebp-4]
005804C2 . 8B8010030000 moveax,dwordptrds:
[eax+310]
005804C8 . E8FB28EDFF callUnpack.00452DC8
005804CD . 8B45F8 moveax,dwordptrss:
[ebp-8]
005804D0 . E81793E8FF callUnpack.004097EC
005804D5 . 33C0 xoreax,eax
005804D7 . 5A popedx
005804D8 . 59 popecx
005804D9 . 59 popecx
005804DA . 64:
8910 movdwordptrfs:
[eax],edx
005804DD . EB1B jmpshortUnpack.005804FA
005804DF .^E9E43BE8FF jmpUnpack.004040C8
005804E4 . 8B45FC moveax,dwordptrss:
[ebp-4]
005804E7 . 8B8010030000 moveax,dwordptrds:
[eax+310]
005804ED . 8B10 movedx,dwordptrds:
[eax]
005804EF . FF92C0000000 calldwordptrds:
[edx+C0]
005804F5 . E8FA3FE8FF callUnpack.004044F4
005804FA > 8D55F4 leaedx,dwordptrss:
[ebp-C]
005804FD . 8B45FC moveax,dwordptrss:
[ebp-4]
00580500 . 8B8010030000 moveax,dwordptrds:
[eax+310]
00580506 . E8BD28EDFF callUnpack.00452DC8
0058050B . 8B45F4 moveax,dwordptrss:
[ebp-C]
0058050E . E8D992E8FF callUnpack.004097EC
00580513 . 3DFFFF0000 cmpeax,0FFFF
00580518 . 7E30 jleshortUnpack.0058054A
0058051A . 6A10 push10
0058051C . 6854065800 pushUnpack.00580654
00580521 . 685C065800 pushUnpack.0058065C
00580526 . 8B45FC moveax,dwordptrss:
[ebp-4]
00580529 . E8CA91EDFF callUnpack.004596F8
0058052E . 50 pusheax ;|hOwner
0058052F . E85078E8FF call ;\MessageBoxA
00580534 . 8B45FC moveax,dwordptrss:
[ebp-4]
00580537 . 8B8010030000 moveax,dwordptrds:
[eax+310]
0058053D . 8B10 movedx,dwordptrds:
[eax]
0058053F . FF92C0000000 calldwordptrds:
[edx+C0]
00580545 . E9DE000000 jmpUnpack.00580628
0058054A > 8D55F0 leaedx,dwordptrss:
[ebp-10]
0058054D . 8B45FC moveax,dwordptrss:
[ebp-4]
00580550 . 8B8010030000 moveax,dwordptrds:
[eax+310]
00580556 . E86D28EDFF callUnpack.00452DC8
0058055B . 8B45F0 moveax,dwordptrss:
[ebp-10]
0058055E . E88992E8FF callUnpack.004097EC
00580563 . 8B15F8365900 movedx,dwordptrds:
[5936F8] ; Unpack.005954FC
00580569 . 8902 movdwordptrds:
[edx],eax
0058056B . 8D55EC leaedx,dwordptrss:
[ebp-14]
0058056E . 8B45FC moveax,dwordptrss:
[ebp-4]
00580571 . 8B80FC020000 moveax,dwordptrds:
[eax+2FC]
00580577 . E84C28EDFF callUnpack.00452DC8
0058057C . 8B55EC movedx,dwordptrss:
[ebp-14]
0058057F . A19C3A5900 moveax,dwordptrds:
[593A9C]
00580584 . E88345E8FF callUnpack.00404B0C
00580589 . A1D03E5900 moveax,dwordptrds:
[593ED0]
0058058E . 8B00 moveax,dwordptrds:
[eax]
00580590 . 33C9 xorecx,ecx
00580592 . BA80065800 movedx,Unpack.00580680 // ASCII"\SOFTWARE\GoldSoft\Server"
00580597 . E80C4FEFFF callUnpack.004754A8
0058059C . 84C0 testal,al
0058059E . 7456 jeshortUnpack.005805F6
005805A0 . 8B45FC moveax,dwordptrss:
[ebp-4]
005805A3 . 8B8018030000 moveax,dwordptrds:
[eax+318]
005805A9 . 8B10 movedx,dwordptrds:
[eax]
005805AB . FF92C8000000 calldwordptrds:
[edx+C8]
005805B1 . 8BC8 movecx,eax
005805B3 . A1D03E5900 moveax,dwordptrds:
[593ED0]
005805B8 . 8B00 moveax,dwordptrds:
[eax]
005805BA . BAA4065800 movedx,Unpack.005806A4 // ASCII"VersionFlag"
005805BF . E87051EFFF callUnpack.00475734
005805C4 . 8B0DF8365900 movecx,dwordptrds:
[5936F8] // Unpack.005954FC
005805CA . 8B09 movecx,dwordptrds:
[ecx]
005805CC . A1D03E5900 moveax,dwordptrds:
[593ED0]
005805D1 . 8B00 moveax,dwordptrds:
[eax]
005805D3 . BAB8065800 movedx,Unpack.005806B8 // ASCII"MaxUsers"
005805D8 . E85751EFFF callUnpack.00475734
005805DD . 8B0D9C3A5900 movecx,dwordptrds:
[593A9C] // Unpack.005954F8
005805E3 . 8B09 movecx,dwordptrds:
[ecx]
005805E5 . A1D03E5900 moveax,dwordptrds:
[593ED0]
005805EA . 8B00 moveax,dwordptrds:
[eax]
005805EC . BACC065800 movedx,Unpack.005806CC // ASCII"YourSerial"
005805F1 . E86E50EFFF callUnpack.00475664
005805F6 > A1D03E5900 moveax,dwordptrds:
[593ED0]
005805FB . 8B00 moveax,dwordptrds:
[eax]
005805FD . E8124EEFFF callUnpack.00475414
00580602 . 6A40 push40
00580604 . 68D8065800 pushUnpack.005806D8
00580609 . 68E0065800 pushUnpack.005806E0
0058060E . 8B45FC moveax,dwordptrss:
[ebp-4]
00580611 . E8E290EDFF callUnpack.004596F8
00580616 . 50 pusheax //|hOwner
00580617 . E86877E8FF call //\MessageBoxA
*************************************************************************
一般软件注册后要重启验证,注册码一般保存在注册表,或一个专门的文件里,以上代码已经提示我们,这个软件的注册码是保存在注册表的。
为什么呢,很简单,我们先看到代码的这个地方:
00580592 BA80065800movedx,Unpack.00580680//ASCII"\SOFTWARE\GoldSoft\Server"上面的注释很清楚的说明,注册码存放在\SOFTWARE\GoldSoft\Server里。
再看这段代码005805D3.BAB8065800 movedx,Unpack.005806B8//ASCII"MaxUsers"这段是存放最大用户数有多少。
然后再看这段代码005805ECBACC065800movedx,Unpack.005806CC//ASCII"YourSerial"而这段存放注册码。
我们打开一下注册码表来验证一下我们判断是不是正确的,打开注册表找到\SOFTWARE\GoldSoft\Server,里看到YourSerial的值就是123456789。
(如图3.13)
图3.13 注册表存放注册码的位置
既然他重启要验证注册码,那启动程序肯定要调用YourSerial字符串值。
所以我们用OD的Ultar字符串参考插件,来查找YourSerial字符串,看能不能找出有用的相关信息。
在OD的插件菜单里我们选择Ultar字符串参考的查找ASCII,然后按Ctrl+F键,输入YourSerial。
我们一共找出005805EC、005860B7、00586125、0058642E、0058645C五个地址,我们在这个5个地址全部按F2下断点。
看程序在验证注册码时调用的是地址。
因为程序要重启验证,我们下完断点后,给OD重新加载程序运行。
调试器会在0058642E BADC9D5800 movedx,Unpack.00589DDC //ASCII"YourSerial"停下,我们在信息窗口上面看到:
00589DDC=Unpack.00589DDC(ASCII"YourSerial")
edx=00B92538,(ASC