目錄
- 初識Frida--Android逆向之Java層hook (二)
- apk的安裝與分析
- 流程分析
- hook點分析
- JavaScript代碼構造與執行
- 0x00 hook getMac()
- 0x01 計算秘鑰Key
- 0x02 調用showPremium擷取答案
- 總結
今天繼續一個新的示例,同樣采用CTF作為例子,難度稍微加大了一點,如果對Frida基本的使用還不是很了解,建議先看看之前的文章初識Frida--Android逆向之Java層hook (一)
部落格同步:通路
文章涉及到的知識點:
- 怎麼使用javascript執行個體化類并調用類方法
- 怎麼在"jscode"中增加自定義javascript方法
- 怎麼較為靈活的hook類方法
apk的安裝與分析
示例下載下傳:whyshouldIpay
下載下傳apk後安裝,一樣還是先來看看是什麼功能,這是一個比較簡單的驗證程式,簡單的使用後,了解到
PREMIUM CONETNT
内容需要輸入License驗證後才能檢視。那估計
PREMIUM CONETNT
按鈕中的内容應該就是答案了吧。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuAFOQRjMEN1QXhDWXh0VV91N3ITMxgzLcZDM4EDMy8CXoNWY0RXYvwFZh9GbwV3Lc12bj5SepRWZw5yciJ2Lc9CX6MHc0RHaiojIsJye.png)
流程分析
使用jadx将apk反編譯出來,分析,在AndroidManifest.xml中找到了啟動的Activity是
LauncherActivity
。
找到其中驗證的主要代碼
verifyClick
,分析如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |
在
verifyClick
中可以知道生成激活秘鑰的算法是
MainActivity.xor
。
1 | |
來到
MainActivity
中,檢視該方法,看上去筆算起來還是比較麻煩。
1 2 3 4 5 6 7 | |
接下來當程式被激活成功後,點選
PREMIUM CONETNT
按鈕,會調用
MainActivity
中的方法,可以看到它将MAC,以及生成的Key發送到了
MainActivity
中。
1 2 3 4 5 6 | |
在
MainActivity
的
onCreate
方法中,看到了最終答案生成的native方法
stringFromJNI(key, mac)
。
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
好,現在源代碼分析基本上能夠理清楚了,大概的過程就是這樣。
- 輸入License,進行驗證
- 通過網絡驗證擷取傳回值“LICENSEKEYOK”後,然後調用
在本地MainActivity.xor
檔案中生成秘鑰,激活成功。preferences
- 本地擷取MAC位址及秘鑰Key傳入
得出答案。MainActivity
hook點分析
接下來重點就是要尋找hook點,經過剛才解題流程的分析,得出hook思路如下:
- 擷取getMac()函數的傳回值,與“LICENSEKEYOK"字元串進行xor運算得出秘鑰Key.
- hook getKey方法,讓它不從
檔案讀取Key,而是我們自己構造。preferences
- hook
,讓它調用verifyClick
方法showPremium
JavaScript代碼構造與執行
0x00 hook getMac()
先來一個簡單的示例,看看getMac()方法傳回的的是什麼,采用的方法是hook
showPremium
,這樣就能通過點選
PREMIUM CONETNT
按鈕直接得到
getMac()
的傳回值。
JavaScript代碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
完整python代碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | |
運作看看結果:
0x01 計算秘鑰Key
接下來開始真正第一步的hook,将mac值與“LICENSEKEYOK"通過
MainActivity.xor
擷取秘鑰Key。那就直接hook
getKey
方法吧,這樣可以自己來構造秘鑰Key。
仔細分析,會發現在這一步中可能會遇到下面的問題:
- 怎麼調用xor方法。
- java是強類型語言,javascript是弱類型語言,怎麼将javascript參數進行類型轉換并傳遞到java語言中。
怎麼将javascript參數進行類型轉換并傳遞到java語言中?其實方法很簡單,既然java是強類型語言,那就根據它要求的類型傳遞對應參數即可,看看它參數的類型。
1 2 3 4 5 6 7 | |
那麼,在javascript代碼中,先準備一個将字元串類型轉換為byte[]類型的方法
stringToBytes
,再通過執行個體化
MainActivity
類的方式調用
xor()
,然後還需要一個将byte[]回轉為String的方法,因為秘鑰key是Sting類型的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | |
接下來,執行看看,能不能擷取秘鑰Key。
不知道怎麼啟動模拟器中的frida-server,以及端口轉發,可以先看看初識Frida--Android逆向之Java層hook (一)
啟動python腳本,在模拟器中直接點選PREMIUM CONTENT,即可看到執行結果。
0x02 調用showPremium擷取答案
前面2個步驟,可以說是已經完成90%了,接下來隻需要在hook一個能夠觸發showPremium方法的即可。方法就随意了,這裡采用hook verifyClick的方式,這樣點選app上的
VERIFY
按鈕,觸發verifyClick方法去調用showPremium,進而獲得最終答案。
1 2 3 | |
啟動腳本,點選app上的
VERIFY
按鈕看看執行結果:
完整python代碼:下載下傳
總結
通過上面的例子,可以學習在java層怎麼使用frida實作:
- 任意類方法調用。
-
任意類方法重實作。
以及學會怎麼構造和使用自定義javascript方法。
當然這還僅僅隻是一個開始.....
https://bbs.pediy.com/thread-227233.htm