大家好,我是王鐵頭 一個乙方安全公司搬磚的菜雞
持續更新移動安全,iot安全,編譯原理相關原創視頻文章
今天分享的是frida 延時hook的三種方法
應用場景:
很多時候 我們在工作或者學習過程中。
如果去分析一些帶殼APP,或者一些做了防護的APP話。
用frida直接去注入hook一些類,經常會注入失敗,提示 Error: java.lang.ClassNotFoundException: Didn't find class "xxxx" 找不到類之類的。就像下圖一樣。
原理分析:
那明明要hook的類在apk代碼中是真實存在的,為啥hook不到哪?造成這種情況的原因是什么哪?
原因是這樣的,當apk做了一些保護手段或者加了殼, 這時候代碼文件或者dex 一般是加密存儲在一個文件里的。我們直接去hook的時候,外殼程序可能還沒有把加密的代碼文件或者dex解密,還沒有進行加載。
那這個時間點,我們去hook,hook不到就很正常了。那要怎么去解決哪?
解決方案:
第一種方案 命令行不加 --no-pause
加--no-pause與不加 --no-pause的區別主要是 hook時機的早晚。 --no-pause是即時hook, 而不加--no-pause 這個參數的話。frida會拉起進程,停在加載主界面之前,這時候 應用會出現白屏狀態,就像
恢復主線程運行的話,這里要手動用 %resume關鍵字。
這種方法的原理是, 在手動用%resume關鍵字恢復主線程運行之前,frida已經拉起了進程,外殼程序已經在啟動,所以這里等個幾秒用%resume關鍵字恢復,有一定幾率是可以hook到的。
第二種方案 setTimeout
setTimeout是一個js的函數。主要作用是讓函數等待一段時間后執行。
//參數1 要執行函數名 //參數2 要執行函數等待的時間 毫秒數 setTimeout(func, 5000);
注意
注意
注意
setTimeout函數跟sleep不同。 sleep函數是阻塞的,而setTimeout函數不阻塞
//執行Hook方法
function test()
{
Java.perform(function ()
{
console.log("====start hook====");
var cls_MainActivity = Java.use("com.example.test_trace.MainActivity");
cls_MainActivity.show_test.implementation = function ()
{
console.log("start show_test");
return this.show_test();
};
});
}
setImmediate(function(){
//延遲5秒調用Hook方法
setTimeout(test, 5000);
console.log("====start ====");
#''' 假裝后面有代碼'''
});
這里我寫了一個例子,setTimeout函數的調用在第20行,不阻塞的意思是
在腳本執行第20行的時候 setTimeout(test, 5000); 這句代碼的時候
會繼續執行第21行代碼,也會繼續執行后續的代碼
但是test函數會在5秒后被調用。
如果這里20行的代碼是 sleep(5000), 就會有不同的效果。代碼會卡在第20行不動,5秒后才會執行21行。
這里通過 setTimeout 函數也達到了一個延時hook的效果。
所以上面那段代碼執行的效果就是
這里的5000 可以根據實際情況進行調整。
第3種方案 hook上游關聯的函數
假如要hook的目標函數是enc函數
這時enc的調用層級是 a-->b-->c-->enc()
偽代碼
//調用層級 a-->b-->c
class A
{
void a(String str)
{
B.b();
}
}
class B
{
void b()
{
C.c();
}
}
class C
{
int c()
{
"""
ENC.enc()
}
}
class ENC
{
String enc()
{
}
}
如果這個時候我們直接去hook ENC類的 enc方法hook不到的話,可以hook enc上游的方法。
在上游函數的hook代碼里面去寫hook enc的代碼。也能達到延時hook的目的。
視頻演示:https://space.bilibili.com/430241559
相關代碼資料 關注公眾號 [移動安全王鐵頭] 回復關鍵字 frida 下載:
持續更新移動安全,iot安全,編譯原理相關原創視頻文章
