以TTX連萌來多層次分析遊戲破解,ttx萌來多層次
最近工作太忙,沒啥時間寫文章,剛好今天遇到一個小遊戲,簡單分析下,趁著中午寫下此文。
移動MM的遊戲,前面我們已經寫過很多文章,沒有看過的朋友,自行尋找即可,今天我們繼續分析一個類似的遊戲,不過使用多種方式來分析,同時,歡迎同學們自己補充新方式來擴充思路。
0x1:遊戲試玩
開啟遊戲玩了會兒,最近這類遊戲非常多,也談不上喜歡玩不喜歡玩,那麼直接查看商城吧。
配合查看遊戲反編譯的目錄結構:
可以簡單猜測遊戲的內購是否為移動MM的。
然後配合我們自己簡單查看下smali代碼,確定內購支付方式為移動MM .
0x2:分析破解
確定了遊戲的支付方式,我們就有目的性的去分析如何來分析它的破解情況了。
在這裡再次補充上:
移動MM的支付方式以及SDK的相關調用方法
http://wenku.it168.com/d_001271444.shtm
通過瞭解它的支付流程,來測試他在哪塊地方存在被破解的可能,即欺騙支付。
在這篇文章中,已經有簡單說明了,這裡便不再重複:
http://www.52pojie.cn/thread-259909-1-1.html
然後,我們可以想到:
①.我們直接修改支付結果,用支付成功的方法替換支付失敗
②.直接將判斷支付是否成功的狀態代碼鎖定為支付成功
③.直接修改遊戲金幣
④.修改支付簡訊
0x3:第一種支付方式破解
還是上面說的,直接搜尋尋找onBillingFinish。
這裡所說按照第一種方式,有點牽強,不過,支付失敗的話,這裡的code也將改變,我們讓他走訂購成功的方法,即修改方法內的那個判斷語句。
對應smali代碼自行修改即可。
0x4:第二種鎖定狀態代碼破解
我們在追蹤onBillingFinish方法內容相關的時候,發現PurchaseCode.smali中的getStatusCode()I方法以及MessageInfo.smali中的getPurchasecode()I方法,應該是用於定義支付碼狀態,即支付成功,支付失敗,取消支付的。
在PurchaseCode.smali檔案中,我們發現:
.field public static final WEAK_ORDER_OK:I = 0x3e9
這個是定義支付訂單成功的狀態代碼。一般在移動MM裡面,多數都是這個。
所以,我們可以看到上面所說getStatusCode()I方法和getPurchasecode()I方法都是返回值為int類型的,那麼我們直接將其返回值修改為0x3e9,即數字1001,即代表支付成功。
我們儲存修改,回編譯,查看到,點擊購買按鈕,直接提示:
在無卡模式下測試的,一切正常,所以肯定了我們的修改時正確的,也不會計費。
0x5:直接修改金幣
通過OnBillingFinish()方法
我們進入到這個PopStar查看:
當然,這個類裡面還有很多方法,很多支援破解的方法,如:
定義購買金幣數量的,即購買成功後增加的數量。等等。。。
長話短說,咱們看到PopStar.nativeAddCoin方法後,確定是一個native方法,那麼我們找到上文
System.loadLibrary("xinxin");
用IDA載入libxinxin.so,然後定位到nativeAddCoin方法.
現在大家多數用的大佬的那個IDA,帶F5的,那麼我們直接f5
查看到這裡的方法,useGameCoin方法。開啟這個方法查看:
這裡有我加的注釋,很清晰的,看不明白的,F5一下也就知道了。
因為getIntegerForKey,返回值為R0,然後往下第二行代碼,R0=R0+R6,所以我們關鍵是在這裡修改R0,即金幣數量
Hex查看一下二進位,這裡為Thumb指令,那麼我們可以操作局限性也很高了。
所以,這裡提供一個思路,大家可以尋找更加簡便的方法。
即,BL getIntegerForKey,我們直接複製R0一個數值,然後在下面Adds R0,R0,R6這裡,直接對R0邏輯左移一下,即LSL一下,將其數值變大。
因為第一個BL是4個位元組,我們直接修改 00 00 09 20 ,即Movs R0,R0 代表沒有任何操作,09 20是將數字9賦值給R0
然後ADDs那一行,有兩個位元組,直接改為 00 04,即 LSLS R0,R0,#0x10
這樣,我們即完成了對金幣數量的賦值,如:
然後,我們在16進位下修改,選用010Editor或UE,ctrl + g,進行地址跳轉,尋找到我們在IDA修改的地址,按照上文修改,儲存,替換,回編譯。
注釋:: int a=9 ; a=a<<0x10; 即金幣鎖定為589824
這裡需要說明的是,這個方法何時被調用,即才能啟用我們對金幣的賦值呢?
直接在IDA裡面對這個方法按下x鍵,查看調用,有5處。那麼應該很容易被啟用。
紅色標註的,是使用金幣的道具,按照我們看到方法被調用的地方,這裡被調用了,然後金幣數量即我們定義的。
0x6:修改簡訊
這裡不多說了,根據系統傳送簡訊函數進行尋找修改,替換簡訊內容,替換簡訊發送人即可。
我直接使用hook的方式替換的,比較省事了。。
相關代碼不難,看完我前面幾篇hook java的文章的同學,應該很容易能夠寫出來代碼,這裡不再多寫,有興趣,自己動手去。
文檔和相關附件:
http://pan.baidu.com/s/1kTLwwDL