尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

《女神异闻录3 Reload》内存修改实战:从CE指针扫描到CT表制作

《女神异闻录3 Reload》内存修改实战:从CE指针扫描到CT表制作 1. 从“改不了”到“随心改”一次《P3R》面具修改的探索最近在重温《女神异闻录3 Reload》打到中期想给主力面具“塔纳托斯”凹一下技能和属性结果发现游戏内的绞刑和电椅系统随机性太大刷起来太肝。作为一个老PC玩家很自然地就想到了用Cheat Engine简称CE来“手动优化”一下。但上手一试就发现事情没那么简单。直接搜索面具的经验值、等级甚至技能地址要么是搜出来一堆动态地址改完就失效要么就是根本搜不到。网上能找到的教程大多停留在改改金钱、经验这种基础数值关于面具这个核心养成系统的深入修改资料少之又少。经过一番折腾我终于摸清了门道。这篇文章我就来详细拆解一下如何稳定、精准地定位并修改《P3R》中任意面具的属性、技能和等级让你彻底告别“刷子”生活打造属于自己的完美仲魔。2. 准备工作理解《P3R》的内存数据特点在动手之前我们必须先理解《P3R》这款游戏或者说大部分现代游戏在内存中存储数据的特点这直接决定了我们修改的策略。2.1 为什么直接搜索“数值”会失败很多新手第一次用CE会尝试直接搜索面具的“力量值”是85或者“等级”是50。这种方法对于静态、明文存储的简单游戏可能有效但对于《P3R》这类使用复杂对象管理和可能带有简单混淆机制的游戏几乎必然失败。原因在于游戏中的面具是一个复杂的“对象”Object。它不仅仅是一个数字而是一个包含了等级、属性、技能列表、经验值、状态等数十个字段的数据结构。这个数据结构在内存中通常以一个“基地址”为起点连续存放。我们看到的“力量85”在这个结构体里可能只是一个4字节的整数如 0x00000055但它存储的位置是相对于这个面具对象基地址的一个固定“偏移量”。更关键的是每次你进入天鹅绒房间、战斗后甚至只是切换一下菜单游戏都可能重新在内存中加载或移动这些对象数据。你之前找到的存放“力量85”的那个具体内存地址下次可能就存放着其他数据了。这就是所谓的“动态地址”。我们的目标不是找到这个会变的动态地址而是找到指向这个动态地址的“指针”或者找到这个面具对象结构的“基地址”。2.2 核心思路定位面具列表与结构偏移经过分析《P3R》中玩家持有的面具列表很可能被维护在一个全局的数组或链表里。我们的修改路径应该是定位面具列表的基地址找到一个相对稳定的地址它指向了存放所有面具对象指针的数组。分析单个面具对象的结构确定在这个对象中等级、各属性值、技能ID等关键数据相对于对象起始地址的偏移量。通过“基地址偏移”进行精准修改结合第一步找到的列表基地址和第二步找到的偏移量我们就能稳定地读写任意一个面具的数据。这听起来有点抽象接下来我们通过CE的具体操作把它变成一步步可执行的流程。3. 实战第一步锁定你的面具列表这是整个过程中最关键也最需要耐心的一步。我们的目标是找到一个指针它能带领我们找到当前持有的所有面具。3.1 利用经验值变化进行首次扫描虽然直接搜等级或属性不好用但有一个数值是持续变化的非常适合作为突破口面具的当前经验值。打开游戏和CE将CE附加到P3R.exe进程上。在游戏中选择一个你想要修改的、且尚未满级的面具记下它当前的精确经验值例如1250/4800。在CE中选择“首次扫描”扫描类型选择“精确数值”数值类型选择“4字节”大多数游戏经验值用4字节整数存储输入你面具的当前经验值例子中是1250。扫描会得到大量地址。先不用管。去战斗一场让这个面具获得一些经验值哪怕只有几点。战斗结束后再次查看该面具的经验值例如1275/4800。回到CE在扫描结果列表上点击右键选择“更改记录值”将数值改为新的经验值1275然后点击“再次扫描”。这次扫描类型选择“变动的数值”。重复步骤5和6一到两次。每次经验值变动后都用新的数值进行“再次扫描”扫描类型选“数值增加了…”或“数值减少了…”会更精确。地址列表会迅速减少。理想情况下你会筛选到只剩下几个甚至一个地址。这个地址就是存储你面具当前经验值的动态地址。3.2 找出是什么访问了这个地址现在我们有了一个动态地址但我们需要找到它的“根”。在CE的扫描结果列表中右键点击你找到的那个经验值地址选择“找出是什么改写了这个地址”。会弹出一个新窗口。回到游戏进行一些会导致经验值变动的操作比如再战斗一次或者使用增加经验的物品。此时CE的“找出是什么改写了这个地址”窗口里会出现一条或多条汇编指令记录。这行指令就是游戏代码在更新经验值。双击这条记录它会出现在CE主界面下方的地址列表中。注意看这条指令旁边通常会显示一个类似[寄存器偏移]的地址。例如mov [rcx000001A0], eax。这里的rcx很可能就存放着这个面具对象的基地址而000001A0就是经验值在这个对象结构中的偏移量。记下这个偏移量本例中是0x1A0。3.3 追踪指针定位面具列表我们现在有了一个面具对象的疑似基地址存储在rcx寄存器中但它是临时的。我们需要找到存储这个基地址的指针链。在CE主界面的地址列表区域右键点击你刚才添加的那条汇编指令记录选择“找出是什么访问了这个地址”。同样会弹窗。回到游戏进行一些会读取面具信息的操作比如打开状态栏查看该面具或者进入天鹅绒房间。访问记录会出现。在这些记录中寻找mov rcx, [某个地址]或lea rcx, [某个地址]这类指令。这表示游戏从一个固定的内存位置加载了面具对象的地址到rcx寄存器。这个[某个地址]就是一个指向面具对象地址的指针。在CE中这个地址通常显示为绿色。双击它添加到地址列表。现在你有了一个指向面具A的指针。但这还不够我们需要找到存放所有面具指针的数组。右键点击这个新添加的指针地址选择“指针扫描”。在弹出的指针扫描窗口中设置一个合理的偏移范围比如-500到5000然后开始扫描。这会找出所有可能指向你面具对象地址的静态指针链。扫描结果可能成千上万。我们需要筛选。一个有效的技巧是在游戏里将面具A从你的库存中删除合体掉或者释放掉。然后回到CE的指针扫描结果界面点击“重新扫描内存”并过滤掉“已改变”的指针。因为面具A的对象已经被释放指向它的正确指针链的数值会变为0或一个非法地址。大量错误的指针会被过滤掉。在剩下的指针中寻找那些看起来像是“基地址”的。通常这些地址的值本身可能是一个较大的、以0x7FF或0x140开头的模块内地址指向游戏主模块而偏移量则是一个固定的值。你需要结合多个面具进行同样的指针扫描然后对比它们的指针链。如果发现多条指针链的“基地址”是同一个只是最后的偏移不同那么这个“基地址”就极有可能是面具列表数组的起始地址而不同的偏移则代表了数组中不同面具的索引位置。这个过程可能需要你对同一个面具操作多次或者对两个不同的面具重复上述步骤进行交叉验证才能最终确定一个稳定的面具列表基地址。一旦找到请务必在CE中将其保存为指针并添加注释例如“P3R面具列表基址”。4. 实战第二步逆向面具对象的结构找到了面具列表的基地址假设我们叫它BaseAddr并且知道第一个面具的偏移是0第二个是0x08因为每个指针占8字节那么[BaseAddr0]这个地址里存放的值就是第一个面具对象的基地址我们叫它MaskObjAddr。现在我们需要知道在MaskObjAddr这个地址开始的一片内存里各个属性是怎么排布的。4.1 确定等级和属性的偏移我们已经从经验值的访问指令中知道了经验值的偏移可能是0x1A0。我们可以用类似的方法或者用更高效的方式手动添加指针并观察。在CE地址列表中手动添加一个地址[BaseAddr0]类型设置为“8字节”这应该读出第一个面具对象的地址MaskObjAddr。再添加一个地址[MaskObjAddr1A0]类型“4字节”这应该就是第一个面具的经验值。确认它能正确显示。现在开始试探其他偏移。添加地址[MaskObjAddr100][MaskObjAddr110][MaskObjAddr120]... 类型都先设为“4字节”。然后回到游戏查看第一个面具的等级、力量、魔力等属性。在CE中依次修改你添加的这些地址的值比如把[MaskObjAddr110]改成99。然后切回游戏看哪个属性变成了99。通过这种“暴力”试探你可以逐步摸清各个属性对应的偏移量。通常等级、HP、SP、力量、魔力、耐力、速度、运气这些基础属性会连续或近似连续地排列在一起。注意修改前务必先存档修改时建议用较小的、合理的数值如把50改成99进行测试避免改出负数或超大值导致游戏崩溃。4.2 定位技能列表面具的技能列表是修改的精华也是难点。它通常是一个数组每个技能占用一个条目可能是2字节的技能ID也可能是4字节外加一些状态字节。技能列表的起始偏移可能离基础属性区有一段距离。你可以尝试在基础属性区之后的大片区域比如从200开始以“2字节”或“4字节”类型添加地址并修改。一个更系统的方法是找两个技能完全不同、且技能数量已知的面具。分别记录下它们从疑似技能列表起始偏移开始的一片内存数据例如从300到350的字节。用十六进制视图对比这两片数据相同的部分可能是其他信息不同的部分很可能就是技能ID。结合游戏内技能编号表需要从游戏文件或社区资料中查找可以确定技能ID的存储格式。在《P3R》中一个面具最多拥有8个技能。所以技能数组的长度可能是固定的。当你修改了某个偏移的值为一个已知技能ID例如亚基的ID是0x0A后回到游戏发现面具多了一个“亚基”技能你就找到了。4.3 记录你的发现将你找到的偏移量系统地记录下来这非常重要等级 (Level) 偏移:0xXX力量 (Strength) 偏移:0xXX魔力 (Magic) 偏移:0xXX耐力 (Endurance) 偏移:0xXX速度 (Agility) 偏移:0xXX运气 (Luck) 偏移:0xXX当前经验 (Current EXP) 偏移:0x1A0(示例)下一级所需经验 (Next EXP) 偏移:0xXX技能列表起始偏移 (Skill List Start):0xXX技能条目大小 (Skill Entry Size):0x2或0x4字节有了这个偏移量表结合之前找到的面具列表基地址BaseAddr你就可以通过[[BaseAddr 面具索引*8] 属性偏移]这个公式访问到任何一个面具的任何一个属性了。5. 制作与使用CT表一劳永逸的修改方案每次打开游戏都重复上述指针扫描过程是不现实的。我们需要将成果固化成一个Cheat Table (.CT) 文件。5.1 在CE中创建指针脚本假设我们最终确定面具列表基地址静态指针是P3R.exe1234568第一个面具对象的地址就是[[P3R.exe1234568]0]等级的偏移是0x114那么在CE中点击“手动添加地址”。勾选“指针”。在地址输入框中填入P3R.exe1234568这是基地址。在下面的偏移列表中第一行填0这是第一个面具的索引偏移第二行填114这是等级属性的偏移。这样CE就会自动计算[[P3R.exe1234568]0]114这个地址。给这个地址起个名字比如“面具1-等级”。重复步骤为力量、魔力、技能等创建指针。对于技能由于是数组你可能需要创建8个指针偏移量分别为技能起始偏移0,2,4... 以此类推。5.2 使用“指针扫描”功能验证并加固在保存CT表前最好使用CE的“指针扫描”功能对你找到的P3R.exe1234568这个地址进行扫描寻找指向它的更稳定的指针链。有时P3R.exe1234568本身可能也是一个动态地址但存在一个“全局指针”指向它。找到这个最顶层的静态指针你的CT表在游戏更新后可能存活得更久。5.3 保存与分享CT表将所有定义好的指针地址整理好点击CE菜单的“文件”-“保存”将你的成果保存为.CT文件。下次玩游戏时只需加载这个CT文件所有地址都会自动解析你可以直接修改数值。6. 高级技巧与风险规避掌握了基本方法后还有一些技巧能让修改更安全、更高效。6.1 批量修改与脚本编写如果你想把所有面具的等级都调到99手动一个个改太麻烦。CE支持Lua脚本和Auto Assembler。你可以写一个简单的AA脚本遍历面具列表指针数组假设有32个位置对每个有效的面具对象地址都写入等级值99。这需要更高级的CE和汇编知识但一旦写成效率极高。6.2 修改的边界与风险游戏崩溃最常见的风险。如果你写入了错误的偏移或者修改了非预期的内存比如写入了代码段游戏会立刻崩溃。修改前存档是铁律。存档损坏修改了某些关键数据如面具的唯一ID、关联的剧情标志可能导致存档无法读取或在特定剧情处崩溃。建议只修改显而易见的数值属性等级、五维、技能ID不要动那些你不理解其作用的标识位。成就/奖杯失效大多数单机游戏不会因为内存修改而禁用成就但并非绝对。如果你在意这个修改前请三思。在线功能风险虽然《P3R》是纯单机但有些游戏带有在线验证或排行榜。修改此类游戏的数据可能导致封禁。务必只在对战平台或官方明确允许的离线模式下进行修改。6.3 找不到地址或指针失效怎么办游戏更新是最大的敌人。一次版本更新很可能完全改变了内存布局你之前找到的基地址和偏移全部失效。此时没有捷径只能按照本文第3、4章的方法重新进行逆向分析。这也是为什么社区共享的CT表在游戏更新后经常不能用的原因。另一种情况是游戏使用了更复杂的内存保护或加密。这时单纯的数值扫描可能无效。你需要尝试“未知初始值”扫描通过数值的增大/减小来追踪或者使用CE的“调试器”功能下断点分析游戏读写数据的函数这需要相当的逆向工程功底。从直接搜索数值的挫败到理解动态地址与指针链的概念再到通过经验值变化定位对象、逆向结构偏移最后固化成方便的CT表这个过程本身就是一次有趣的游戏逆向工程入门实践。它带给你的不仅仅是几个满属性的面具更是一种解决问题、探索未知的系统性方法。修改的乐趣在于“掌控”和“探索”但务必记住过度的修改可能会迅速消耗掉游戏本身的养成乐趣。我的建议是适度修改扫清那些重复性过高、设计不合理的“肝点”把时间留给体验更精彩的剧情和战斗策略本身。最后在社区分享你的CT表时请务必注明对应的游戏版本号并提醒他人修改存档的风险这是一种良好的共享精神。
返回列表