「逆向」Android killer和IDA破解Android遊戲內購

以下轉自52破解 yikuaiyingbi大神:


今日偶然看到一個還算熱門的遊戲,看到裡面有內購的方法。嘗試破解一下

1、拖入AK後重打包,安裝到手機上後發現黑屏了

2、然後安裝原版測試下,正常運行,那排除手機適配問題,應該就是有驗證了

3、既然這樣那我們為了確定到底驗證的哪裡,先只簽名測試下,重新安裝下,安裝手機後還是黑屏。到這裡我猜測十有八九是簽名驗證了

4、祭出四哥的工具,kstools拿出來一頓操作,然後自信滿滿的再次安裝到手機上。發現還是黑屏,這就尷尬了,看來應該不僅僅是簽名驗證了。這時候沒什麼捷徑可走了進代碼分析吧

5、遊戲包太大,使用jadx單獨打開dex文件

6、然後使用Android killer打開apk。找到入口類後在jadx中打開

「逆向」Android killer和IDA破解Android遊戲內購

這個類通過類名不難看出只是一個閃屏,我們要分析的應該不在這裡,所以不用太關注,大致看下代碼就行

「逆向」Android killer和IDA破解Android遊戲內購

在oncreate最後執行了這個方法,看來是跳到了

「逆向」Android killer和IDA破解Android遊戲內購

「逆向」Android killer和IDA破解Android遊戲內購

定位到SplashScreen類中

「逆向」Android killer和IDA破解Android遊戲內購

看起來也是一個閃屏,但是裡面有一些初始化和加載so的操作,進入到MobileAuth.init(this);發現走進了這個native方法裡。

「逆向」Android killer和IDA破解Android遊戲內購

暫時先不管他了,繼續往下一個activity看。也就是OnyxActivity類;先看onCreate方法中:

「逆向」Android killer和IDA破解Android遊戲內購

也沒有什麼可以一看看出來的驗證方法。懵逼,因為遊戲並沒有閃退,只是黑屏,看異常看不出有哪裡出了問題,所以我在這些方法下面插入log,看執行到哪一個時候卡住了。

「逆向」Android killer和IDA破解Android遊戲內購

為了防止寄存器使用亂掉出錯,這裡直接在原來基礎上+2,增加兩個寄存器,增加自己的log代碼

「逆向」Android killer和IDA破解Android遊戲內購

然後再次打包運行,發現卡在了10之後,11沒有被打印出來,而且前面的日誌重複輸出,說明一直循環卡死了。invoke-virtual {v2, p0},Lcom/ubisoft/OnyxEngine/OurpalmChannel;->Init(Landroid/app/Activity;)V進到這個方法看看

「逆向」Android killer和IDA破解Android遊戲內購

看著像是廣告和支付的初始化,這個方法裡有兩處初始化地方,在這兩處加完log信息後發現卡在了Ourpalm_Entry.getInstance(mActivity).Ourpalm_Init("2","1.0", "1.0", mListener);進去之後我的內心是崩潰的,這麼多代碼看的我頭大,真的不想再一個個打印了,還好猛地看到了RunSign這個jni方法,熟悉的味道,先看看這個方法

「逆向」Android killer和IDA破解Android遊戲內購

就是他

「逆向」Android killer和IDA破解Android遊戲內購

打開IDA拖入so,方法在libourpalm_sdk_a.so內

「逆向」Android killer和IDA破解Android遊戲內購

「逆向」Android killer和IDA破解Android遊戲內購

到這兒幾乎一目瞭然了,是做了dex+簽名的效驗

「逆向」Android killer和IDA破解Android遊戲內購

在checksign這個函數內也發現了退出遊戲的代碼位置,既然這樣我們直接選擇簡單的操作方式給兩個跳轉nop掉。

「逆向」Android killer和IDA破解Android遊戲內購

「逆向」Android killer和IDA破解Android遊戲內購

把上面的兩條改為:C0 46(也就是NOP)

「逆向」Android killer和IDA破解Android遊戲內購

改完後,再次重簽名,安裝,完美運行。

「逆向」Android killer和IDA破解Android遊戲內購

接下來定位支付位置:其實剛剛分析代碼時候已經大致看到支付位置了。為了確定還是分析下。剛剛分析到OurpalmChannel類時候,可以看到這裡他自定義了一個 ourpalm.tools.android.logs.Logs類

「逆向」Android killer和IDA破解Android遊戲內購

「逆向」Android killer和IDA破解Android遊戲內購

這裡我們把isShowLog的賦值改下

「逆向」Android killer和IDA破解Android遊戲內購

這裡初始化時賦值改為true,再次打包運行遊戲,點擊支付,成功打印日誌:

「逆向」Android killer和IDA破解Android遊戲內購

支付頁面,我們沒登錄

「逆向」Android killer和IDA破解Android遊戲內購

log日誌頁面

「逆向」Android killer和IDA破解Android遊戲內購

下面這個pay方法也是這個類中

「逆向」Android killer和IDA破解Android遊戲內購

這就對上了,說明是這個支付方法。寫過支付的人應該都知道,支付的回調一般在handler或者提供的接口中,這裡可以看出來他傳入了mListener這個回調接口,我們看下這個接口初始化的地方

「逆向」Android killer和IDA破解Android遊戲內購

「逆向」Android killer和IDA破解Android遊戲內購

點進去OurpalmIAPListener中看下

「逆向」Android killer和IDA破解Android遊戲內購

這裡就能看到支付成功的位置了,就是OurpalmChannel.PayResultCallBackNative(true);和上面的支付失敗也就是true/false的區別。至於為什麼不是下面的那一堆。我看了下方法內部走到最後是一些統計的東西。然後我們在執行pay的那裡,執行這個成功方法就行了。

「逆向」Android killer和IDA破解Android遊戲內購

再次打包運行。點擊購買,成功獲得

「逆向」Android killer和IDA破解Android遊戲內購

本文的目的只有一個就是學習逆向分析技巧,如果有人利用本文技術進行非法操作帶來的後果都是操作者自己承擔,和本文以及本文作者沒有任何關係!

第一次發帖,不足之處大家多多指教。

kstools工具下載:https://github.com/fourbrother/kstools


分享到:


相關文章: