《全民捕鱼》游戏分析
文章目錄
- 分析環境
- 逆向分析
- 日志分析法
- 字符串分析法
- 去除彈窗
- 添加個人信息的破解
- 總結
分析環境
系統:Android 4.4
工具:Windows 10 64bit 夜神模擬器 Android Killer
游戲:全民捕魚V1.7
文件: fkby.apk 大小: 14450756 bytes 修改時間: 2016年3月 11日, 14:53:34 MD5: C67C9D8DB091BE205457B1C6B9BC1352 SHA1: 0FD4027602C2628568E52806603BA1FC95EBE90D CRC32: 406D694D文件信息如上,有VT權限的話可以直接下載
這個游戲雖然已經下架,但是分析思路非常值得初學者學習。
逆向分析
進入游戲商城,點擊購買金幣,會彈出購買失敗的提示,可以根據這個字符串作為切入點去分析app,也可以根據日志去分析。這里我們先通過日志去分析整個app
日志分析法
將apk加載到Android Killer
選擇已經開啟的模擬器,點擊日志
點擊查找進程按鈕
根據apk的包名確定需要查找的進程ID。點擊開始按鈕
點擊金幣,此時窗口出現多條日志,由于這里還沒有進行支付,將所有日志清空
然后點擊確定,出現支付失敗的提示。
那么這一段日志,必然調用了支付的方法,我們可以從下往上分析整個日志。
關鍵日志如下:
Failed DX_payCode2 == 5125375 FaildCode == 1211 orderFinish code = 3 result= 0DX_payCode2必然是和支付相關的錯誤碼
這里直接在工程中搜索這個關鍵詞
來到了關鍵地方
當前類內有三個方法,支付取消,支付失敗和支付成功
但是觀察這個類名,可以知道當前這個是匿名內部類,所以我們沒法直接找到調用pay函數的地方,這里可以用一個取巧的辦法。
將支付失敗的代碼全部刪掉
然后將支付成功的代碼復制到支付失敗方法內
修改完成之后可以看到已經購買成功了。但是這種方法屬于是取巧,并不適用于所有的游戲破解。我們再來觀察支付成功和失敗函數的區別
兩個函數的區別在于傳入的 GameJni.OderFinish傳入的第二個參數和SendMessage傳入的第三個參數。
發消息的代碼和界面相關,這個暫時先不管,我們可以找到支付失敗函數將0改成1看看會產生什么效果
將v1修改為1,然后保存編譯
首先彈出購買失敗頁面,然后彈出購買成功提示,表示我們已經修改成功了。
字符串分析法
接著我們可以用字符串分析的方法來破解這個apk
切入點為購買失敗的提示信息
在搜索框中輸入購買失敗,然后轉成Unicode
直接搜索,就定位到了購買失敗的調用地方
查看源碼發現這里有購買成功和失敗的調用語句,但是這個位置只是彈出購買成功和失敗的提示,所以我們需要再搜索別的地方
initShow((String)paramMessage.obj);continue;GamePay.sendOrder((String)paramMessage.obj);continue;buyFail((String)paramMessage.obj);continue;buyOk((String)paramMessage.obj);continue;payFail((String)paramMessage.obj);這里就需要挨個搜索代碼中出現的函數名,找到可以修改的地方
最終通過payFail定位到最后一個地址
同樣可以找到關鍵代碼,然后將參數2修改為1即可破解成功
去除彈窗
接下來我們希望將當前的這個彈出去掉,直接顯示購買成功
想要去除這個彈窗,就需要在這個窗口彈出之前調用游戲中的OderFinish方法。繼續用日志分析法來分析
點擊購買出現彈窗,然后查看當前出現的日志。
event_id=buyMoney, label=1000 GameJni order payCode = 3 num= 1 order = 5125375 GamePay sendOrder payCode = 5125375 context.payType = 1 payCode = 5125375 DX payCode in DXSend == 5125375這一次我們想要去除彈窗的話應該從上往下對日志進行分析。
搜索GameJni order payCode這個字符串
查看JAVA代碼,order方法接著又調用了下面這個方法
GamePay.mListener.order(paramInt1, paramInt2);繼續進入order方法查看代碼
這一段代碼我們并不知道是什么作用,但是看代碼最后調用了OderFinish方法,第二個參數為0,說明這里是購買失敗的分支。
如果我們直接讓代碼跳轉到OderFinish方法,并且將第二個參數修改為1,是否就可以跳過彈窗的過程?
接著來實際驗證~
找到IAPListener.smali的order方法
來到函數末尾,首先將v0修改為1,然后復制::cond_2這個標簽
然后在函數頭直接goto到OderFinish的位置,保存并編譯安裝。
點擊購買之后,直接彈出提示,顯示成功信息,由于我們跳過了所有方法,直接調用購買成功的方法,所以沒有彈出Toast提示信息
添加個人信息的破解
為了更有趣一點,我們在購買成功的提示上添加自己的個人信息。
但是當前的這個類,并不是主界面,沒有辦法拿到Toast函數需要的this指針,所以只能想其他辦法。
通過代碼我們可以看到當前的order函數是可以給主界面發送消息的,這里發送的消息是10004
點擊IAPHandler來查看一下消息響應函數
通過定義的靜態變量跟函數名我們已經能拿到消息ID和函數的對應關系。所以如果想讓程序彈出一個提示信息顯示購買成功,只需要發送一個ID為10010的消息即可
這里我們修改的方式為將if語句注釋,然后修改ID為10010,最后goto到OrderFinish函數
首先將V3消息ID修改為0x271A
然后注釋掉第一條if語句
在發送完消息后直接goto到OrderFinish函數
然后搜索購買成功字符串
然后修改這個字符串。實際效果如圖:
成功加上了我們自己的個人信息。接著我們在游戲啟動界面,再添加一個個人信息提示
找到入口類的onCreate方法,拉倒函數末尾,右鍵->插入代碼->Toast
保存并編譯
修改完成之后在游戲啟動界面彈出了我們自定義的提示信息。比起破解這個環節應該是最有成就感的了。
總結
安卓游戲內購的破解簡單的思路都是大同小異,也可以更改調用的函數參數等.smail代碼與偽Java代碼很接近自然語言邏輯思路,在沒有安卓加固(殼)的游戲上做一些內購破解還是很簡單的.去網上Download幾個游戲練習一下破解就很有成就感.
總結
以上是生活随笔為你收集整理的《全民捕鱼》游戏分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 011 smali语法详解
- 下一篇: 012 动态调试smali代码