滑雪大冒險內購

滑雪大冒險2 App內購

相信這個遊戲很多人都玩過,遊戲裏面的道具和地圖都是需要出錢購買的;而且不同平臺下載的這個APP,裏面道具的購買方式可能不一樣,但是原理都一樣;
這裏的支付方式是支付寶和微信…
界面
支付方式

工具

  1. 夜神模擬器
  2. AndroidKiller_v1.3.1
  3. Apktool
  4. JEB2
  5. Monitor.exe

分析

先讓夜神模擬器與monitor.exe連接,找到一些活動的名稱,減少工作量:

nox_adb.exe connect 127.0.0.1:62001

然後我們點擊支付按鍵,然後在monitor中Clear LOG,此時點擊返回鍵取消支付,查看LOG:
Log
我們發現一個Yodo1PayHelper的可疑活動,猜測我們支付成功與否就與它有關;
在 AndroidKiller_v1.3.1中搜索這個字符串,找到文件的位置然後在jeb2中查看:
AndroidKiller_v1.3.1
看到文件位置在com\yodo1\android\sdk\helper中:
jeb2
然後我們反編譯這個smali文件,發現在onResult類裏面有一些關鍵函數:

case 2: {
    this.this$2.this$1.this$0.removeProductDatatoLocal(this.this$2.this$1.val$activity, this.this$2.this$1.val$productData);
    if(arg8 == v4) {
        YLog.i("Yodo1PayHelper,  這是已購買的商品,購買成功");
        this.this$2.this$1.this$0.purchased(1, this.this$2.this$1.val$channelPayInfo.getOrderId(), this.this$2.this$1.val$productData, this.this$2.this$1.val$payType);
        return;
    }

    this.this$2.this$1.this$0.purchased(2, this.this$2.this$1.val$channelPayInfo.getOrderId(), this.this$2.this$1.val$productData, this.this$2.this$1.val$payType);
    break;
}

發現這裏有購買成功的字樣;
仔細分析這個文件的內容你會發現他的業務邏輯是:
用戶發起購買請求–>獲取購買的商品信息–>查詢訂單狀態–>訂單狀態校驗成功–>提交訂單狀態–>購買成功
所以,我們可以修改它的流程,不管訂單狀態,直接返回購買成功;

修改

通過"購買成功"字符串轉Unicode後查找到onResult類所在的smali文件的位置:
Yodo1PayHelper$4$1$1.smali

:goto_1
    if-ne p2, v4, :cond_5 //修改時刪除

    .line 435
    const-string/jumbo v1, "Yodo1PayHelper,  \u8fd9\u662f\u5df2\u8d2d\u4e70\u7684\u5546\u54c1\uff0c\u8d2d\u4e70\u6210\u529f"

    invoke-static {v1}, Lcom/yodo1/sdk/kit/YLog;->i(Ljava/lang/String;)V

    .line 436
    iget-object v1, p0, Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4$1$1;->this$2:Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4$1;

    iget-object v1, v1, Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4$1;->this$1:Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4;

    iget-object v1, v1, Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4;->this$0:Lcom/yodo1/android/sdk/helper/Yodo1PayHelper;

    iget-object v2, p0, Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4$1$1;->this$2:Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4$1;

    iget-object v2, v2, Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4$1;->this$1:Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4;

    iget-object v2, v2, Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4;->val$channelPayInfo:Lcom/yodo1/sdk/adapter/entity/ChannelPayInfo;

    invoke-virtual {v2}, Lcom/yodo1/sdk/adapter/entity/ChannelPayInfo;->getOrderId()Ljava/lang/String;

    move-result-object v2

    iget-object v3, p0, Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4$1$1;->this$2:Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4$1;

    iget-object v3, v3, Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4$1;->this$1:Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4;

    iget-object v3, v3, Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4;->val$productData:Lcom/yodo1/android/sdk/helper/ProductData;

    iget-object v4, p0, Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4$1$1;->this$2:Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4$1;

    iget-object v4, v4, Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4$1;->this$1:Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4;

    iget-object v4, v4, Lcom/yodo1/android/sdk/helper/Yodo1PayHelper$4;->val$payType:Lcom/yodo1/android/sdk/constants/PayType;

    invoke-virtual {v1, v5, v2, v3, v4}, Lcom/yodo1/android/sdk/helper/Yodo1PayHelper;->purchased(ILjava/lang/String;Lcom/yodo1/android/sdk/helper/ProductData;Lcom/yodo1/android/sdk/constants/PayType;)V

    goto/16 :goto_0

然後這段就是購買成功的smali代碼了,所以只要我們在開始的位置加一個goto/16 :goto_1,並且把if-ne p2, v4, :cond_5這句刪除了,那麼我們在購買東西是就可以繞過檢測了:
修改

最後Apktool編譯,然後簽名安裝就可以了…

效果

購買成功
點擊購買,然後取消可以了…

總結

Android逆向的難點主要在於麻煩與類的複雜,需要不斷的編譯簽名安裝運行驗證…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章