金盘电子阅览室管理系统Word文档下载推荐.docx
《金盘电子阅览室管理系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《金盘电子阅览室管理系统Word文档下载推荐.docx(20页珍藏版)》请在冰点文库上搜索。
![金盘电子阅览室管理系统Word文档下载推荐.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/218a59a4-fe35-4c81-a6ce-564b41fbf380/218a59a4-fe35-4c81-a6ce-564b41fbf3801.gif)
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
00580497
00580498
00580499
0058049A
53
pushebx
0058049B
56
pushesi
0058049C
57
pushedi
0058049D
8945FC
movdwordptrss:
[ebp-4],eax
005804A0
33C0
xoreax,eax
005804A2
005804A3
6843065800
pushUnpack.00580643
005804A8
64:
FF30
pushdwordptrfs:
[eax]
005804AB
8920
movdwordptrfs:
[eax],esp
005804AE
005804B0
005804B1
68DF045800
pushUnpack.005804DF
005804B6
005804B9
005804BC
8D55F8
leaedx,dwordptrss:
[ebp-8]
005804BF
8B45FC
moveax,dwordptrss:
[ebp-4]
005804C2
8B8010030000
moveax,dwordptrds:
[eax+310]
005804C8
E8FB28EDFF
callUnpack.00452DC8
005804CD
8B45F8
005804D0
E81793E8FF
callUnpack.004097EC
005804D5
005804D7
5A
popedx
005804D8
59
popecx
005804D9
005804DA
8910
[eax],edx
005804DD
EB1B
jmpshortUnpack.005804FA
005804DF
.^E9E43BE8FF
jmpUnpack.004040C8
005804E4
005804E7
005804ED
8B10
movedx,dwordptrds:
005804EF
FF92C0000000
calldwordptrds:
[edx+C0]
005804F5
E8FA3FE8FF
callUnpack.004044F4
005804FA
>
8D55F4
[ebp-C]
005804FD
00580500
00580506
E8BD28EDFF
0058050B
8B45F4
0058050E
E8D992E8FF
00580513
3DFFFF0000
cmpeax,0FFFF
00580518
7E30
jleshortUnpack.0058054A
0058051A
6A10
push10
0058051C
6854065800
pushUnpack.00580654
00580521
685C065800
pushUnpack.0058065C
00580526
00580529
E8CA91EDFF
callUnpack.004596F8
0058052E
50
pusheax
;
|hOwner
0058052F
E85078E8FF
call<
jmp.&
user32.MessageBoxA>
;
\MessageBoxA
00580534
00580537
0058053D
0058053F
00580545
E9DE000000
jmpUnpack.00580628
0058054A
8D55F0
[ebp-10]
0058054D
00580550
00580556
E86D28EDFF
0058055B
8B45F0
0058055E
E88992E8FF
00580563
8B15F8365900
[5936F8]
Unpack.005954FC
00580569
8902
movdwordptrds:
[edx],eax
0058056B
8D55EC
[ebp-14]
0058056E
00580571
8B80FC020000
[eax+2FC]
00580577
E84C28EDFF
0058057C
8B55EC
movedx,dwordptrss:
0058057F
A19C3A5900
moveax,dwordptrds:
[593A9C]
00580584
E88345E8FF
callUnpack.00404B0C
00580589
A1D03E5900
[593ED0]
0058058E
8B00
00580590
00580592
BA80065800
movedx,Unpack.00580680
//
ASCII"
\SOFTWARE\GoldSoft\Server"
00580597
E80C4FEFFF
callUnpack.004754A8
0058059C
84C0
testal,al
0058059E
7456
jeshortUnpack.005805F6
005805A0
005805A3
8B8018030000
[eax+318]
005805A9
005805AB
FF92C8000000
[edx+C8]
005805B1
8BC8
movecx,eax
005805B3
005805B8
005805BA
BAA4065800
movedx,Unpack.005806A4
VersionFlag"
005805BF
E87051EFFF
callUnpack.00475734
005805C4
8B0DF8365900
movecx,dwordptrds:
005805CA
8B09
[ecx]
005805CC
005805D1
005805D3
BAB8065800
movedx,Unpack.005806B8
MaxUsers"
005805D8
E85751EFFF
005805DD
8B0D9C3A5900
[593A9C]
Unpack.005954F8
005805E3
005805E5
005805EA
005805EC
BACC065800
movedx,Unpack.005806CC
YourSerial"
005805F1
E86E50EFFF
callUnpack.00475664
005805F6
005805FB
005805FD
E8124EEFFF
callUnpack.00475414
00580602
6A40
push40
00580604
68D8065800
pushUnpack.005806D8
00580609
68E0065800
pushUnpack.005806E0
0058060E
00580611
E8E290EDFF
00580616
//|hOwner
00580617
E86877E8FF
//\MessageBoxA
*************************************************************************
一般软件注册后要重启验证,注册码一般保存在注册表,或一个专门的文件里,以上代码已经提示我们,这个软件的注册码是保存在注册表的。
为什么呢,很简单,我们先看到代码的这个地方:
00580592 BA80065800movedx,Unpack.00580680//ASCII"
上面的注释很清楚的说明,注册码存放在\SOFTWARE\GoldSoft\Server里。
再看这段代码005805D3.BAB8065800 movedx,Unpack.005806B8//ASCII"
这段是存放最大用户数有多少。
然后再看这段代码005805ECBACC065800movedx,Unpack.005806CC//ASCII"
而这段存放注册码。
我们打开一下注册码表来验证一下我们判断是不是正确的,打开注册表找到\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"
停下,我们在信息窗口上面看到:
00589DDC=Unpack.00589DDC(ASCII"
)
edx=00B92538,(ASC