如何Hook app啟動階段的方法onCreate
啟動階段即app沒有完全啟動起來。
正常在hook一個app之前,要将app運作起來才可以進行hook,但是有些時候我們hook的方法是在app啟動階段執行的,該方法在啟動階段執行一次之後在不會執行。我們知道隻有在該方法執行的時候才能hook到。
那麼現在兩者沖突了
- 正常hook要在app完全啟動之後;
- 該方法隻在app啟動階段運作一次;
例如:onCreate方法在app啟動階段首先執行該方法(畫界面),且執行一次之後不會在執行。
Hook腳本:
import frida #導入frida子產品
import sys #導入sys子產品
jscode = """
Java.perform(function(){
var TestSig = Java.use("com.yaotong.crackme.MainActivity"); // 類的加載路徑
TestSig.onCreate.implementation = function(str){
send("success");
this.onCreate();
};
});
"""
def on_message(message,data): #js中執行send函數後要回調的函數
if message["type"] == "send":
print("[*] {0}".format(message["payload"]))
else:
print(message)
process = frida.get_usb_device()
pid = process.spawn(['com.yaotong.crackme']) # app包名
session = process.attach(pid) # 加載程序号
script = session.create_script(jscode) #建立js腳本
script.on('message',on_message) #加載回調函數,也就是js中執行send函數規定要執行的python函數
script.load() #加載腳本
process.resume(pid) ########### 重新開機app
sys.stdin.read()
先啟動app,根據包名找到應用程式,然後重新開機app,hook對應的方法(onCreate)。
腳本運作後報錯了,原因是因為源代碼中定義了onCreate方法中的傳參類型
關于overload參考:https://blog.csdn.net/qq_18505715/article/details/70432196
關于android.os.Bundle:
這個是在Activity類裡面導的一個包,在onCreate時候,會傳入一個變量,裡面包含上次退出的資訊,這裡面可以恢複上次退出的狀态。
最終實作代碼:
import frida #導入frida子產品
import sys #導入sys子產品
jscode = """
Java.perform(function(){
var TestSig = Java.use("com.yaotong.crackme.MainActivity"); // 類的加載路徑
TestSig.onCreate.overload('android.os.Bundle').implementation = function(str){
send("success1");
this.onCreate(str);
send("success2");
};
});
"""
def on_message(message,data): #js中執行send函數後要回調的函數
if message["type"] == "send":
print("[*] {0}".format(message["payload"]))
else:
print(message)
process = frida.get_usb_device()
pid = process.spawn(['com.yaotong.crackme']) # app包名
session = process.attach(pid) # 加載程序号
script = session.create_script(jscode) #建立js腳本
script.on('message',on_message) #加載回調函數,也就是js中執行send函數規定要執行的python函數
script.load() #加載腳本
process.resume(pid) # 重新開機app
sys.stdin.read()
總結:因為我們hook onCreate方法時需要重新開機app,需要overload(‘android.os.Bundle’)來維持我們重新開機之前的狀态。