安卓逆向系列教程 4.4 逆向云播 VIP

4.4 逆向云播 VIP

作者:飛龍

這次的軟件是刀哥云播,在這里下載:http://www.xuepojie.com/thread-23860-1-1.html

我們先分析一下行為:

打開(kāi)之后的界面是這樣,并彈出一行消息:

我們先點(diǎn)擊“福利”,彈出這樣一行字。

然后我們點(diǎn)擊那個(gè)“設(shè)置”,在設(shè)置界面上,我們?nèi)绻c(diǎn)擊“加入會(huì)員”,彈出這樣一行消息。

然后我們將其拖進(jìn) Android Killer,發(fā)現(xiàn)它是 e4a 編寫(xiě)的。

我們直接搜索“會(huì)員”,沒(méi)有任何結(jié)果。可見(jiàn) e4a 直接將字符串硬編碼進(jìn)代碼里。

我們搜索它的 Unicode 編碼,\u4f1a\u5458試試看:

一共有四個(gè)。程序窗口類(lèi)中有兩個(gè),都在圖片列表框1$表項(xiàng)被單擊方法中。內(nèi)容都是“您目前不是會(huì)員...”。設(shè)置窗口里的都是“加入會(huì)員”,是按鈕的標(biāo)題,和破解沒(méi)太大關(guān)系。

我們點(diǎn)擊第一個(gè),文本附近的代碼是這樣:

.line 27
:cond_4
if-nez v0, :cond_1 # return-void

.line 28
const-string v0, "\u60a8\u76ee\u524d\u4e0d\u662f\u4f1a\u5458\u54e6 \n \u4e0d\u80fd\u4f7f\u7528\u4f1a\u5458\u529f\u80fd" # 您目前不是會(huì)員

invoke-static {v0}, Lcom/e4a/runtime/應(yīng)用操作;->彈出提示(Ljava/lang/String;)V

goto :goto_0 # return-void

經(jīng)分析可得,這個(gè)是失敗分支的代碼。然而:cond_1不是成功分支,它直接指向return-void,所以關(guān)鍵跳應(yīng)該不在這里。由于安卓程序編譯后的 Smali 是打亂的,應(yīng)該在跳到:cond_4的地方。

我們?cè)谙嗤椒ㄖ袑ふ遥徽业揭惶帩M(mǎn)足要求的地方:

# 項(xiàng)目索引
.param p1, "\u9879\u76ee\u7d22\u5f15"    # I

.prologue
const/4 v3, 0x1

.line 11
.line 12
if-nez p1, :cond_2
# p1 為 0 時(shí)的操作(隨播)
# ...

.line 19
:cond_2
if-ne p1, v3, :cond_5
# p1 為 1 時(shí)的操作(短片)

.line 20
sget-boolean v0, Lcom/dgplay/公用模塊;->vip:Z

.line 21
# 關(guān)鍵跳
if-ne v0, v3, :cond_4
# 啟動(dòng)短片窗口的代碼
# ...

要注意這個(gè)回調(diào)對(duì)應(yīng)圖片列表框,就是主界面上的六個(gè)按鈕(請(qǐng)見(jiàn)圖 1)。其中p1是被選中項(xiàng),按照慣例是從 0 開(kāi)始,從左到右從上到下。我們剛才查看的這段代碼是p1為 1 情況下的,也就是你點(diǎn)擊右上角的按鈕之后會(huì)觸發(fā)。

(雖然我們實(shí)際上不推薦把六個(gè)回調(diào)都寫(xiě)到一個(gè)函數(shù),因?yàn)樗鼈兪橇鶄€(gè)不同的邏輯,但是由于這是別人的代碼,只能忍了。)

我們可以看到p1為 1 時(shí),首先獲取了com/dgplay/公用模塊vip靜態(tài)字段,判斷它是不是1v3),是的話(huà)就啟動(dòng)窗口,不是的話(huà)就彈出消息。

我們還有另一個(gè)提示不是會(huì)員的位置,也就是我們之前測(cè)試過(guò)的“福利”按鈕(下標(biāo)為 4)。我們點(diǎn)過(guò)去看看:

