Android破解-滾動(dòng)的天空

Android破解-滾動(dòng)的天空

前言

最近看到很多學(xué)生在玩滾動(dòng)的天空這個(gè)游戲仑濒,這游戲看起來(lái)還挺有趣的撑教,于是我也去下載玩了幾把朝墩。可是伟姐,坑吶收苏,這游戲太難了,考驗(yàn)人的快速判斷能力和手指滑動(dòng)速度愤兵,玩的很渣鹿霸。玩游戲技術(shù)不行怎么辦呢?俗話(huà)說(shuō)秆乳,能力不夠金錢(qián)來(lái)湊懦鼠!哈哈哈,游戲世界不都是這樣的嗎屹堰?各個(gè)游戲界的大神哪個(gè)不是用金錢(qián)堆起來(lái)的葛闷。玩游戲只是為了娛樂(lè),能夠用一點(diǎn)金錢(qián)來(lái)購(gòu)買(mǎi)的娛樂(lè)有什么關(guān)系呢双藕?反正我的理解是這樣的。于是阳仔,能不住想要購(gòu)買(mǎi)道具了忧陪。但是,突然又想到近范,我們學(xué)IT的嘶摊,玩這個(gè)小游戲還需要花錢(qián)?自己破解游戲不就好了嗎评矩?于是叶堆,就開(kāi)始動(dòng)工了。從中午休息時(shí)間開(kāi)始就著手去做這件事了斥杜,搞到我中午都沒(méi)有休息虱颗,下午下班后回到家繼續(xù)搞事情。直到晚上九點(diǎn)蔗喂,終于把這破游戲破解成功了忘渔。

使用的技術(shù)和工具

話(huà)說(shuō),磨刀不誤砍材工缰儿,要想破解一款軟件畦粮,至少要懂該軟件的基本編程,所以破解Android軟件是需要懂得Android應(yīng)用的編程才可以的。其中用到的技術(shù)當(dāng)然少不了大名鼎鼎的Java語(yǔ)言宣赔,然后是Android開(kāi)發(fā)基礎(chǔ)预麸,要懂得Android SDK的功能和使用,會(huì)基本的Smali語(yǔ)法儒将。另外吏祸,還需要使用一些工具軟件來(lái)輔助。

  1. 本次使用的APK使最新版的滾動(dòng)的天空椅棺,以后如果出新版可能不適用犁罩,這是原版沒(méi)有破解的APK下載地址:https://pan.baidu.com/s/1VuWRP7bhUsHg0kjsCpoNpA
    破解后的APK:
    https://pan.baidu.com/s/1F0JomQeEKRqE-hUn8k9yUA
  2. 使用Android Killer V1.3.1.0版本的反編譯工具,這個(gè)工具很強(qiáng)大適合初學(xué)者使用两疚,想要深入學(xué)習(xí)的話(huà)最好用其他的軟件床估。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

破解過(guò)程

第一步:反編譯APK

打開(kāi)Android Killer诱渤,直接鼠標(biāo)拖動(dòng)安裝包APK文件到窗口丐巫,會(huì)自動(dòng)反編譯


這里寫(xiě)圖片描述

如果出現(xiàn)失敗的情況,則需要下載最新的apktool.jar勺美,手動(dòng)添加到Android Killer中


這里寫(xiě)圖片描述

第二步:尋找破解關(guān)鍵點(diǎn)

下面递胧,在道具商城點(diǎn)擊商品的的時(shí)候會(huì)提示:sim卡與支付服務(wù)運(yùn)營(yíng)商不匹配或網(wǎng)絡(luò)未連接,請(qǐng)檢查網(wǎng)或無(wú)法購(gòu)買(mǎi)赡茸,未插入sim卡等信息缎脾,在Android Killer中可以根據(jù)這個(gè)提示的內(nèi)容搜索到這個(gè)內(nèi)容在項(xiàng)目中出現(xiàn)的位置。


這里寫(xiě)圖片描述

可以看到這個(gè)字符串是在Strings.xml中定義的占卧,代碼通過(guò)這個(gè)字符串的id來(lái)調(diào)用這個(gè)字符串遗菠。接著,可以在public.xml中看到這個(gè)字符串的id值


這里寫(xiě)圖片描述

然后华蜒,搜索這個(gè)ID值0x7f050028就可以找到在代碼中調(diào)用這個(gè)字符串的位置
這里寫(xiě)圖片描述

可以看到辙纬,在a.smali文件中調(diào)用了這個(gè)字符串,下面是調(diào)用這個(gè)字符串的函數(shù)的全部?jī)?nèi)容:

.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

通過(guò)代碼可以看到叭喜,前面很多的內(nèi)容都是用來(lái)判斷網(wǎng)絡(luò)狀況贺拣、SIM運(yùn)營(yíng)商等信息的,我們可以把它們?nèi)縿h掉捂蕴,只留下調(diào)用支付功能的核心代碼譬涡,改動(dòng)后如下:

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

    .prologue
    .line 302
    #點(diǎn)擊道具商品后,執(zhí)行到這里啥辨,去除了判斷網(wǎng)絡(luò)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
    #這里調(diào)用支付功能
    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

保持文件昂儒,點(diǎn)擊編譯,會(huì)提示編譯成功委可,把安裝包安裝到手機(jī)上渊跋,可以看到腊嗡,點(diǎn)擊道具后直接就彈出了支付方式選擇界面,沒(méi)有再提示網(wǎng)絡(luò)情況和SIM卡情況的現(xiàn)象了拾酝。但是燕少,到這里并沒(méi)有破解成功,依舊還是需要支付的蒿囤。


這里寫(xiě)圖片描述

第三步:找到支付回調(diào)

