frida hook native
大家好,我是王鐵頭 一個乙方安全公司搬磚的菜雞
持續更新移動安全,iot安全,編譯原理相關原創視頻文章
今天分享的是 frida hook native 也就是 frida hook so層函數
視頻演示:https://space.bilibili.com/430241559
frida是一個輕便好用的工具,不僅支持java層的hook,同樣支持so層的hook. 那么,frida hook so 是如何實現的哪?
這里,根據場景的不同 分為有導出和無導出
原理 通過地址進行hook
有導出:函數名可以在導出表找到 通過導出表的數據結構 用函數名稱進行函數的定位
無導出:函數名在導出表找不到。 這里需要根據函數特征 比如字符串等 手動搜索關鍵字符串定位函數地址
1 有導出so層hook
原理:通過導出表的結構找到函數名對應的匯編代碼的地址。

1.1 有導出適用場景
一般情況下,要hook的函數名可以在導出表找到
找不到只有下面兩種情況
- 寫代碼時使用__attribute__((visibility("hidden")))關鍵字隱藏導出
- 編譯后 被開發者, 加固殼或者第三方框架修改elf格式 被加密抹去相關信息,
下面先討論正常可以在導出表看到的情況
這里我寫了兩個函數
extern "C" void func_exp()
{
LOGD("exp");
}
//這里沒有extern "C"關鍵字 默認是c++風格導出的
//hook時要注意名稱粉碎
void func_exp_cpp()
{
LOGD("exp_cpp");
}
這里只要不做啥騷操作 導出表絕對是可以看到的 如下圖

1.2 frida hook so層有導出代碼
這里 func_exp 函數是c風格導出 所以函數名直接填寫就可以了
但是 func_exp_cpp 函數這里要進入ida里面看具體函數名 如圖

var str_name_so = "libnative-lib.so"; //要hook的so名
var str_name_func = "func_exp"; //要hook的函數名
//var str_name_func = "_Z12func_exp_cppv"; //這里注意名稱粉碎
var n_addr_func = Module.findExportByName(str_name_so , str_name_func);
console.log("func addr is ---" + n_addr_func);
Interceptor.attach(n_addr_func, {
//在hook函數之前執行的語句
onEnter: function(args)
{
console.log("hook on enter")
},
//在hook函數之后執行的語句
onLeave:function(retval)
{
console.log("hook on leave")
}
});
1.3 hook效果圖

2 無導出
無導出這里要使用一個關鍵字才能達到無導出的效果
__attribute__((visibility("hidden")))
這里寫一個例子:
//extern "C" c語言格式導出
__attribute__((visibility("hidden"))) void func_no_exp()
{
LOGD("hidden");
}
生成so文件后,導出表是看不到這個函數的:
如下圖。

因為無導出的函數無法通過函數名去定位地址:
所以這里只能通過手動定位去找到函數對應的偏移 這里可以根據情況用字符串或者看上下級調用定位到偏移 這里的函數偏移是0x7078 還有一點 確定偏移的時候要注意使用的so是v7 arm32 還是 v8 arm64
函數偏移如下 如圖 這里 函數 func_no_exp的偏移是 0x7078

這種函數在ida里面一般是 sub_xxx xxx是16進制的地址
2.2 frida hook so層無導出代碼
var str_name_so = "libnative-lib.so"; //要hook的so名
var n_addr_func_offset = 0x7078; //要hook的函數在函數里面的偏移
//加載到內存后 函數地址 = so地址 + 函數偏移
var n_addr_so = Module.findBaseAddress(str_name_so);
var n_addr_func = parseInt(n_addr_so, 16) + n_addr_func_offset;
var ptr_func = new NativePointer(n_addr_func);
Interceptor.attach(ptr_func,
{
onEnter: function(args)
{
console.log("hook on enter no exp");
},
onLeave:function(retval)
{
console.log("hook on Leave no exp");
}
});
2.3 frida hook so 無導出效果圖

視頻演示:https://space.bilibili.com/430241559
資料代碼下載 請關注公眾號 [移動安全王鐵頭] 回復關鍵字 frida
持續更新移動安全,iot安全,編譯原理相關原創視頻文章

