《旅行青蛙》反編譯/破解過程

Copyright@M4x, 小學生 from 10.0.0.55html

原文地址:python

這篇博客是應學姐之邀給學弟學妹寫的掃盲教程,較爲基礎程序員

前言

破解旅行青蛙的初衷很簡單,女友想養青蛙,三葉草長得太慢,做爲一名二進制黑闊又不肯屈服於網上小廣告成堆又不知道有沒有後門的破解版,因而就參考知乎的高贊回答本身給旅行青蛙添加了無限三葉草和無限抽獎券的功能。編程

受桐姐之邀,給學弟學妹簡單介紹一下反編譯技術,以及反編譯技術是怎麼運用到破解旅行青蛙這款遊戲上的,力求可以用通俗易懂的語言給對此感興趣的同窗講解清楚。windows

何爲反編譯

咱們知道,高級語言源程序通過編譯生成可執行文件(事實上有預處理,編譯,彙編,連接四步,這裏籠統的歸納爲編譯,這個過程在《程序員的自我修養》這本書中有詳細的介紹),那麼加上一個「反」字,也就是從可執行文件反向生成高級語言源碼的過程。函數

聽起來很簡單但實際上反編譯是逆向工程最核心最困難的一步,一般作不到把可執行文件逆向出高級語言源代碼,只能轉化成彙編程序,即便某些高級語言(C#,vb,python等)反編譯出源代碼相對簡單,獲得的代碼也每每是被混淆過的。工具

上圖是windows平臺下強大的反編譯工具OllyDbg,但也只能獲得彙編級的代碼。學習

對於部分C族語言(C/C++),藉助IDA的HexRay插件能夠獲得近似源碼的僞代碼,但這些僞代碼也每每是有錯誤的。插件

破解青蛙

但幸運的是,旅行的青蛙是基於Unity開發的.NET程序,對於.NET程序,反編譯技術較爲成熟。htm

首先解壓旅行青蛙的apk

apk實際上就是一個壓縮包,windows下把後綴.apk改成.zip便可解壓,值得一提的是,word、excle、powerpoint等文件的實質也是壓縮包,解壓這些文件也會有不少好玩的事情發生。

經過解壓後存在assets\bin\Data\Managed目錄判斷出遊戲爲Unity遊戲,那麼程序的主要代碼就在assets\bin\Data\Managed\Assembly-CSharp.dll中

咱們只需對Assembly-CSharp.dll進行反編譯便可,這裏使用的是dnspy工具,固然其餘的.NET反編譯工具如ILSpy也是能夠的。

把Assembly-CSharp.dll拖到dnspy中,稍等片刻,便可獲得旅行青蛙程序的目錄樹和源代碼

這裏須要說明一下,像這種既沒有加殼保護,也沒有代碼混淆的程序其實是不多存在的,這款程序幾乎沒有防禦措施大概是由於日本程序員和國內程序員的風格不一樣。

那麼咱們應該怎麼定位到關鍵代碼呢?這裏有一種很高效的方法:搜索關鍵字符串

好比在抽獎時,提示抽獎券數量不足,那麼咱們就能肯定抽獎的代碼就在這串字符出現的代碼附近,咱們就搜索這個字(= =若是認識日文搜索這整句話更快)

搜到了兩處,雙擊定位,發現第一處就是咱們要找的代碼(其實根據方法名PushRollButton也能推斷出)

能夠發現,這段代碼就是抽獎的代碼,若抽獎券數量<5(第一處箭頭),則報錯返回(二三處箭頭),不然把抽獎券的數量自減5(第4處箭頭)。

這樣咱們修改抽獎邏輯的思路就有不少了:

  1. 第一處箭頭的<5改成<0,那麼咱們一直知足抽獎的條件,就能夠一直抽獎
  2. 第四處箭頭的-5改爲0,那麼每次抽獎後抽獎券的數量就不會減小,或者更進一步把-5改成+5,那麼每次抽完獎,抽獎券的數量還會增長5
  3. 根據代碼能夠得知獲取抽獎券數量方法的是TicketStock,能夠針對TicketStock進行修改
  4. .....

這裏主要介紹第3種方法,咱們經過查看TicketStock方法,能夠發現TicketStock方法是從ticket變量取值的

查找ticket,發現了初始化ticket的代碼,同時發現了疑似初始化三葉草數量的代碼

ctrl+shift+E修改此處代碼,將69,70行的初始化均改成9999

點擊編譯保存修改,再點擊 文件->所有保存(快捷鍵ctrl+shift+S)將修改保存回dll

而後將apk從新打包檢測修改效果(由於apk實質就是壓縮包,從新壓縮,更改後綴爲 .apk便可)

放到模擬器中檢測修改效果(須要先卸載原版旅行青蛙

能夠發現,三葉草和旅行券都已經被修改了

旅行券是999而不是9999是由於代碼中有一處限制數量不超過999的判斷,很容易發現

此外,雖然此時的apk能夠再模擬器中運行,但實際上在真機上是不能運行的,緣由和解決辦法以後會提到

但再多的三葉草和抽獎券也有花光的一天,咱們能夠嘗試再進一步修改。

經過查看ticket和clover的代碼,能夠找到返回三葉草數量和抽獎券數量的代碼,直接把函數的返回值修改成9999,這樣不管對三葉草和抽獎券作什麼操做,都會返回9999,這樣三葉草和抽獎券的數量就固定了,也就達到了無限三葉草和抽獎券的目的。

而後再ctrl+shift+S,從新打包apk便可。

解決簽名

以前說過,從新打包好的apk並不能在真機上運行,是由於真機會檢測安卓程序的簽名,安卓的apk在簽名時會對全部源文件進行一個hash運算,安裝時hash校驗失敗就會拒絕安裝

不能覆蓋安裝也是由於簽名的緣由,若是想繼續存檔,能夠先把GameData.sav保存一份,安裝好破解版的後從新導入便可

那麼怎麼繞過簽名校驗呢?咱們只須要從新對apk進行簽名便可。由於本人對apk的開發並不十分了解,在簽名時仍是花了一段時間研究的,後來發現能夠經過apktool box工具包直接進行簡單的簽名

簽名以後,便可真機運行

更進一步

更多修改

本次修改只修改了三葉草/抽獎券的初始值和返回值,但咱們徹底能夠根據代碼邏輯進行更多的修改,如:

  1. 修改抽獎概率
  2. 修改保存圖片的上限
  3. 縮短旅行時間
  4. 修改得到珍稀照片的機率
  5. 對apk圖標等資源進行修改
  6. ......

漢化

漢化也很簡單,咱們找到日文字符串後,修改成中文字符串便可,漢化是個體力活,這裏就再也不展現了。

......

聲明

  • 本次修改目的是學習交流,請勿用於盈利

相關文章
相關標籤/搜索