從上面可以看到PayAgent類(lèi)是一個(gè)抽象類(lèi)客们,下面是PayAgent.smali最前面的內(nèi)容:

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

查看這個(gè)類(lèi)的內(nèi)容,可以看到里面的pay函數(shù)是一個(gè)抽象函數(shù):

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

所以材诽,必須要找到這個(gè)類(lèi)的實(shí)現(xiàn)類(lèi)才能定位到真正的支付功能的代碼底挫,查看PayAgent.smali同目錄的其他文件,很容易可看到脸侥,pay這個(gè)目錄下面的內(nèi)容都是支付相關(guān)的代碼建邓,查看各個(gè)類(lèi)內(nèi)容,可以找DianxinPay繼承自PayAgent睁枕,所以DianxinPay里面的pay函數(shù)才是真正的支付代碼官边。后面還有接著,EgamePay才是真正的支付網(wǎng)絡(luò)請(qǐng)求外遇,這里就不詳細(xì)展開(kāi)了注簿。通過(guò)這些追蹤,最后找到DianXinPay$3.smali文件里面有三個(gè)支付結(jié)果回調(diào):

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

把payCancel函數(shù)里面的所有內(nèi)容替換為paySuccess里面的內(nèi)容跳仿,這時(shí)候破解完成诡渴,當(dāng)在APP中取消支付的時(shí)候,會(huì)實(shí)現(xiàn)支付完成的效果菲语。下面是payCancel函數(shù)的內(nèi)容:

.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
    
    #雷:這里是核心關(guān)鍵的破解位置玩徊,在彈出的支付界面直接退出支付界面會(huì)調(diào)用這個(gè)取消支付的函數(shù),把內(nèi)容
    #全部替換為支付成功函數(shù)的內(nèi)容就可以了谨究。
    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

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

保存文件泣棋,點(diǎn)擊編譯


這里寫(xiě)圖片描述

編譯成功后胶哲,把APK重新安裝到手機(jī)(需要把原來(lái)的APK卸載才能安裝),終于搞定潭辈,可以愉快的玩耍了鸯屿。

練習(xí)

下面的游戲以類(lèi)似的方式可以破解,筆者已經(jīng)測(cè)試通過(guò)把敢,有興趣的同學(xué)可以試著去玩玩寄摆。

游戲名字 原版下載 破解版下載
滾動(dòng)的天空 https://pan.baidu.com/s/1qnvA0HfdERwXWxFNNQ0vYg https://pan.baidu.com/s/12nYBnF9xZguT85IRa96t0Q
3D狂野飛車(chē)2極速前進(jìn) https://pan.baidu.com/s/1BU58b40c2R5PUurNXg7UPA https://pan.baidu.com/s/1DvG8n5z5hAe0QPvEPUtl1w
寶寶打地鼠 https://pan.baidu.com/s/1eKC5aXFL7vIhvMdw1nP5sg https://pan.baidu.com/s/16ZMMGKKpSAQjQbLwd48eHQ
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市修赞,隨后出現(xiàn)的幾起案子婶恼,更是在濱河造成了極大的恐慌桑阶,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勾邦,死亡現(xiàn)場(chǎng)離奇詭異蚣录,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)眷篇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)萎河,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蕉饼,你說(shuō)我怎么就攤上這事虐杯。” “怎么了昧港?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵擎椰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我慨飘,道長(zhǎng)确憨,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任瓤的,我火速辦了婚禮休弃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘圈膏。我一直安慰自己塔猾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布稽坤。 她就那樣靜靜地躺著丈甸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尿褪。 梳的紋絲不亂的頭發(fā)上睦擂,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音杖玲,去河邊找鬼顿仇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛摆马,可吹牛的內(nèi)容都是我干的臼闻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼囤采,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼述呐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蕉毯,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤乓搬,失蹤者是張志新(化名)和其女友劉穎思犁,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體缤谎,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抒倚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坷澡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片托呕。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖频敛,靈堂內(nèi)的尸體忽然破棺而出项郊,到底是詐尸還是另有隱情,我是刑警寧澤斟赚,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布着降,位于F島的核電站,受9級(jí)特大地震影響拗军,放射性物質(zhì)發(fā)生泄漏任洞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一发侵、第九天 我趴在偏房一處隱蔽的房頂上張望交掏。 院中可真熱鬧,春花似錦刃鳄、人聲如沸盅弛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)挪鹏。三九已至,卻和暖如春愉烙,著一層夾襖步出監(jiān)牢的瞬間讨盒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工步责, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留返顺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓勺择,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親伦忠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子省核,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,114評(píng)論 25 707
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料昆码? 從這篇文章中你...
    hw1212閱讀 12,723評(píng)論 2 59
  • 一气忠、前言 今天我們開(kāi)始apk破解的另外一種方式:動(dòng)態(tài)代碼調(diào)試破解邻储,之前其實(shí)已經(jīng)在一篇文章中說(shuō)到如何破解apk了: ...
    JiangWei_App閱讀 3,664評(píng)論 2 29
  • 我也算是天音的老學(xué)員了吧,我之所以暑假?zèng)]有出去玩旧噪,而是來(lái)天音學(xué)習(xí)吨娜,是因?yàn)槲铱粗辛颂煲舻慕虒W(xué)方法。天音的教學(xué)方法...
    PINK_PANTHER閱讀 192評(píng)論 0 1
  • 今天早在門(mén)口和閨女吃早餐淘钟,閨女感了宦赠,有點(diǎn)兒發(fā)燒,剛打完針米母,我?guī)渣c(diǎn)東西勾扭。 閨女因感冒的原因,就沒(méi)胃口铁瞒,一小口一小...
    李冰兒閱讀 651評(píng)論 1 1