- 积分
- 869
- Hb
-
- 注册时间
- 2008-8-8
- 最后登录
- 1970-1-1
- 在线时间
- 小时
- 精华
|
本战网成立于2008年4月18日,QQ群:7935950;Gm:天狼≡战 网 玩 家 必 读≡ |
关于存档8K的限制,是由堆栈保留的大小所限制的,就跟上次的“突破6孔限制”中说的由于堆栈保留不足导致超过6孔时神符之语检测会出错的情况相似。所以要增大存档的大小,就要修改保留堆栈的大小、修改堆栈的引用,同时还要把存档8K限制的比较改大。
下面以总的保存存档的函数中的部分代码,改为64K存档限制为例,简要介绍如何修改:
1、修改保留堆栈的大小:包括分配堆栈的修改和释放堆栈的修改
分配堆栈:
6FC8A500 B8 40260000 mov eax,2640
分配堆栈大小为2640 H=9792 BYTE ,其中的末2000 H =8K BYTE就是用来暂存生成的存档。改为64K就要加E000H,就是修改2640
H为10640 H。
释放堆栈
6FC8A51C 81C4 40260000 add esp,2640
6FC8A522 |. C2 0800 retn 8
同样,加E000H,即修改2640 H为10640 H。
2、修改堆栈的引用:由于堆栈末处有一些参数需要引用,而堆栈变大,引用的地址也修改,如
6FC8A5D4 |. 8B8424 58260000 mov eax,dword ptr ss:[esp+2658]
这里的2658 H要加上面说的E000H,即修改2658 H为10658 H。
3、存档8K限制的比较值修改:如
6FC8A65E |. 68 00200000 push 2000
这里的2000 H =8K BYTE,需要改为10000 H =64K
再一次说说,以上只是几个修改的例子,真正修改的地方还有很多。
以下是关于修改的初始地址,有些整个函数的都有修改的地方。
6FC31B20 817E 02 00200000 cmp dword ptr ds:[esi+2],2000
此处应该是对于BN传送的存档大小比较相关的。调试时程序没运行到,这里的功能是我根据代码而推断的。为保持兼容性,一并修改。就此一处。
6FC8A1B0 B8 38200000 mov eax,2038
此处是BN保存存档的函数。要修改保留堆栈的大小、修改堆栈的引用和存档8K限制的比较值修改。
6FC8A500 B8 40260000 mov eax,2640
此处是总的保存存档的函数。要修改保留堆栈的大小、修改堆栈的引用和存档8K限制的比较值修改。
6FC8B3D0 B8 6C500000 mov eax,506C
此处应该是物品解调前保留的堆栈。同上,调试时程序没运行到,这里的功能是我根据代码而推断的。为保持兼容性,一并做修改堆栈的扩充修改。要修改保留堆栈的大小、修改堆栈的引用。
6FC8C9D0 B8 FC250000 mov eax,25FC
此处是读入存档的函数。要修改保留堆栈的大小、修改堆栈的引用和存档8K限制的比较值修改。
6FC90C97 |. 68 00200000 push 2000
此处为角色交易(收)时的大小比较的地址。由于机器限制(不能开服务器还同时开2个游戏),一并修改,没有测试。就此一处。
6FC92807 BA 00020000 mov edx,2000
6FC92827 68 00020000 push 2000
此二处分别为角色交易(向外发)时的空间分配和大小比较的地址。同样由于机器限制,一并修改,没有测试。就这两处的修改。
以上修改的DLL文件是D2Game.dll(v1.10)。
存在的问题和不足:
1、前面说的两处不清楚的地方,由于测试时没有运行到那部分程序,为保持兼容性,一并做了修改,其原因是堆栈的变大不同变小,不会有堆栈溢出的问题。
2、对PVPGN 和D2GS 两端的程序不熟悉,不清楚会不会影响实际的战网存档的大小。在忽略此问题下,理论的存档大小大约在2 M ,因为在战网中总的保存存档的函数会调用战网存档函数,2
M * 2余900 K左右用于后面的堆栈。
3、由于扩充了存档的大小,对机器(单机和服务器)的资源要求变大了,虽然一般不会到达8倍,但也是成倍的增长。我这里没有进行对资源估计,直接来一个 (11*16+11*16+11*12)*100
BYTE =48400 <64 K 的修改。
4、不是我的问题的问题:在原DIABLO中,雇佣兵的装备在变动前会有一个1 K的限制,当装备大于1K时就会消失(估计很少人会像我这样,给雇佣兵一个接近2K帽子)。需要解决的地方如下
6FC51070 81EC 30040000 sub esp,430
此处是雇佣兵物品变动时物品的调整函数。要修改保留堆栈的大小、修改堆栈的引用和物品1K限制的比较值修改。
最后要强调的是:修改的地方只是我通过猜想而搜索到的地方,至于完不完整——包括猜想的完整性和搜索的完整性——本人不确定。但是可以说的是,修改后通过两种测试:
单机测试:
先做了一个100 BYTE的珠宝,把一个人物的储存箱和物品栏用这些珠宝填充,用了72个就接近8K的大小。进入游戏,再把剩余的空间用物品填满。退出游戏,看存档大小,8.xK
>8K ,保存成功。再进入游戏,成功进入,身上的东西都在。卖掉填充用物品,推出游戏。修改存档,用100 BYTE的珠宝填充剩余的空间,保存。看存档大小,9.x
K,进入游戏,成功进入。推断——改为64K存档限制在单机是可行的。
战网测试:
自己建立战网,进入战网,建立新人物,建立游戏后推出。跟上面一样,用修改工具打开新人物,把储存箱和物品栏用这些珠宝填充,用了72个就接近8K的大小。进入战网,建立游戏,再把剩余的空间用物品填满。退出游戏,看存档大小,8.xK
>8K ,保存成功。再进入游戏,成功进入,身上的东西都在。卖掉填充用物品,推出游戏。修改存档,用100 BYTE的珠宝填充剩余的空间,保存。看存档大小,8.97
K,进入游戏,成功进入,截图证明,见“[竞猜]”。在等竞猜的时候,我又自建战网测试,从ACT1 打到ACT 5,存档上升到14K,也没见报错。推断——改为64K存档限制在战网是可行的。
附修改后初始地址开始的二进制码的复制,一两处的修改就自己改吧。
6FC8A1B0,BN保存存档的函数:
B8 38 00 01 00 E8 E6 28 09 00 A1 08 0E D3 6F 53 55 33 ED 56 3B C5 57 8B F2 75
0F 5F 5E 5D 33 C0
5B 81 C4 38 00 01 00 C2 18 00 8B 84 24 5C 00 01 00 8B 94 24 54 00 01 00 50 52
8D 44 24 18 68 00
00 01 00 8D 54 24 56 50 52 8B D6 89 6C 24 24 E8 3C 37 00 00 8B 44 24 10 3B C5
7F 1E 68 D0 09 00
00 68 0C 0E D3 6F 68 F4 0E D3 6F E8 10 25 09 00 83 C4 0C 6A FF E8 C3 25 09 00
8D 58 02 68 E9 09
00 00 BA 0C 0E D3 6F 8B CE 66 89 5C 24 4C E8 9D 20 03 00 8B F8 8B CF 89 7C 24
28 E8 F0 96 FA FF
8D 53 FE 8D 4C 24 4A 8B F0 E8 E2 FE FF FF 33 C9 3B C6 0F 94 C1 89 44 24 40 8B
C1 3B C5 0F 84 8F
01 00 00 8B CF E8 F6 9E FA FF 8B CF 8B F0 E8 1D 9F FA FF 8B D0 3B F5 89 54 24
10 75 1E 68 F4 09
00 00 68 0C 0E D3 6F 68 E4 0E D3 6F E8 4D 24 09 00 83 C4 0C 6A FF E8 42 25 09
00 8D 4B FE B8 01
00 00 00 3B D1 89 44 24 38 0F 85 28 01 00 00 8B 4E 04 89 6C 24 1C 83 F9 5B
89 4C 24 44 89 6C 24
2C 89 6C 24 24 89 6C 24 34 76 2E 8B 56 0C 8B 4E 30 89 54 24 1C 8B 56 34 89 4C
24 2C 8B 8E AB 00
00 00 89 54 24 24 89 4C 24 34 89 6E 0C 89 6E 30 89 6E 34 89 AE AB 00 00 00 8B
4C 24 4E 89 6C 24
30 83 F9 5B 89 4C 24 3C 89 6C 24 14 89 6C 24 18 89 6C 24 20 76 36 8B 54 24 56
8B 4C 24 7A 89 54
24 30 8B 54 24 7E 89 4C 24 14 8B 8C 24 F5 00 00 00 89 54 24 18 89 4C 24 20 89
6C 24 56 89 6C 24
7A 89 6C 24 7E 89 AC 24 F5 00 00 00 8B 4C 24 10 33 D2 3B CD 7E 28 8B FE 8D 44
24 4A 2B F8 8D 4C
14 4A 8A 04 0F 3A 01 75 0F 8B 44 24 10 42 3B D0 7C EC 8B 44 24 38 EB 02 33 C0
8B 7C 24 28 8B 54
24 44 B9 5B 00 00 00 3B D1 76 1F 8B 54 24 1C 89 56 0C 8B 54 24 2C 89 56 30 8B
54 24 24 89 56 34
8B 54 24 34 89 96 AB 00 00 00 39 4C 24 3C 76 23 8B 4C 24 30 8B 54 24 14 89
4C 24 56 8B 4C 24 18
89 54 24 7A 8B 54 24 20 89 4C 24 7E 89 94 24 F5 00 00 00 3B C5 75 75 8D 43 FE
50 8B 84 24 50 00
01 00 50 68 A8 0E D3 6F 6A 07 E8 41 B3 FA FF 83 C4 10 8B 94 24 60 00 01 00 8B
CF E8 B0 A2 FA FF
8B 54 24 40 8B CF E8 55 95 FA FF A1 30 58 D4 6F 3B C5 0F 84 C1 00 00 00 8B 40
0C 3B C5 0F 84 B6
00 00 00 50 FF 15 10 7C D2 6F 85 C0 74 70 68 82 0A 00 00 68 0C 0E D3 6F 68 78
0E D3 6F E8 9C 22
09 00 83 C4 0C 6A FF E8 91 23 09 00 8B 15 28 DC D4 6F A1 30 58 D4 6F 42 3B C5
89 15 28 DC D4 6F
74 1F 8B 40 38 3B C5 74 18 8B 8C 24 50 00 01 00 8B 94 24 4C 00 01 00 51 8D 8C
24 64 00 01 00 FF
D0 8B 94 24 60 00 01 00 8B CF E8 21 A2 FA FF 33 C0 5F 5E 5D 5B 81 C4 38 00 01
00 C2 18 00 8B 94
24 58 00 01 00 8B 8C 24 50 00 01 00 52 8B 94 24 50 00 01 00 8D 44 24 4C 53
50 A1 30 58 D4 6F 51
8D 8C 24 70 00 01 00 FF 50 0C 83 C3 FE 8D 54 24 4A 53 8B CF E8 E7 9C FA FF 5F
5E 5D B8 01 00 00
00 5B 81 C4 38 00 01 00 C2 18 00
6FC8A500,总的保存存档的函数
B8 40 06 01 00 E8 96 25 09 00 53 55 56 57 8B FA 8B D9 85 FF 75 0F 5F 5E 5D 33
C0 5B 81 C4 40 06
01 00 C2 08 00 8B AF C8 00 00 00 6A 07 83 E5 FD 57 89 AF C8 00 00 00 E8 8C 11
09 00 85 C0 74 0D
68 4C 0F D3 6F E8 B0 21 09 00 83 C4 04 8D 44 24 24 8D 4C 24 14 50 51 57 33 ED
C7 44 24 20 06 00
00 00 E8 B9 32 03 00 85 C0 74 0D 8B 44 24 14 85 C0 75 05 BD 01 00 00 00 68 09
0B 00 00 BA 0C 0E
D3 6F 8B CF E8 57 1D 03 00 8B F0 8D 54 24 28 8B CE E8 FA A0 FA FF 8D 54 24 1C
8B CE E8 FF A0 FA
FF 8D 54 24 20 8B CE E8 04 A1 FA FF 8A 43 6A C7 44 24 18 01 00 00 00 3C 01 0F
84 29 01 00 00 3C
02 0F 84 21 01 00 00 A1 30 58 D4 6F 85 C0 74 3A 8B 54 24 20 8B 84 24 58 06 01
00 8B 4C 24 1C 52
50 8B 84 24 5C 06 01 00 51 8D 54 24 34 55 52 50 8B D7 8B CB E8 B7 FB FF FF 5F
5E 5D 89 44 24 0C
5B 81 C4 40 06 01 00 C2 08 00 A1 08 0E D3 6F 85 C0 0F 84 53 01 00 00 BA 00
04 00 00 8D 8C 24 50
02 00 00 E8 3E 21 09 00 8B 8C 24 54 06 01 00 8D 94 24 50 02 00 00 51 52 8D 44
24 64 68 40 0F D3
6F 50 E8 88 24 09 00 8B 8C 24 68 06 01 00 83 C4 10 8D 54 24 10 8D 84 24 50 06
00 00 51 55 68 00
00 01 00 52 50 8B D7 8B CB C7 44 24 24 00 00 00 00 E8 CA 32 00 00 8B 7C 24 10
85 FF 0F 8E E8 00
00 00 8D 4C 24 5C 68 3C 0F D3 6F 51 E8 E6 31 09 00 8B F0 83 C4 08 85 F6 74 2B
56 6A 01 8D 94 24
58 06 00 00 57 52 E8 62 30 09 00 56 E8 DF 2F 09 00 8B 44 24 2C 83 C4 14 5F 5E
5D 5B 81 C4 40 06
01 00 C2 08 00 8D 44 24 5C 50 68 18 0F D3 6F E8 26 20 09 00 8B 44 24 20 83 C4
08 5F 5E 5D 5B 81
C4 40 06 01 00 C2 08 00 8B CE E8 81 9A FA FF 85 C0 74 07 8B CE E8 86 9B FA FF
6A 00 55 8D 4C 24
18 68 00 00 01 00 8D 94 24 5C 06 00 00 51 52 8B D7 8B CB C7 44 24 24 00 00
00 00 E8 20 32 00 00
8B 7C 24 10 85 FF 7F 1E 68 D6 0A 00 00 68 0C 0E D3 6F 68 6C 0E D3 6F E8 B2 1F
09 00 83 C4 0C 6A
FF E8 A7 20 09 00 8B CE E8 53 92 FA FF 8D 94 24 50 06 00 00 8B C8 6A 00 6A 00
6A 00 57 57 E8 BD
98 FA FF 8B CE E8 96 9B FA FF 8B 44 24 18 5F 5E 5D 5B 81 C4 40 06 01 00 C2 08
00
6FC8B3D0,应该是物品解调前保留的堆栈
B8 6C 30 01 00 E8 C6 16 09 00 89 54 24 10 89 4C 24 04 53 55 56 8B B4 24 7C 30
01 00 57 66 81 3E
4A 4D 74 12 5F 5E 5D B8 0E 00 00 00 5B 81 C4 6C 30 01 00 C2 14 00 8B 94 24 88
30 01 00 66 8B 46
02 83 C6 02 BD 04 00 00 00 83 C6 02 2B D5 33 DB 25 FF FF 00 00 89 94 24 88 30
01 00 89 5C 24 10
89 5C 24 24 89 44 24 28 0F 86 71 01 00 00 B9 12 00 00 00 33 C0 8D 7C 24 2C F3
AB 66 81 3E 4A 4D
75 A2 83 C6 02 8D 4C 24 2C 8B D6 E8 10 FB FF FF 8B 94 24 88 30 01 00 B9 FE FF
FF FF 2B C8 33 FF
03 D1 03 F0 89 94 24 88 30 01 00 33 D2 3B DF 8D 6C 28 02 7E 71 8D 04 9B 8D 8C
24 80 00 00 00 8D
84 84 80 00 00 00 8B 7C 24 70 3B 79 FC 75 23 8B 7C 24 4C 3B 39 75 1B 8B 7C 24
2E 3B 79 04 75 12
8B 7C 24 54 3B 79 08 75 09 8B 7C 24 58 3B 79 0C 74 74 8B 7C 24 70 43 89 78 FC
8B 7C 24 4C 89 38
8B 7C 24 2E 89 78 04 8B 7C 24 54 89 78 08 8B 7C 24 58 89 78 0C 83 C0 14 42
83 C1 14 3B D3 7C A6
89 5C 24 10 33 FF 8B 84 24 8C 30 01 00 8D 4C 24 1C 3B C7 8D 44 24 18 8D 54 24
2C 50 51 8B 4C 24
1C 52 8B 54 24 2C 89 7C 24 24 89 7C 24 28 0F 84 A3 00 00 00 E8 57 01 00 00 3B
C7 0F 85 89 00 00
00 E9 9A 00 00 00 8A 44 24 2D 89 5C 24 10 33 DB 84 C0 76 52 B9 12 00 00 00 33
C0 8D 7C 24 2C F3
AB 66 81 3E 4A 4D 0F 85 98 FE FF FF 83 C6 02 8D 4C 24 2C 8B D6 E8 06 FA FF FF
8B BC 24 88 30 01
00 8B 54 24 2D B9 FE FF FF FF 03 F0 2B C8 81 E2 FF 00 00 00 03 F9 43 3B DA 89
BC 24 88 30 01 00
8D 6C 28 02 7C AE 8B 5C 24 10 8B 44 24 24 8B 4C 24 28 40 3B C1 89 44 24 24 0F
82 8F FE FF FF 8B
94 24 90 30 01 00 33 C0 89 2A 5F 5E 5D 5B 81 C4 6C 30 01 00 C2 14 00 E8 14 E0
FF FF 85 C0 75 CA
8B 44 24 18 89 7C 24 10 3B C7 7E BE B9 12 00 00 00 33 C0 8D 7C 24 2C F3 AB
66 81 3E 4A 4D 0F 85
00 FE FF FF 83 C6 02 8D 4C 24 2C 8B D6 E8 6E F9 FF FF 8B 94 24 88 30 01 00 B9
FE FF FF FF 03 F0
2B C8 8D 6C 28 02 8B 84 24 8C 30 01 00 03 D1 8D 4C 24 2C 85 C0 89 94 24 88 30
01 00 8D 44 24 1C
74 16 8D 54 24 78 52 8B 54 24 24 50 51 8B 4C 24 20 E8 3A 00 00 00 EB 14 8D 54
24 74 52 8B 54 24
24 50 51 8B 4C 24 20 E8 84 DF FF FF 85 C0 0F 85 56 FF FF FF 8B 44 24 10 8B 4C
24 18 40 3B C1 89
44 24 10 0F 8C 63 FF FF FF E9 1C FF FF FF
6FC8C9D0,读入存档的函数
B8 FC 05 01 00 E8 C6 00 09 00 8B 84 24 04 06 01 00 89 4C 24 04 53 55 56 8B EA
33 F6 57 BA 00 04
00 00 8D 8C 24 0C 02 00 00 89 74 24 10 89 30 E8 62 FD 08 00 8B 8C 24 10 06 01
00 8D 94 24 0C 02
00 00 51 52 8D 44 24 20 68 40 0F D3 6F 50 E8 AC 00 09 00 8D 4C 24 28 68 3C 10
D3 6F 51 E8 45 0E
09 00 8B F8 83 C4 18 3B FE 0F 84 D6 00 00 00 57 68 00 00 01 00 8D 94 24 14 06
00 00 6A 01 52 E8
0C 0F 09 00 57 8B D8 E8 34 0C 09 00 83 C4 14 85 DB 0F 84 AE 00 00 00 83 FB 08
73 14 BE 09 00 00
00 5F 8B C6 5E 5D 5B 81 C4 FC 05 01 00 C2 14 00 81 BC 24 0C 06 00 00 55 AA 55
AA 74 14 BE 09 00
00 00 5F 8B C6 5E 5D 5B 81 C4 FC 05 01 00 C2 14 00 83 BC 24 10 06 00 00 5B 77
33 8B 84 24 20 06
01 00 8B 8C 24 1C 06 01 00 8B 94 24 18 06 01 00 50 51 8D 44 24 18 52 50 8D 8C
24 1C 06 00 00 53
51 8B 4C 24 2C 8B D5 E8 E4 F5 FF FF EB 31 8B 94 24 20 06 01 00 8B 84 24 1C
06 01 00 8B 8C 24 18
06 01 00 52 50 8D 54 24 18 51 8B 4C 24 20 52 8D 84 24 1C 06 00 00 53 50 8B D5
E8 11 24 00 00 8B
F0 85 F6 75 16 8B 44 24 10 8B 8C 24 14 06 01 00 85 C0 89 01 75 05 BE 0E 00 00
00 8B C6 5F 5E 5D
5B 81 C4 FC 05 01 00 C2 14 00
6FC51070,佣兵物品1K限制(改为2K,应该够了)
81 EC 30 08 00 00 53 55 56 8B F2 57 56 89 74 24 24 8B E9 E8 22 A6 0C 00 8B F8
8D 44 24 40 6A 00
6A 01 6A 01 68 00 08 00 00 50 56 E8 30 A7 0C 00 8D 4C 24 28 8B D8 51 6A 01 8D
54 24 48 53 52 E8
D2 AB 0C 00 8D 44 24 14 8D 4C 24 28 6A 60 50 51 6A 01 8D 54 24 50 53 52 8B D7
8B CD E8 3F DB FF
FF 8B F8 85 FF 75 0F 5F 5E 5D 33 C0 5B 81 C4 30 08 00 00 C2 08 00 8B 44 24 14
6A 01 68 00 00 08
00 57 8D 74 04 4C 2B D8 89 74 24 1C E8 D5 A6 0C 00 6A 00 68 00 20 00 00 57 E8
C8 A6 0C 00 8B 84
24 48 08 00 00 85 C0 0F 84 E3 00 00 00 8B 44 24 3C 85 C0 0F 84 D7 00 00 00 89
44 24 1C C7 44 24
18 00 00 00 00 0F 8E C5 00 00 00 8D 44 24 28 50 6A 01 53 56 E8 3D AB 0C 00 8D
4C 24 14 8D 54 24
28 6A 60 51 52 6A 01 53 56 33 D2 8B CD E8 AE DA FF FF 8B F0 85 F6 0F 84 6B FF
FF FF 8B 44 24 14
8B 4C 24 10 03 C8 6A 04 56 89 4C 24 18 2B D8 E8 BA A7 0C 00 8B 47 0C 8B 4E
0C 6A 00 6A 01 8D 54
24 2C 6A 00 52 50 51 8B D7 8B CD E8 40 86 FF FF 85 C0 74 3E 6A 01 68 00 00 08
00 56 E8 25 A6 0C
00 6A 00 68 00 20 00 00 56 E8 18 A6 0C 00 6A 00 6A 01 56 E8 86 A6 0C 00 8B 44
24 18 8B 4C 24 1C
40 3B C1 89 44 24 18 7D 27 8B 74 24 10 E9 59 FF FF FF 68 6E 0D 00 00 68 08 E4
D2 6F 68 78 DA D2
6F E8 F8 B4 0C 00 83 C4 0C 6A FF E8 ED B5 0C 00 8B 44 24 20 6A 01 68 00 00 00
08 50 E8 C5 A5 0C
00 6A 00 68 FC 00 00 00 57 E8 74 A4 0C 00 8B F0 85 F6 74 2F 6A 03 8B D7 8B CD
E8 41 3F FE FF 85
C0 75 20 50 50 B8 C4 09 00 00 8B 8D A8 00 00 00 99 F7 FE 8D 54 08 01 8B CD 52
6A 03 8B D7 E8 5D
3F FE FF 6A 00 68 FD 00 00 00 57 E8 32 A4 0C 00 8B F0 85 F6 74 2F 6A 03 8B D7
8B CD E8 FF 3E FE
FF 85 C0 75 20 50 50 B8 C4 09 00 00 8B 8D A8 00 00 00 99 F7 FE 8D 54 08 01
8B CD 52 6A 03 8B D7
E8 1B 3F FE FF 8B D7 8B CD E8 52 03 FF FF 6A 00 6A 01 57 E8 A6 A5 0C 00 8B C7
5F 5E 5D 5B 81 C4
30 08 00 00 C2 08 00 |
|