|
|
发表于 2026-9-26 01:35:01
|
显示全部楼层
ai修了一小时半。各位看看效果
修复一:坏栈映射帧(核心,治卡加载页)
症状:卡死在加载页、主菜单“继续”按钮无效,日志报 ClassFormatError: StackMapTable format error: bad offset for Uninitialized。
病理:JVM 字节码里每个方法带一张“栈映射表”,声明每个跳转目标处栈和局部变量里是什么。其中对“刚 new 出来还没构造完的对象”的引用用的是绝对偏移(指向那条 new 指令的位置)。汉化重编译时有些代码挪了 3 个字节,但表里的偏移没跟着改——比如表说“891 处 new 的对象”,实际 new 在 894。严格校验一对就炸。
修法(三步走):
静态审计:不解码执行,纯文本解析每个类的方法体,找出所有 new 指令的真实位置,逐一核对帧表里的 Uninitialized 引用——这利用了这类损坏的唯一形态(相对偏移会自动平移,只有绝对引用会坏),几秒扫完 9000 多个类;
外科手术:把坏引用改写到唯一最近的 new 真实位置,只动那 2 个字节,其余字节一律原样;有歧义时回退到 ASM 全帧重算;
真机验证:修好的类在写回前,先在本机 JVM 里真实定义并初始化一遍,确认通过严格校验才算数。
在你机器上修的就是这个:CampaignGameManager(存档管理,卡加载页的直接元凶)等 4 个类。
修复二:Prepatcher 存档补丁冲突(治修完后读档 VerifyError)
症状:帧表修好后,如果装了 StarsectorPrepatcher(性能补丁工具),读档报 VerifyError: Stack map does not match...。
病理:Prepatcher 有个微优化 saveOutputBufferDedup,恰好也盯上存档管理器这个类——它删掉存档时多余的 1MB 缓冲层,改完字节码却沿用了现有帧表(还记着删除前的类型),于是又错位了。任何修帧的东西和它叠加都会打架。
修法:把它的两个存档管线补丁关掉(saveOutputBufferDedup 和 saveLoadProgressThrottle),都是可有可无的微优化;它其余 17 个补丁照常工作。有配置备份。
修复三:ChineseInputFix 的 JNA 注入失效(治中文输入失效)
症状:游戏能玩,但中文输入法唤不出,日志反复刷 NoClassDefFoundError: com/sun/jna/Native。
病理:中文输入修复 mod 需要 JNA 库调 Win32 API 找游戏窗口,但它不把 JNA 放 classpath,而是启动时用 sun.misc.Unsafe 底层反射把 JNA“注”进系统类加载器——这套野路子在 JDK 27+ 上被堵死了,注入失败,mod 就瘫了。
修法:检测到这个 mod,就把 mod 自带的 jna-*.jar 直接追加到启动 classpath(Miko_Simple.txt、fr.bat 的 fr.vmparams、以及 mikohime 配置器的模板文件,防止重跑配置器后丢失)。classpath 上有了 JNA,mod 启动第一步检测就直接命中,注入逻辑彻底被绕开。 |
|