.line 41
:cond_9
const/4 v0, 0x4

if-ne p1, v0, :cond_c
# p1 為 4 時(shí)的代碼

.line 42
sget-boolean v0, Lcom/dgplay/公用模塊;->vip:Z

.line 43

# 關(guān)鍵判斷
if-ne v0, v3, :cond_b
# 啟動(dòng)福利窗口
# ...

.line 48
:cond_b
if-nez v0, :cond_1 # return-void

.line 49
const-string v0, "\u60a8\u76ee\u524d\u4e0d\u662f\u4f1a\u5458\u54e6 \n \u4e0d\u80fd\u4f7f\u7528\u4f1a\u5458\u529f\u80fd"

invoke-static {v0}, Lcom/e4a/runtime/應(yīng)用操作;->彈出提示(Ljava/lang/String;)V

goto/16 :goto_0 # return-void

果然還是根據(jù)這個(gè)字段。我們猜想這個(gè)靜態(tài)字段是控制當(dāng)前用戶(hù)是否是 VIP 的字段。為了減少工作量,以及避免可能的暗樁,我們不要直接改動(dòng)判斷,而是將這個(gè)字段賦成 1。

但是,在靜態(tài)構(gòu)造器中將這個(gè)字段賦成 1 是不行的,因?yàn)橹鹘缑嬷锌赡苡袑⑺匦沦x成 0 的代碼。我們搜索Lcom/dgplay/公用模塊;->vip,結(jié)果如下:

其中只有主窗口和設(shè)置窗口有賦值。設(shè)置窗口那個(gè)不用看了,因?yàn)槭琴?gòu)買(mǎi) VIP 的地方,它肯定是將其賦值為 1,那么主窗口中:

# 第一處
.line 16
const/4 v0, 0x1
sput-boolean v0, Lcom/dgplay/公用模塊;->vip:Z

# 第二處
.line 18
:cond_0
const-string v0, "\u60a8\u76ee\u524d\u8fd8\u4e0d\u662fVIP,\u53ef\u8d5e\u52a9\u4f5c\u8005\u83b7\u5f97VIP"

invoke-static {v0}, Lcom/e4a/runtime/應(yīng)用操作;->彈出提示(Ljava/lang/String;)V

.line 19
# v1 為 0x0
sput-boolean v1, Lcom/dgplay/公用模塊;->vip:Z

goto :goto_0

這兩處都在多線程1$取網(wǎng)頁(yè)源碼2完畢函數(shù)中。當(dāng)然第二處是將其賦為 0 的地方,通過(guò)分析邏輯得知,這個(gè)是失敗分支,而另一個(gè)是成功分支。我們向上找到關(guān)鍵跳轉(zhuǎn):

# 關(guān)鍵跳轉(zhuǎn)
if-eqz v0, :cond_0

# ...
# 第一處
# ...

把這句去掉,就可以了。重新編譯、打包,大功告成。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,422評(píng)論 25 708
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,969評(píng)論 19 139
  • “對(duì)象”這個(gè)詞很好,這個(gè)人是我吃飯睡覺(jué)娛樂(lè)以及交換意見(jiàn)的對(duì)象,“對(duì)象”比“愛(ài)人”客觀,“對(duì)象”是純粹的名詞,“愛(ài)人...
    sam_閱讀 280評(píng)論 0 0
  • 幾年前,翻看過(guò)《渴望生活》的pdf版本,歷史小說(shuō)過(guò)于瑣碎的細(xì)節(jié)描寫(xiě),讓我感受不到閱讀的樂(lè)趣,翻過(guò)幾頁(yè)就停下了。 今...
    adamant555閱讀 239評(píng)論 0 0
  • 你可將此文視為一篇游記,一篇文學(xué)賞析,一篇規(guī)勸讀書(shū)的箴言,或是一篇家庭教育的啟示錄……筆者已傾其所有,讀者請(qǐng)各取所...
    欣音木子閱讀 2,406評(píng)論 2 8