Copyright@M4x, 小學生 from 10.0.0.55
這篇博客是應學姐之邀給學弟學妹寫的掃盲教程,較為基礎
前言
破解旅行青蛙的初衷很簡單,女朋友想養青蛙,三葉草長得太慢,作為一名二進制黑闊又不願屈服於網上小廣告成堆又不知道有沒有后門的破解版,於是就參考知乎的高贊回答自己給旅行青蛙添加了無限三葉草和無限抽獎券的功能。
受桐姐之邀,給學弟學妹簡單介紹一下反編譯技術,以及反編譯技術是怎么運用到破解旅行青蛙這款游戲上的,力求能夠用通俗易懂的語言給對此感興趣的同學講解清楚。
何為反編譯
我們知道,高級語言源程序經過編譯生成可執行文件(事實上有預處理,編譯,匯編,鏈接四步,這里籠統的概括為編譯,這個過程在《程序員的自我修養》這本書中有詳細的介紹),那么加上一個“反”字,也就是從可執行文件反向生成高級語言源碼的過程。
聽起來很簡單但實際上反編譯是逆向工程最核心最困難的一步,通常做不到把可執行文件逆向出高級語言源代碼,只能轉化成匯編程序,即使某些高級語言(C#,vb,python等)反編譯出源代碼相對簡單,得到的代碼也往往是被混淆過的。
上圖是windows平台下強大的反編譯工具OllyDbg,但也只能得到匯編級的代碼。
對於部分C族語言(C/C++),借助IDA的HexRay插件可以得到近似源碼的偽代碼,但這些偽代碼也往往是有錯誤的。
破解青蛙
但幸運的是,旅行的青蛙是基於Unity開發的.NET程序,對於.NET程序,反編譯技術較為成熟。
首先解壓旅行青蛙的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處箭頭)。
這樣我們修改抽獎邏輯的思路就有很多了:
- 第一處箭頭的<5改為<0,那么我們一直滿足抽獎的條件,就可以一直抽獎
- 第四處箭頭的-5改成0,那么每次抽獎后抽獎券的數量就不會減少,或者更進一步把-5改為+5,那么每次抽完獎,抽獎券的數量還會增加5
- 根據代碼可以得知獲取抽獎券數量方法的是TicketStock,可以針對TicketStock進行修改
- .....
這里主要介紹第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工具包直接進行簡單的簽名
簽名之后,即可真機運行
更進一步
更多修改
本次修改只修改了三葉草/抽獎券的初始值和返回值,但我們完全可以根據代碼邏輯進行更多的修改,如:
- 修改抽獎幾率
- 修改保存圖片的上限
- 縮短旅行時間
- 修改獲得珍稀照片的概率
- 對apk圖標等資源進行修改
- ......
漢化
漢化也很簡單,我們找到日文字符串后,修改為中文字符串即可,漢化是個體力活,這里就不再展示了。
......
聲明
-
本次修改目的是學習交流,請勿用於盈利