4.4 逆向云播 VIP
作者:飛龍
這次的軟件是刀哥云播箩张,在這里下載:http://www.xuepojie.com/thread-23860-1-1.html
我們先分析一下行為:
打開之后的界面是這樣竭翠,并彈出一行消息:
我們先點擊“福利”棉磨,彈出這樣一行字害晦。
然后我們點擊那個“設(shè)置”设拟,在設(shè)置界面上蛮瞄,我們?nèi)绻c擊“加入會員”,彈出這樣一行消息。
然后我們將其拖進(jìn) Android Killer锋八,發(fā)現(xiàn)它是 e4a 編寫的浙于。
我們直接搜索“會員”,沒有任何結(jié)果挟纱⌒咝铮可見 e4a 直接將字符串硬編碼進(jìn)代碼里。
我們搜索它的 Unicode 編碼紊服,\u4f1a\u5458
試試看:
一共有四個檀轨。程序窗口
類中有兩個,都在圖片列表框1$表項被單擊
方法中欺嗤。內(nèi)容都是“您目前不是會員...”参萄。設(shè)置窗口里的都是“加入會員”,是按鈕的標(biāo)題煎饼,和破解沒太大關(guān)系讹挎。
我們點擊第一個,文本附近的代碼是這樣:
.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" # 您目前不是會員
invoke-static {v0}, Lcom/e4a/runtime/應(yīng)用操作;->彈出提示(Ljava/lang/String;)V
goto :goto_0 # return-void
經(jīng)分析可得腺占,這個是失敗分支的代碼淤袜。然而:cond_1
不是成功分支痒谴,它直接指向return-void
衰伯,所以關(guān)鍵跳應(yīng)該不在這里。由于安卓程序編譯后的 Smali 是打亂的积蔚,應(yīng)該在跳到:cond_4
的地方意鲸。
我們在相同方法中尋找,只找到一處滿足要求的地方:
# 項目索引
.param p1, "\u9879\u76ee\u7d22\u5f15" # I
.prologue
const/4 v3, 0x1
.line 11
.line 12
if-nez p1, :cond_2
# p1 為 0 時的操作(隨播)
# ...
.line 19
:cond_2
if-ne p1, v3, :cond_5
# p1 為 1 時的操作(短片)
.line 20
sget-boolean v0, Lcom/dgplay/公用模塊;->vip:Z
.line 21
# 關(guān)鍵跳
if-ne v0, v3, :cond_4
# 啟動短片窗口的代碼
# ...
要注意這個回調(diào)對應(yīng)圖片列表框尽爆,就是主界面上的六個按鈕(請見圖 1)怎顾。其中p1
是被選中項,按照慣例是從 0 開始漱贱,從左到右從上到下槐雾。我們剛才查看的這段代碼是p1
為 1 情況下的,也就是你點擊右上角的按鈕之后會觸發(fā)幅狮。
(雖然我們實際上不推薦把六個回調(diào)都寫到一個函數(shù)募强,因為它們是六個不同的邏輯,但是由于這是別人的代碼崇摄,只能忍了擎值。)
我們可以看到p1
為 1 時,首先獲取了com/dgplay/公用模塊
的vip
靜態(tài)字段逐抑,判斷它是不是1
(v3
)鸠儿,是的話就啟動窗口,不是的話就彈出消息。
我們還有另一個提示不是會員的位置进每,也就是我們之前測試過的“福利”按鈕(下標(biāo)為 4)汹粤。我們點過去看看:
.line 41
:cond_9
const/4 v0, 0x4
if-ne p1, v0, :cond_c
# p1 為 4 時的代碼
.line 42
sget-boolean v0, Lcom/dgplay/公用模塊;->vip:Z
.line 43
# 關(guān)鍵判斷
if-ne v0, v3, :cond_b
# 啟動福利窗口
# ...
.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ù)這個字段。我們猜想這個靜態(tài)字段是控制當(dāng)前用戶是否是 VIP 的字段品追。為了減少工作量玄括,以及避免可能的暗樁,我們不要直接改動判斷肉瓦,而是將這個字段賦成 1遭京。
但是,在靜態(tài)構(gòu)造器中將這個字段賦成 1 是不行的泞莉,因為主界面中可能有將它重新賦成 0 的代碼哪雕。我們搜索Lcom/dgplay/公用模塊;->vip
,結(jié)果如下:
其中只有主窗口和設(shè)置窗口有賦值鲫趁。設(shè)置窗口那個不用看了斯嚎,因為是購買 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)頁源碼2完畢
函數(shù)中堡僻。當(dāng)然第二處是將其賦為 0 的地方,通過分析邏輯得知疫剃,這個是失敗分支钉疫,而另一個是成功分支。我們向上找到關(guān)鍵跳轉(zhuǎn):
# 關(guān)鍵跳轉(zhuǎn)
if-eqz v0, :cond_0
# ...
# 第一處
# ...
把這句去掉巢价,就可以了牲阁。重新編譯、打包壤躲,大功告成城菊。