在進行安卓安全研究時,hook技術是不可或缺的,常用的有Xposed:Java層的HOOK框架,由於要修改Zgote程式,需要Root,體驗過Xposed,整個過程還是很繁瑣的,並且無法hook,native層的。作為一名安卓菜鳥,Frida明顯更方便,更適合我,結合現有的工具可以很容易的達到hook 的目的。
本篇文章為第一篇,初體驗Frida。
學習的前提:安卓開發基礎 ,推薦:https://www.runoob.com/w3cnote/android-tutorial-android-studio.html,(程式碼敲一遍),java基礎,python基礎,js基礎。
關於Frida的安裝,環境搭建:https://juejin.cn/post/6844904110706130952
簡單體驗Frida,破解一個app。
app很簡單,需要輸入密碼才能進入主頁面;破解思路,我們要找到檢查驗證碼的函式,進行hook.
找到hook點的思路,靜態分析程式碼,藉助工具進行動態除錯。
程式碼1位置處可以看到securityCheck()函式進行校驗,如果返回值為true,驗證成功。在3位置可以看到,函式實在native,要想知道函式內容需要檢視so檔案。
hook一個函式,是返回值為true,可以去hook函式的引數,提交正確的引數可返回true,或者hook函式的返回值,使函式的返回值永遠為true也可以。
這裡我們只從java層去hook,hook函式的返回值,使函式的返回值永遠為true即可
開始寫hook程式碼,我們只需要按照所給的程式碼框架,寫入未入hook程式碼即可。
1 import frida
2 import sys
3
4 jscode = """
5 //這個地方寫js程式碼,也是主要的hook程式碼;
6
7 """
8
9 def on_message(message, data):
10 if message['type'] == 'send':
11 print("[*] {0}".format(message['payload']))
12 else:
13 print(message)
14
15
16 # 重點的4行程式碼
17 process = frida.get_usb_device().attach('com.yaotong.crackme')//更改為要的app包名,.attach可改為spawn。spawn:以包名啟動程式並附加 ,attach:在app執行過程中去附加
18 script = process.create_script(jscode)
19 script.on('message', on_message)
20 script.load()
21 sys.stdin.read()
jscode 裡要寫的內容為
console.log("Hello");
function main() {
console.log("Hello");//列印字元,證明hooK開始
Java.perform(function x() {
var MainActivity = Java.use("com.yaotong.crackme.MainActivity"); //要想hook一個函式我們先要找到他的類,得到類以後可以就呼叫它裡面的函式.Java.use(包名.類名)實現
//MainActivity即為我們hoook到的類,可以直接呼叫裡面的函式,更改屬性值等操作,具體寫法如下(ps:該函式為普通方法,構造方法,過載方法寫法都不同)
MainActivity.securityCheck.implementation = function (str) { //呼叫函式,function裡面的引數要與原函式對應。
return true; //更改返回值,frida會檢測app程式,一旦該pp呼叫了MainActivity裡面的securityCheck()函式,會自動更改返回值為true;
};
})
}
setImmediate(main);
執行指令碼:
接著我們去輸入驗證碼的地方輸入任意值,呼叫該函式都會返回true
hook成功
以上是Frida的初體驗,找到hook點,編寫hook的js程式碼,啟動frida,呼叫該函式,hook成功。整個過程十分方便。