Android破解-滾動的天空

Android破解-滾動的天空

前言

最近看到很多學生在玩滾動的天空這個遊戲,這遊戲看起來還挺有趣的,於是我也去下載玩了幾把。可是,坑吶,這遊戲太難了,考驗人的快速判斷能力和手指滑動速度,玩的很渣。玩遊戲技術不行怎麼辦呢?俗話說,能力不夠金錢來湊!哈哈哈,遊戲世界不都是這樣的嗎?各個遊戲界的大神哪個不是用金錢堆起來的。玩遊戲只是爲了娛樂,能夠用一點金錢來購買的娛樂有什麼關係呢?反正我的理解是這樣的。於是,能不住想要購買道具了。但是,突然又想到,我們學IT的,玩這個小遊戲還需要花錢?自己破解遊戲不就好了嗎?於是,就開始動工了。從中午休息時間開始就着手去做這件事了,搞到我中午都沒有休息,下午下班後回到家繼續搞事情。直到晚上九點,終於把這破遊戲破解成功了。

使用的技術和工具

話說,磨刀不誤砍材工,要想破解一款軟件,至少要懂該軟件的基本編程,所以破解Android軟件是需要懂得Android應用的編程纔可以的。其中用到的技術當然少不了大名鼎鼎的Java語言,然後是Android開發基礎,要懂得Android SDK的功能和使用,會基本的Smali語法。另外,還需要使用一些工具軟件來輔助。

  1. 本次使用的APK使最新版的滾動的天空,以後如果出新版可能不適用,這是原版沒有破解的APK下載地址:https://pan.baidu.com/s/1VuWRP7bhUsHg0kjsCpoNpA
    破解後的APK:
    https://pan.baidu.com/s/1F0JomQeEKRqE-hUn8k9yUA
  2. 使用Android Killer V1.3.1.0版本的反編譯工具,這個工具很強大適合初學者使用,想要深入學習的話最好用其他的軟件。http://www.ouyaoxiazai.com/soft/yyrj/158/38785.html#dizhi
  3. APKTool V2.3.4,大名鼎鼎的反編譯工具
    https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.3.4.jar

破解過程

第一步:反編譯APK

打開Android Killer,直接鼠標拖動安裝包APK文件到窗口,會自動反編譯
這裏寫圖片描述
如果出現失敗的情況,則需要下載最新的apktool.jar,手動添加到Android Killer中
這裏寫圖片描述

第二步:尋找破解關鍵點

下面,在道具商城點擊商品的的時候會提示:sim卡與支付服務運營商不匹配或網絡未連接,請檢查網或無法購買,未插入sim卡等信息,在Android Killer中可以根據這個提示的內容搜索到這個內容在項目中出現的位置。
這裏寫圖片描述
可以看到這個字符串是在Strings.xml中定義的,代碼通過這個字符串的id來調用這個字符串。接着,可以在public.xml中看到這個字符串的id值
這裏寫圖片描述
然後,搜索這個ID值0x7f050028就可以找到在代碼中調用這個字符串的位置
這裏寫圖片描述
可以看到,在a.smali文件中調用了這個字符串,下面是調用這個字符串的函數的全部內容:

