以下内容完整转载自:Eiffel2018 原创发布:【金手指教程6】对比存档找出想要的资料
之前有网友问我某些道具开合或通关FLAG等,只是0和1的,怎找金手指,
我说用存档对比, 他不信,又说存档都会加密,结果都是不行.
刚刚我就用了 对比存档的方法,找到一个难找的, 现在我来做一个示范.
以 无双风花雪月 为例,二周目后, 使用进军之笛 可马上通关, 但代价是通关只得到D级, 而不是S级,
应网友的建议, 在这改一下.
(因这建议合乎我做金手指的原则: 加速通关时间, 增加游戏可玩性, 不做大规模改动)
本初, 我先尝试以 4代表D, 3代表C, ….. 0代表S般搜. 结果搜不到.
接下来, 用模糊搜寻, 先在未通关时用UNKNOWN, 然后用进军之笛搜NOT A, 再打一次S级,搜NOT AB, 仍是搜不到正确的.
又尝试对比显示介面, 搜寻荧幕上看到的数字, 结果还是搜不到(平常这方法搜购物道具介面很灵验)
我甚至用 ASCII的A是0x41, D是搜0x44, S是搜0x53 还是搜不到. (不过这方法,就算搜到,也要在GDB追查很久才得知关卡资料的)
因工作关系比较忙只好暂时放弃. (搜不到就是运气不佳,用错了方法. 或许过几天转运就能搜到了)
就过了几天,忽然想到,可试试 用存档来对比吧,
我先把游戏储存 2次(放在位置1和位置2)
按道理, 这两个存档 应该内容是没有差别的, 只是游玩时间差几秒.
用JVSK备份, 然后用FTP拷到电脑, 用Beyond Compare比较
(好处是不用重启游戏,或许你也可以用DBI拷存档出来,但有时要关了游戏才看到存档的)
这样做, 目的只是看看差别大不大, 有没有加密, 有没有Check Digit等.
今次显然变化很少, 数值并没有加密的. (其实任天堂游戏存档很少加密的,PC可能较多吧)
这少许的变化, 或者只含简单的Check digit吧 (意思就是其中一个字节是用来记录加总的尾数, 通常遇到这样子简单的话,其中一个Byte加了1,另一个Byte减1,便可瞒天过海)
有了初步判断,再来实际做2个只差分毫的存档:
1) 先在使用进军之笛前存档一次,
2) 再使用进军之笛后立刻存档一次.
然后照旧用JVSK备份, 用FTP拷到电脑, 用Beyond Compare比较
今次2份存档的变化比之前大一些.
但我们仍是可以猜测到目标位置在哪儿.
左面 是未用进军之笛 (当时有89个),右边是用了进军之笛(这时剩下88个)
也就是16进制的 0x59 和0x58, 在中央的地方就是道具的位置了.
但这个资料对我价值不大, 我是需要找出 关卡未打开, 跟关卡打通了获得D级时 的资料位置.
在存档近末尾的地方, 看到一组 14 14 14 05 05 05 05 FF 05 变成了 14 D4 14 05 05 05 00 FF 00
猜测这个应该是关卡的资料吧.
(如果 05代表未通关, 00代表D级, 那么 01代表C级, 02代表B级,03代表A级, 04代表S级, 这是合理的安排.)
当然, 可能还有其他地方引起了存档变化,例如有些记录关卡是否打开了的FLAG 改变. 这不影响我做的金手指, 暂不一一推考研究了.
接下来返回游戏,再到 EdizonSE 搜相对应的内存位置.
就用 Multi target mode 搜. 这样搜要留意它是 alignment=4 即是每4个字节对齐,
所以要看清楚存档位址是由哪个尾数开始, 修改合适的偏移值.
(这次地址是8830C, 尾数是C 正好可整除4. 就把第一个 offset 设成0便可)
结果搜到2笔资料,
不知哪一个正确. 就逐一去试改一下
在每一笔资料中, 分别把 00 改成 01 / 02 / 03 / 04看看改了的地方 是 C , 是B 还是 A ?
结果试出来, 第二个有效果, 最后把两个原本是00的地方 改成03. 看看效果
又试试把所有05都改成04, 结果4种难度都变S了
之后可以还原未使用进军之笛的存档(确保之后可以再使用 进军之笛)
看一看地址有没有变, 如有需要便再搜一次 14 14 14 05 05 05 05 FF 05 . (这游戏较特别, 没有重启, 地址固定,节省了一点点时间).
(或许你够强大的话,可以不用读之前的存档, 在GDB的资料地址一直往下翻,找到下一个关卡的地址,在该处下断点,也是可以的.)
接下来,就是把目标地址抄起: heap+8335A46. 进入GDB,
ALT+F7执行markRegions64.py之后, 按G跳到 heap+8335A46
之后在会变动的两个地方加写入断点.
然后再到游戏执行一次进军之笛
有结果了, 一按马上触发断点
main:00000000010BB8B4 STRB WZR, [X10]
这 [X10] 就是用来记住这关卡取得甚么等级
WZR = 0 就是D级,
如果改成 4 就可变为S级
安全做法是做 Code Cave 去设一个变数做4,然后写到[X10]
我偷懒,直接改动它上面几句没意思的东西
main:00000000010BB8A8 LDRB W11, [X10]
main:00000000010BB8AC CMP W11, #5
main:00000000010BB8B0 B.CC loc_7EDB4BF8B8
把对上一行直接改为 MOV W11, #4
然后 STRB W11, [X10]这便可以了
不过,这做法只处理了一个断点,
另一个位置也要找出来,
先关了这断点,再F9继续执行.
出现另一个了断点.再照样子改.
然而, 这样子改可能只是改了[超难]等级中的S,
如果其他玩家不是用超难来玩呢?
所以我要再往上翻, 看看有没有其他写入地方 (如果不用人眼去看代码, 或者可多做几个断点,同时改游戏难度去测出来)
结果看下来要改的地方, 应该就只是这2处
我再整理下,
010BB884 MOV W13, #4
010BB888 STRB W13, [X12]
还有
010BB8B4 STRB W13, [X10]
只改这三行应该足够.
近日我都用 python Script 写金手指,方便以后打补丁UPD,升级金手指做最新版本.
在IDA PRO打开不同版本的NSO, 执行一次这Python Script
金手指代码便全部出来了.
本教学到此为止. 希望大家好好利用. 发掘一些难找到而又好用的金手指
如您从本文得到了有价值的信息或帮助,请考虑扫描文末二维码捐赠和鼓励。
如本文对您有用,捐赠和留言 将是对我最好的支持~(捐赠可转为站内积分)
如愿意,请向朋友推荐本站,谢谢。
尊重他人劳动成果。转载请务必附上原文链接,我将感激不尽。