欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

关于《火焰纹章:晓之女神》的乱数生成规律的初步研究

来源:本站整理 作者:佚名 时间:2019-08-08 TAG: 我要投稿

本人是火焰纹章、英雄无敌等战棋类游戏的业余玩家,虽然技术一般,但是乐在其中,玩过GBA三作,但是后来由于工作繁忙,一直没有时间体验最新作品,闲暇之余准备把一些经典拿出来体验一下,于是就开始了苍炎和晓女之行(当然是模拟器玩家),玩火纹这种战棋类游戏免不了使用S/L大法来避免全军覆没或者练出个奇葩,但是运气差的时候升级有可能一个点都没有,运气好的时候点数又会全满,不断读档凸点随机性太大而且很耗费时间,强迫症犯了就想如何能不用修改器让升级点数自然最大化(奇怪的症结)。当我体验了苍炎之后,发现同一个即时存档升级的时候点数总是一定的,因此也萌生了找到苍/晓的升级算法,并写一款可以预测升级点数工具的想法。
PS:本文仅用于技术讨论与思路拓展,我们尊重原作者的知识产权,如果您喜欢《火焰纹章》系列,请购买正版。
经过网上一番折腾,发现目前有这么些资源/提示:1.属性修改器很多,苍炎本身也自带金手指作弊码,但晓女没有。2.大神指出火焰纹章系列游戏的如必杀、升级、双击等随机事件主要由其中的乱数机制控制,GBA的乱数也有大神已经研究出是通过乱数表查询来获取。改变乱数的方法在各作都不一样,从论坛上以往公布的方法有的是通过查看属性页,有的是通过看路径,有的是通过斜向瞄准等等。
为达到目的我们主要解决三个问题:1.逆向乱数生成算法。2.升级点数计算方法。3.编写自动化预测升级点数。
主要工具:
1.Dolphin5.0-6304(主要是自己电脑上就是这个版本,新的应该也可以)
2.IDA/GHIDRA(静态反汇编工具,推荐GHIDRA,因为可以反编译POWERPC指令,有IDA的POWERPC插件的当我没说)
3.cheat engine 6.7 (最新的我也没用过,应该没啥区别)
4.带HEX功能的文本编辑器(UE、010都可以)
0×01前置知识
WII是任天堂2006年推出的家用游戏机,其CPU是POWERPC,因此其游戏的系统指令集也是基于POWERPC的。晓女是2007年任天堂在WII上开发的一款游戏,是火焰纹章的系列作,可以构卖WII主机和游戏进行体验,也可以在网上下载晓女的镜像,通过跨平台模拟器dolphin完美模拟,PC版模拟器可以对游戏进行实时调试,这就给我们分析这款游戏带来了方便。
0×02 内存定位
DOLPHIN在载入游戏镜像后,会申请一块内存用于模拟游戏内存,此内存有游戏的主要代码,其地址在每次游戏启动的时候随机申请,然后通过模拟机制模拟WII的系统运行,游戏内存运行的地址通过dolphin调试模式可以看到其模拟的地址始终从0×80000000开始。可以通过模拟器调试模式的内存->转储主内存把当前的主要内存保存为文件,位置在:C:\Users\你的账户名\Documents\Dolphin Emulator\Dump\ram.raw

旧版的32位dolphin申请的模拟器地址基本是在7FFFFFFF-80000000区间,而新版取消了以往的直接申请模式,地址随机变化,因此我们首先第一步就是要把游戏的模拟内存找到,这样便于动静态分析。目前网上没有一个统一的办法可以直接找到,这里我通过多次尝试找到一个比较稳定的查找映射内存地址的办法,就是用CE的内存区域查看,寻找dolphin.exe的内存结束地址,往下的第一个大小为0×2000000的MAPEPED内存地址就是目标内存地址。

从截图可以看到目标内存地址起始为RFEJ01正是模拟器的内存起始内容。这样我们就找到了模拟器ROM在内存中的地址。

第二步是找到合适的调试和监控工具,dolphin用于动态跟踪代码很有用,但是有个缺点就是功能单一,断点只有位置和内存断点,可以查看内存,但是dolphin的调试界面很不友好,在游戏的时候就没法监视,我们这里使用CE来定位和监控内存变化。但是CE中的内存地址空间和dolphin不同,在查找代码的时候很不方便,这里我找了一个网上大神的插件,可以修改CE在内存中部分内存的映射地址,也就是可以把CE监控的目标程序的内存地址空间映射到指定起始内存地址。

我们使用这个工具将前面找到的ROM内存地址重新定位为0×80000000,这样CE中的内存地址就和实际地址一致了。

0×03 寻找乱数地址
火焰纹章游戏里的各类操作如攻击、升级、必杀、双倍攻击等特效的触发都是由一个随机数来判定的,但是这个随机不是真随机,而是自己定义的一套随机算法,以往火纹的随机数是通过查询一张或几张乱数表,通过消耗乱数的方式来达成随机效果,网上也大概查了一下,苍炎可以通过查看人物属性改变乱数,晓女通过斜向瞄准修改。为了验证这个乱数的随机性,我通过使用Dolphin的即时存档来测试:先保存一个即时存档通过前面的乱数变化的方式,如查看几次属性页,斜向瞄准几次,通过一次攻击击杀目标获得经验值升级,检测升级加的属性点数和类型来判断这个随机数的随机性。通过多次试验,我发现同一个即时存档在执行相同操作的时候,如查看几次属性页,瞄准几次之后,升级点数和类型都是一定的,甚至必杀和双倍攻击等随机事件都是完全按照顺序发生,因此我猜测火纹的随机与时间无关,只与指定操作有关,这也为我们可以预测升级点数提供了可能。
下面就开始查找这个随机数的地址。这里我们利用CE的变化值和非变化值的监控来达到目的,首先使用CE监控dolphin进程,并按照上述方法将ROM内存找到并重定位,利用未知初始值->变化的值->不变的值->变化的值…反复查找,最后找到有如下地址是可疑的

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载