青蛙旅行 — Unity3d類安卓遊戲逆向分析初探
0x01 前言
最近一款養蛙的遊戲非常火,但是語言是日文的。下載了一個漢化的,結果廣告一大堆。反編譯之後查看是Unity遊戲,之前沒接觸過,就想著跟著看一下。關於這類的破解,可以在52pojie上進行搜索。有很多類似的案例。
這裡主要採用的工具為dnSpy,dnSpy 是一款針對 .NET 程序的逆向工程工具。反編譯和打包採用的是apktool,當然也可以直接用改之理等工具。
雖然本文以一個小遊戲為實例,但這個思路值得安全滲透人員借鑒。
0x02 修改數據
下載app後重命名為zip文件,發現存在assetsinDataManaged
目錄,那麼該遊戲應該為Unity遊戲。
那麼需要分析的文件就是就是Assembly-CSharp.dll
。
首先修改一下抽獎券的數量。安裝遊戲後,找到抽獎的地方。抽獎的時候提示券不足。
使用dnSpy打開Assembly-CSharp.dll
文件,然後搜索字元串」足」,可以發現有兩個,打開後發現是第一個。
由此可以猜測TicketStock代表抽獎券庫存。
ticket表示抽獎券數量。
當頁查找ticket,發現有一個initialize方法進行初始化。我們將此處的數量改為1000.
快捷鍵Ctrl+E編輯IL指令。找到ticket變數後,將ldc.i4.0改為ldc.i4,然後將數值改為1000.
確定後,發現ticket數值已經改變。
打包後並安裝apk。
打開抽獎界面發現數量已經改變為1000。
這樣雖然達到了修改抽獎券的效果,但數量再大,總會被抽完的。那就換種方法,比如說抽獎的時候增加獎券,或者獎券一直不變。這裡採用獎券數量固定的方法,使其不會變動。
if (SuperGameMaster.TicketStock() < 5){ ConfilmPanel confilm = this.ConfilmUI.GetComponent<ConfilmPanel>(); confilm.OpenPanel("ふくびき券が足りません"); confilm.ResetOnClick_Screen(); confilm.SetOnClick_Screen(delegate { confilm.ClosePanel(); }); return;}
已知抽獎的時候獎券是從SuperGameMaster.TicketStock()
獲取的,找到該方法。令其返回值為固定的數值。
右鍵編輯IL指令。
將其值修改為9000.
然後保存後打包並重新安裝。
此時無論抽多少次,獎券都不再變化。
另一個就是修改三葉草的數量了。三葉草是該遊戲中流行的貨幣,買東西都是需要該物品。同理找到CloverPointStock()
方法。
將其返回值修改為8888.之後就可以隨便買買買了,三葉草的數量也不會發生變化了。
0x03 漢化
然後就是進行漢化了。漢化的方法和上面的類似。首先搜索需要修改的文字。例如給小青蛙起名字的時候。直接進行字元串搜索。
然後修改為對應的中文就行了。
進入遊戲查看
修改其他處的文字也是這樣操作即可。當然這種修改方法比較慢,還有另外一種,直接將他人漢化過的dll文件複製進來,可以快速達到漢化的目的,也沒有廣告的煩惱了。
0x04 總結
這個遊戲修改起來比較簡單,首先判斷為該遊戲為Unity3d。然後使用dnSpy來對Assembly-CSharp.dll
文件進行修改。根據特定的字元串找到需要修改的位置,修改後進行打包簽名後即可。
0x05 遊戲攻略
以下內容均來自知乎
作者:黃小秋鏈接:https://www.zhihu.com/question/68733553/answer/305463907
呱是如何旅行的?
確定了地點之後,呱會開始旅行:
- 攜帶物品會決定蛙最長能旅行多久,6 ~ 72 小時不等。
- 初始體力由攜帶物品決定,以 100 為基數提升。*物品的具體屬性參考下面的圖鑑
- 經過圖上的一條路(邊)的時候,道路的地形屬性和所攜帶的物品屬性互相作用,會決定呱實際消耗的時間和體力。
- 路上可能會遇見小夥伴,會在之後的旅行中結伴而行,從而出現在明信片中。
- 根據路途屬性,有一定概率會寄相關的明信片。
- 當體力不支的時候,蛙必須停下來休息 3 小時,休息完之後體力會恢復到 100。休息時間也算作旅行時間。
- 當到達目的或者旅行時間耗盡的時候,蛙就會回家。
- 回家時會攜帶三葉草和抽獎券。
- 如果在時間耗盡前到達了目的地,蛙會在此基礎上帶回當地特產和收藏品。
所以如果你的蛙很久都沒回家,回家了也沒有帶土特產,可能是路途上多次體力不支,暈倒在路邊。
呱在每條路上的耗時是怎麼計算的?
設:
為當前道路 耗時
為當前道路的 地形增加耗時
為當前道路的 地形,
為攜帶物品數量
依次為攜帶的第
件物品中所有具有 普通、山地、大海、洞穴、任意地形 移動速度 的效果值。
如果當前道路是 普通 地形,則耗時因疊加 移動速度 效果而減少:
或者 如果當前道路是 山地、大海、洞穴 地形,基礎耗時不變,地形增加耗時因疊加 移動速度 效果而減少:
如果攜帶了 乳蛋餅 (のひ?るのキッシュ)這種 全地形 移動速度 提升的物品,則會在此基礎上再次疊加 移動速度 效果:
最終獲得的
就是該條道路上的實際耗時。
呱離家出走了怎麼辦?
如果長時間沒有準備便當,包里和桌上都沒有食物,呱會憤然離家出走(どこかへ出かけています)。
這個時候在桌子上放上吃的,呱就會在 5~30 分鐘內回家。
有趣的是,離家出走也算作成就計算中的旅行次數…emmmm。
道路有哪些屬性?
連接不同地點之間的每條路 (edge) 都有以下幾個屬性
- 地形
四種地形分別是 普通、大海、山地、洞穴
- 耗時途徑這條路的體力和時間損耗,分為基礎耗時和地形增加耗時呱需要跋山涉水自然會耗時久一點
- 明信片概率明信片上不同元素出現的概率據說所有的地圖元素都有真實原型
- 遇見夥伴遇見特定夥伴的概率
每件物品都有什麼效果?
奉上這張吐血整理的物品效果圖鑑:
有五類不同的物品
- 便當
商店購買或者抽獎獲得的食物
- 幸運符除了四葉草和可以購買的幸 (tǔ) 運 (háo) 鈴之外,都要抽獎獲得
- 道具商店購買
- 特產呱旅遊時獲得
- 收藏品特別的特產,通常在縣府獲得,無法使用
屬性分類
- HP
- 最大時間(小時)決定蛙的旅行時間
- 初始體力提升(%)增加一開始一鼓作氣能旅行的距離
- 隨機體力提升(%)隨機額外增加體力提升的最高百分點
- 物品幾率
- 三葉草獲得三葉草數量
- 額外隨機三葉草隨機額外獲得的最大三葉草數量
- 抽獎券獎券數量
- 物品數量增多增加獲得目的地收藏品的概率
- 決定地區對應地區被選中的概率,如果值為 D 則可以直接決定目的地所在區域
- 移動速度根據地形不同,提升移動速度,減少途徑所耗費的時間,在相同旅行時間內可以走更遠
- 朋友遇到特定旅行夥伴的概率
- 遭遇地形途徑特定地形時候獲得相應明信片的概率
- FLAG 屬性立一些特定的 Flag,主要影響成就系統,下面會寫到
如何科學使用物品?
這裡用幾個例子來展示物品和路線結合的效果
- 決定想去的地區攜帶的便當和抽獎獲得的護身符(お守り)可以提升選擇特定地區的概率。 抽獎獲得的車票(きっぷ)可以直接決定所去到的地區。例:想去北方,使用北國きっぷ。
- 影響路途的距離和時間帶 最大時間 值高的食物吃走得遠,帶 體力提升 值高的食物吃走得快耗時少。
- 快速通過沿途路線的地形帶有地區速度加成的食物或者道具,可以增加特定地形的移動速度。不同物品的 移動速度 效果可以疊加,詳情查看上面的解釋。
- 匹配在道路上遇到的夥伴如果在途徑會遭遇夥伴的道路,特定物品可以增加實際遭遇概率例:抽獎抽到的黃色ぼうろ(餅乾)可以增加路途中遇到螃蟹的幾率。
綜合運用(敲黑板!!!)
呱想去秋田県男鹿市看燈塔
- 在地圖上找到 秋田県(3022) 在北方。
- 便當選擇 あさつきのヒ?ロシキ (蔥餅?)可以提升去北方的概率。
- 攜帶 青色のお守り (藍色護身符)可以提升去北方的概率。
- 如果有 北國きっぷ(北方車票?)可以直接決定去北方,上面的便當和護身符可以換別的。
- 通過目的地概率表發現攜帶各類帳篷前往 3022 目的地的概率更高。
- 查看可能的路線發現從起始點 3000 到 3022 之間會途徑很多山路。
- 攜帶 ハイテクテント (高級帳篷?)增加山地移動速度更顯著。
- 如果還有空餘,可以帶上 よつ葉(四葉草)或者 幸運の鈴,提升帶回物品的概率。
0x05 參考鏈接
- https://paper.seebug.org/519/
- https://www.zhihu.com/question/68733553/answer/305463907
推薦閱讀:
※CTF逆向題中的編程技巧
※有Android逆向基礎如何學習Android漏洞挖掘?
※構造函數和析構函數在不在 vftable 裡面?
※R2逆向學習(1-3)
※自動化二進位文件分析框架:angr