前几天突然想突破8K存档限制(灵感突现),昨天就研究了一下,大概解决了问题。鉴于许多人都看不懂,ASM写出来剑的排版整理又太....,就精炼的说一下:
关于存档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)