.method public static b(Ljava/lang/String;Landroid/content/Context;Lcom/turbochilli/rollingsky/pay/PayAgent;I)V
    .locals 2

    .prologue
    .line 302
    invoke-static {p1}, Lcom/turbochilli/rollingsky/util/NetUtil;->isNetworkAvailable(Landroid/content/Context;)Z

    move-result v0

    if-nez v0, :cond_0

    .line 303
    const v0, 0x7f050022

    invoke-virtual {p1, v0}, Landroid/content/Context;->getString(I)Ljava/lang/String;

    move-result-object v0

    invoke-static {p1, v0}, Lcom/turbochilli/rollingsky/util/CommonUtil;->showToast(Landroid/content/Context;Ljava/lang/String;)V

    .line 322
    :goto_0
    return-void

    .line 306
    :cond_0
    invoke-static {}, Lcom/turbochilli/rollingsky/util/CommonUtil;->isFlavorTelecom()Z

    move-result v0

    if-eqz v0, :cond_2

    .line 307
    invoke-static {}, Lcom/turbochilli/rollingsky/util/CommonUtil;->getSimOperator()Ljava/lang/String;

    move-result-object v0

    .line 308
    invoke-static {v0}, Landroid/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Z

    move-result v1

    if-eqz v1, :cond_1

    .line 309
    const v0, 0x7f050023

    invoke-virtual {p1, v0}, Landroid/content/Context;->getString(I)Ljava/lang/String;

    move-result-object v0

    invoke-static {p1, v0}, Lcom/turbochilli/rollingsky/util/CommonUtil;->showToast(Landroid/content/Context;Ljava/lang/String;)V

    goto :goto_0

    .line 311
    :cond_1
    invoke-static {}, Lcom/turbochilli/rollingsky/util/CommonUtil;->getCurrentFLAVOR()Ljava/lang/String;

    move-result-object v1

    invoke-static {v1, v0}, Landroid/text/TextUtils;->equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z

    move-result v0

    if-nez v0, :cond_2

    .line 312
    const v0, 0x7f050028

    invoke-virtual {p1, v0}, Landroid/content/Context;->getString(I)Ljava/lang/String;

    move-result-object v0

    invoke-static {p1, v0}, Lcom/turbochilli/rollingsky/util/CommonUtil;->showToast(Landroid/content/Context;Ljava/lang/String;)V

    goto :goto_0

    .line 316
    :cond_2
    if-eqz p2, :cond_3

    .line 317
    const/4 v0, 0x0

    new-instance v1, Lcom/turbochilli/rollingsky/b/a;

    invoke-direct {v1, p0}, Lcom/turbochilli/rollingsky/b/a;-><init>(Ljava/lang/String;)V

    invoke-virtual {p2, p0, v0, v1}, Lcom/turbochilli/rollingsky/pay/PayAgent;->pay(Ljava/lang/String;ILcom/turbochilli/rollingsky/pay/PayCallback;)V

    goto :goto_0

    .line 319
    :cond_3
    const v0, 0x7f050021

    invoke-virtual {p1, v0}, Landroid/content/Context;->getString(I)Ljava/lang/String;

    move-result-object v0

    invoke-static {p1, v0}, Lcom/turbochilli/rollingsky/util/CommonUtil;->showToast(Landroid/content/Context;Ljava/lang/String;)V

    goto :goto_0
.end method

通過代碼可以看到,前面很多的內容都是用來判斷網絡狀況、SIM運營商等信息的,我們可以把它們全部刪掉,只留下調用支付功能的核心代碼,改動後如下:

.method public static b(Ljava/lang/String;Landroid/content/Context;Lcom/turbochilli/rollingsky/pay/PayAgent;I)V
    .locals 2

    .prologue
    .line 302
    #點擊道具商品後,執行到這裏,去除了判斷網絡SIM卡等代碼 
    const/4 v0, 0x0

    new-instance v1, Lcom/turbochilli/rollingsky/b/a;

    invoke-direct {v1, p0}, Lcom/turbochilli/rollingsky/b/a;-><init>(Ljava/lang/String;)V
    #這裏調用支付功能
    invoke-virtual {p2, p0, v0, v1}, Lcom/turbochilli/rollingsky/pay/PayAgent;->pay(Ljava/lang/String;ILcom/turbochilli/rollingsky/pay/PayCallback;)V

    goto :goto_0

    :goto_0
    return-void

.end method

保持文件,點擊編譯,會提示編譯成功,把安裝包安裝到手機上,可以看到,點擊道具後直接就彈出了支付方式選擇界面,沒有再提示網絡情況和SIM卡情況的現象了。但是,到這裏並沒有破解成功,依舊還是需要支付的。
這裏寫圖片描述

第三步:找到支付回調

從上面可以看到PayAgent類是一個抽象類,下面是PayAgent.smali最前面的內容:

.class public abstract Lcom/turbochilli/rollingsky/pay/PayAgent;
.super Ljava/lang/Object;
.source "PayAgent.java"

查看這個類的內容,可以看到裏面的pay函數是一個抽象函數:

.method public abstract pay(Ljava/lang/String;ILcom/turbochilli/rollingsky/pay/PayCallback;)V
.end method

