以TTX連萌來多層次分析遊戲破解,ttx萌來多層次

來源:互聯網
上載者:User

以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





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.