首页 / 资讯中心 / 文章详情

gow3_pc签名补丁原理:字节模式匹配与内存热修补,不修改游戏文件的实现方式

gow3_pc签名补丁原理:字节模式匹配与内存热修补,不修改游戏文件的实现方式 ★ FEATURED ARTICLE
【免费下载链接】gow3_pcGod of War III Remastered (PS4) for Windows and Linux (experimental AppImage). Original x86-64 code runs directly on the CPU with a custom runtime; graphics use shadPS4s Vulkan video core and cuesta4s fixes. Launcher, in-game menu, controller icons and up to 240 FPS. Requires your own game dump. No game files included.项目地址https://gitcode.com/gh_mirrors/go/gow3_pc点击查看免费下载gow3_pc 是《战神3 重制版》PS4的 PC 移植项目游戏原版 x86-64 代码直接在 CPU 上运行而所有补丁、加速与修改都通过签名补丁实现——用字节模式匹配在内存中定位代码再用内存热修补改写若干字节全程不修改游戏文件。本文带你拆解这套机制的完整原理。为什么需要签名而不是写死地址一个朴素的补丁思路是把0x5643f3处改成e0 01 00 00写入 480p 的宽度值。但游戏不同发行版本、不同更新之间代码段会整体移动。项目自带的 XML 补丁文件头部注释就说明了这一点shadPS4 的文件针对另一个 01.02 构建0x564000-0x56bfff区间的代码地址比这里高 0x100x5f0000-0x609fff区间低 0x120。地址会漂但代码本身的机器码不会轻易变。于是 gow3_pc 的做法是不记地址记长相——用一段原始字节作为签名signature在内存里搜索它的出现位置。这正是 src/signature.h 中Gow3Signature结构做的事pattern十六进制字节串??是通配符at真正要修补的位置在匹配到模式中的偏移量签名长什么样字节模式与 ?? 通配符以 patches/God_of_War_III_Remastered.xml 中的分辨率补丁为例Resolution Patch - 480p的第一行Pattern48 8d 75 a0 89 c7 e8 ?? ?? ?? ?? 41 c7 45 0c 80 07 00 00 At15这段模式共 20 个字节部分含义48 8d 75 a0lea rsi, [rbp-0x60]取本地结构体89 c7mov edi, eaxe8 ?? ?? ?? ??call指令后 4 字节是相对跳转目标41 c7 45 0c 80 07 00 00mov [r130xc], 0x780即宽度 1920为什么call后面的 4 个字节要写成??因为 x86-64 的call和lea ripdisp32用的是相对位移指令指向的数据/函数如果搬家了这 4 个字节的值就会变但指令其余字节操作码、寄存器编码完全不变。所以签名把这类会随构建变化的字节全部标成通配符其余字节则一字不差——匹配成功不仅定位了位置还证明了原始代码确实在那里。如何找到一个站点唯一的匹配才算数查找逻辑在 src/signature.h 的gow3_signature_find中思路很克制解析模式把连续固定字节中最长的一段作为锚点anchor用memchr快速跳过不可能的区域再用memcmp校验锚点最后检查整条模式恰好匹配一次→ 返回站点偏移匹配不到或匹配多次 → 返回UINT64_MAXambiguous视为失败。宁可放弃不可错改。补丁脚本 scripts/patches.py 的locate同样如此signature not found或signature found more than once都会让整个补丁被跳过而游戏照常启动日志和菜单会说明原因。签名是怎么生成的最短唯一窗口 自动通配签名不是人手写的而是 tools/make_signatures.py 从参考构建的eboot.bin自动生成用 capstone 反汇编站点附近的指令前后约 160 字节线性扫描识别所有可变字节RIP 相对指令的位移、call/jump的 4 字节目标variable()函数从站点开始向两侧逐步扩窗直到窗口既 ≥16 字节MIN_LENGTH太短容易误配、又在整张内存图中恰好出现一次为止输出Pattern... At...两行文本写进 XML 或头文件。注释里有一句值得玩味在一个构建里唯一不代表在另一个构建里也是证明——所以窗口宁长勿短。从 XML 到内存两级编译流水线整个补丁链路分两步全部发生在游戏启动之前准备阶段scripts/prepare.py读取游戏目录的eboot.binPS4 的 SELF 封装解出 ELF 各段按虚拟地址铺成一张内存图memory image——注意此时读的是磁盘文件之后不再回写。编译阶段scripts/patches.py对每条Line用find_pattern按签名定位站点把Address/Value换成偏移 新字节打包成patches.bin。文件头是魔数G3PATCH2、补丁基址和写入条数。XML 还有两个精巧的机制Target 间接寻址有些要改的是代码指针过去的数据比如.bss里的变量自己没有可识别的字节。Target用签名找到读取该数据的指令再沿它的相对操作数Ref/Tail参数解出真实位置例如 Bug Fix - Startup Black Screen 就是靠Targetframe_index写到了0x18ba600。相对位移占位符Value 里的{rel:sixty:0}会在编译期算好 rel32 位移填进去——240 FPS 补丁正是用它把帧率常量的指针从 59.94 重定向到 60.0 的浮点常量。运行时热修补只写内存随时可复现游戏进程内的加载器 src/probe.capply_patches在重定位之后逐条应用patches.bin校验魔数、确认每个写入点都落在合法映射段内写入字节若写入范围覆盖了基址相对指针槽例如 60/90 FPS 交换的函数指针还会把指针重新定基rebase到新的image基址日志输出一行汇总Patches: N writes, M bytes applied, K pointers rebased。更复杂的钩子cheat、伤害倍率、球体倍率走同一套签名查找但用跳转桩替换[E9 xx xx xx xx] [90 90 ...] ← 原指令位置5字节相对跳 NOP 填充 │ └──► 代码桩stub先执行修改逻辑再逐条重放原始指令最后跳回原处例如 src/cheat_hook.h 的无限生命钩子签名定位到movaps指令后把 9 个原始字节换成跳转桩内保留push rbp/pop rbp等寄存器现场读取菜单标志决定是否生效再逐字节重放原始指令后jmp回原位——游戏其余代码毫无感知。src/orb_hook.h 更进一步不仅找到红球 setter还验证 3 个call站点的相对目标确实指向它任何一条对不上就整体放弃。为什么能不修改游戏文件把上面拼起来答案就清晰了阶段对游戏文件的操作准备只读取eboot.bin解码进内存图补丁编译只读内存图搜索签名产出patches.bin运行只在进程内存里写补丁与钩子下次启动内存消失eboot.bin原封不动流程重放磁盘上的游戏目录始终是干净的补丁不写入eboot.bin也不打临时文件。这意味着签名找不到站点时最坏情况是该补丁本次不生效日志写明原因而不是游戏文件被写坏了。README 中也明确CUSA01623 与欧洲版 CUSA01715 之所以共用同一份补丁正因为补丁和 cheat 都靠签名找站点。可靠性验证测试一个搬家的构建tests/test_signatures.cpp 直接验证了本文的核心假设在参考构建中所有钩子站点cheat、血量显示、球体倍率签名必须命中参考偏移然后人为构造一张代码搬过家的图0x60000前插入 0x120 字节、0x90000处删掉 0x10 字节——所有签名在新位置仍然全部命中再篡改一个call目标验证钩子会正确不可用而不是误跳。配合 tests/data/eboot_6e72_sites.json 记录的各补丁原始字节形成了一道签名必须唯一且位置正确的回归防线。总结gow3_pc 的签名补丁机制可以浓缩为三句话定位靠长相用原始字节 ??通配符的签名在内存中做唯一匹配天然免疫代码重定位修改只进内存XML 签名 →patches.bin→ 运行时写入进程内存并重定基游戏文件永远是只读的失败即降级匹配不到或多次匹配该补丁静默禁用游戏照常可玩。这套字节模式匹配 内存热修补的组合让同一份补丁能覆盖多个区域和版本的游戏也是移植项目在不改动原始数据的前提下做深度修改的通用范式。想深入细节可以从 src/signature.h查找算法、tools/make_signatures.py签名生成和 scripts/patches.py补丁编译三个文件读起。赞分享【免费下载链接】gow3_pcGod of War III Remastered (PS4) for Windows and Linux (experimental AppImage). Original x86-64 code runs directly on the CPU with a custom runtime; graphics use shadPS4s Vulkan video core and cuesta4s fixes. Launcher, in-game menu, controller icons and up to 240 FPS. Requires your own game dump. No game files included.项目地址https://gitcode.com/gh_mirrors/go/gow3_pc点击查看免费下载相关推荐ok-ww 鸣潮自动战斗与一键日常完整使用指南新手向免踩坑ok ww 鸣潮自动战斗与一键日常完整使用指南新手向免踩坑 ok ww 是一个开源免费的鸣潮自动化程序帮你把每天那套固定动作——登录、刷日常本、打无音RPA计算机视觉如何永久保存微信聊天记录打造个人数据主权的终极指南如何永久保存微信聊天记录打造个人数据主权的终极指南 你是否曾担心珍贵的微信聊天记录会随着时间流逝而消失那些与亲友的温馨对话、重要的工作沟通、充满回忆的群聊记RevokeMsgPatcher修改信息ModifyInfo存储补丁配置数据RevokeMsgPatcher修改信息ModifyInfo存储补丁配置数据 引言 在PC端即时通讯软件防撤回补丁开发中如何高效管理和存储不同版本的补丁配置桌面应用逆向工程即时通讯创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站