所以,必須要找到這個類的實現類才能定位到真正的支付功能的代碼,查看PayAgent.smali同目錄的其他文件,很容易可看到,pay這個目錄下面的內容都是支付相關的代碼,查看各個類內容,可以找DianxinPay繼承自PayAgent,所以DianxinPay裏面的pay函數纔是真正的支付代碼。後面還有接着,EgamePay纔是真正的支付網絡請求,這裏就不詳細展開了。通過這些追蹤,最後找到DianXinPay$3.smali文件裏面有三個支付結果回調:

.method public payCancel(Ljava/util/Map;)V
.method public payFailed(Ljava/util/Map;I)V
.method public paySuccess(Ljava/util/Map;)V

把payCancel函數裏面的所有內容替換爲paySuccess裏面的內容,這時候破解完成,當在APP中取消支付的時候,會實現支付完成的效果。下面是payCancel函數的內容:

.method public payCancel(Ljava/util/Map;)V
    .locals 4
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "(",
            "Ljava/util/Map",
            "<",
            "Ljava/lang/String;",
            "Ljava/lang/String;",
            ">;)V"
        }
    .end annotation

    .prologue
    .line 187

    #雷:這裏是核心關鍵的破解位置,在彈出的支付界面直接退出支付界面會調用這個取消支付的函數,把內容
    #全部替換爲支付成功函數的內容就可以了。
    const-string v0, "DianXinPay"

    const-string v1, "paySuccess"

    invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    .line 171
    iget-object v0, p0, Lcom/turbochilli/rollingsky/pay/DianXinPay$3;->this$0:Lcom/turbochilli/rollingsky/pay/DianXinPay;

    invoke-static {v0}, Lcom/turbochilli/rollingsky/pay/DianXinPay;->access$300(Lcom/turbochilli/rollingsky/pay/DianXinPay;)Lcom/turbochilli/rollingsky/pay/PayCallback;

    move-result-object v0

    if-eqz v0, :cond_0

    .line 172
    invoke-static {}, Lcom/turbochilli/rollingsky/c;->a()Lcom/turbochilli/rollingsky/c;

    move-result-object v0

    invoke-virtual {v0}, Lcom/turbochilli/rollingsky/c;->h()Lcom/turbochilli/rollingsky/c$b;

    move-result-object v0

    iget-object v1, p0, Lcom/turbochilli/rollingsky/pay/DianXinPay$3;->val$orderId:Ljava/lang/String;

    invoke-interface {v0, v1}, Lcom/turbochilli/rollingsky/c$b;->b(Ljava/lang/String;)V

    .line 173
    iget-object v0, p0, Lcom/turbochilli/rollingsky/pay/DianXinPay$3;->this$0:Lcom/turbochilli/rollingsky/pay/DianXinPay;

    invoke-static {v0}, Lcom/turbochilli/rollingsky/pay/DianXinPay;->access$300(Lcom/turbochilli/rollingsky/pay/DianXinPay;)Lcom/turbochilli/rollingsky/pay/PayCallback;

    move-result-object v0

    iget-object v1, p0, Lcom/turbochilli/rollingsky/pay/DianXinPay$3;->val$product:Lcom/turbochilli/rollingsky/pay/IProduct;

    const/16 v2, 0xb

    invoke-interface {v0, v1, v2}, Lcom/turbochilli/rollingsky/pay/PayCallback;->onSendOrderInfo(Lcom/turbochilli/rollingsky/pay/IProduct;I)V

    .line 175
    :cond_0
    return-void
.end method

第四步:打包文件、破解成功

保存文件,點擊編譯
這裏寫圖片描述
編譯成功後,把APK重新安裝到手機(需要把原來的APK卸載才能安裝),終於搞定,可以愉快的玩耍了。

練習

下面的遊戲以類似的方式可以破解,筆者已經測試通過,有興趣的同學可以試着去玩玩。

遊戲名字 原版下載 破解版下載
滾動的天空 https://pan.baidu.com/s/1qnvA0HfdERwXWxFNNQ0vYg https://pan.baidu.com/s/12nYBnF9xZguT85IRa96t0Q
3D狂野飛車2極速前進 https://pan.baidu.com/s/1BU58b40c2R5PUurNXg7UPA https://pan.baidu.com/s/1DvG8n5z5hAe0QPvEPUtl1w
寶寶打地鼠 https://pan.baidu.com/s/1eKC5aXFL7vIhvMdw1nP5sg https://pan.baidu.com/s/16ZMMGKKpSAQjQbLwd48eHQ
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章