天天看點

【frida逆向開發】如何Hook app啟動階段的方法

如何Hook app啟動階段的方法onCreate

啟動階段即app沒有完全啟動起來。

正常在hook一個app之前,要将app運作起來才可以進行hook,但是有些時候我們hook的方法是在app啟動階段執行的,該方法在啟動階段執行一次之後在不會執行。我們知道隻有在該方法執行的時候才能hook到。

那麼現在兩者沖突了

  • 正常hook要在app完全啟動之後;
  • 該方法隻在app啟動階段運作一次;
【frida逆向開發】如何Hook 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)。

【frida逆向開發】如何Hook app啟動階段的方法

腳本運作後報錯了,原因是因為源代碼中定義了onCreate方法中的傳參類型

【frida逆向開發】如何Hook app啟動階段的方法
【frida逆向開發】如何Hook app啟動階段的方法

關于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()

           
【frida逆向開發】如何Hook app啟動階段的方法

總結:因為我們hook onCreate方法時需要重新開機app,需要overload(‘android.os.Bundle’)來維持我們重新開機之前的狀态。