由 gymzatan 添加于 2026-02-12 12:25:01
下载链接: 获取积分?
该游戏主应用程序存在频发的 0xC0000005 读访问冲突(Access Violation / Read)问题,崩在主程序里一条 rep movsd 的内存拷贝指令上。已经测试过补丁后的程序,之前必定触发闪退的地方可以正常运行了。
使用方式:双击打开补丁(基于python的独立应用程序)后选择游戏本体主应用程序文件(V1.01a CD版和免CD版都支持;V1.00版不支持)。
以下是ChatGPT对bug的解析:
1) 崩溃点到底发生了什么
异常信息(dump 解析结果)
ExceptionCode:0xC0000005(读内存违规)
ExceptionAddress:0x00553982(在你的 sengomuramasa NoDVD for 101a.exe 内)
试图读取地址:0x077BFED2
当时关键寄存器:
EIP = 0x00553982
ESI = 0x077BFED2(源地址,无效)
EDI = 0x1151DF98(目的地址,在栈上,正常)
ECX = 0x53(rep 次数)
**崩溃指令(反汇编)**就在这里:
0055397d B9 53 00 00 00 mov ecx,53h
00553982 F3 A5 rep movsd ; 从 [ESI] 拷贝到 [EDI]
rep movsd 会从 ESI 指向的内存读数据,但此时 ESI=0x077BFED2 指向未映射页,于是瞬间炸掉。
2) 根因:索引为 0 导致“往前越界一条记录”
把这段函数整体看一下(函数入口在 0x00553930):
关键逻辑是:
用 BX(某个 ID)去一个 16bit 映射表里取“记录索引”(movzx eax, word ptr [table + id*2])
再用 index * 0x14E 算出记录偏移
复制 0x14E 字节 的记录数据到栈缓冲区
核心计算是这一段:
mov eax, [this+0x30728] ; table
movzx eax, word ptr [eax+edx*2] ; index = table[id]
...
imul ecx, eax, 0x14e ; ecx = index * 0x14e
add esi, 0xfffffeb2 ; esi -= 0x14e (关键!)
add esi, ecx ; esi = base - 0x14e + index*0x14e
...
rep movsd ; 复制 0x14c bytes + 2 bytes = 0x14e
注意这个公式:
src = base - 0x14E + index * 0x14E
等价于:src = base + (index - 1) * 0x14E
这明显是 “index 从 1 开始” 的设计。
所以:
当 index = 1:src = base ✅
当 index = 0:src = base - 0x14E ❌(直接读到分配块之前的未映射页)
而 dump 里 BX=0,非常符合“有时某个 ID/字段为 0(未初始化/异常数据/竞态)→ 映射结果为 0 → 越界读”的随机性表现。
3) 修复思路:把 index==0 的情况钳到 1(或者直接返回)
最小侵入、最稳的热修方式:
在取到 index 后加一条保护:
if(index == 0) index = 1;
这样即使上游偶尔传了 0/异常 ID,也不会越界读导致闪退;最多就是读到“第 1 条记录”的数据(比直接崩溃强太多)。
下载说明:
- 部分资源会被浏览器识别为有害程序拦截下载,取消拦截的方法参见 FAQ。
- 存档类下载后解压缩到游戏安装路径下相关文件夹,覆盖同名文件即可!安全起见我们建议您备份原文件。
- 免CD/DVD补丁类如果无特别使用说明,下载后解压缩到游戏安装目录下运行即可。
- 本站资源全部采用 WinRAR v5.0 版压缩,下载后不能解压请安装 WinRAR v5.0+。
- 本站下载不保证完全兼容手机端,部分浏览器(手机端、360等)可能无法正常下载本站资源。
- 文件安全性评估仅供参考,2DFan无法承担您因依赖此报告结果,使用此文件所可能导致的各种形式的损害。
- 如需投诉补丁未授权转载问题,请先阅读 相关说明 后,至 站务小组 开贴投诉。


