4.4 逆向云播 VIP
作者:飛龍
這次的軟件是刀哥云播,在這里下載:http://www.xuepojie.com/thread-23860-1-1.html
我們先分析一下行為:
打開之后的界面是這樣,并彈出一行消息:
我們先點擊“福利”,彈出這樣一行字。
然后我們點擊那個“設置”,在設置界面上,我們如果點擊“加入會員”,彈出這樣一行消息。
然后我們將其拖進 Android Killer,發現它是 e4a 編寫的。
我們直接搜索“會員”,沒有任何結果。可見 e4a 直接將字符串硬編碼進代碼里。
我們搜索它的 Unicode 編碼,\u4f1a\u5458
試試看:
一共有四個。程序窗口
類中有兩個,都在圖片列表框1$表項被單擊
方法中。內容都是“您目前不是會員...”。設置窗口里的都是“加入會員”,是按鈕的標題,和破解沒太大關系。
我們點擊第一個,文本附近的代碼是這樣:
.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/應用操作;->彈出提示(Ljava/lang/String;)V
goto :goto_0 # return-void
經分析可得,這個是失敗分支的代碼。然而:cond_1
不是成功分支,它直接指向return-void
,所以關鍵跳應該不在這里。由于安卓程序編譯后的 Smali 是打亂的,應該在跳到: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
# 關鍵跳
if-ne v0, v3, :cond_4
# 啟動短片窗口的代碼
# ...
要注意這個回調對應圖片列表框,就是主界面上的六個按鈕(請見圖 1)。其中p1
是被選中項,按照慣例是從 0 開始,從左到右從上到下。我們剛才查看的這段代碼是p1
為 1 情況下的,也就是你點擊右上角的按鈕之后會觸發。
(雖然我們實際上不推薦把六個回調都寫到一個函數,因為它們是六個不同的邏輯,但是由于這是別人的代碼,只能忍了。)
我們可以看到p1
為 1 時,首先獲取了com/dgplay/公用模塊
的vip
靜態字段,判斷它是不是1
(v3
),是的話就啟動窗口,不是的話就彈出消息。
我們還有另一個提示不是會員的位置,也就是我們之前測試過的“福利”按鈕(下標為 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
# 關鍵判斷
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/應用操作;->彈出提示(Ljava/lang/String;)V
goto/16 :goto_0 # return-void
果然還是根據這個字段。我們猜想這個靜態字段是控制當前用戶是否是 VIP 的字段。為了減少工作量,以及避免可能的暗樁,我們不要直接改動判斷,而是將這個字段賦成 1。
但是,在靜態構造器中將這個字段賦成 1 是不行的,因為主界面中可能有將它重新賦成 0 的代碼。我們搜索Lcom/dgplay/公用模塊;->vip
,結果如下:
其中只有主窗口和設置窗口有賦值。設置窗口那個不用看了,因為是購買 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/應用操作;->彈出提示(Ljava/lang/String;)V
.line 19
# v1 為 0x0
sput-boolean v1, Lcom/dgplay/公用模塊;->vip:Z
goto :goto_0
這兩處都在多線程1$取網頁源碼2完畢
函數中。當然第二處是將其賦為 0 的地方,通過分析邏輯得知,這個是失敗分支,而另一個是成功分支。我們向上找到關鍵跳轉:
# 關鍵跳轉
if-eqz v0, :cond_0
# ...
# 第一處
# ...
把這句去掉,就可以了。重新編譯、打包,大功告成。