歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

關于《火焰紋章:曉之女神》的亂數生成規律的初步研究

來源:本站整理 作者:佚名 時間: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.nkppsz.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        秒速时时彩骗局