frida hook native -- frida hook so層 實例代碼講解


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

原理:通過導出表的結構找到函數名對應的匯編代碼的地址。

frida hook native frida hook so層

1.1 有導出適用場景

一般情況下,要hook的函數名可以在導出表找到
找不到只有下面兩種情況

  1. 寫代碼時使用__attribute__((visibility("hidden")))關鍵字隱藏導出
  2. 編譯后 被開發者, 加固殼或者第三方框架修改elf格式 被加密抹去相關信息,

下面先討論正常可以在導出表看到的情況
這里我寫了兩個函數

extern "C" void func_exp()
{
    LOGD("exp");
}

//這里沒有extern "C"關鍵字 默認是c++風格導出的
//hook時要注意名稱粉碎 
void func_exp_cpp()
{
    LOGD("exp_cpp");
}

這里只要不做啥騷操作 導出表絕對是可以看到的 如下圖
frida hook native

1.2 frida hook so層有導出代碼

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

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效果圖

frida hook so frida hook native

2 無導出

無導出這里要使用一個關鍵字才能達到無導出的效果

__attribute__((visibility("hidden")))

這里寫一個例子:

//extern "C" c語言格式導出
__attribute__((visibility("hidden"))) void func_no_exp()
{
    LOGD("hidden");
}

生成so文件后,導出表是看不到這個函數的:
如下圖。
frida hook 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安全,編譯原理相關原創視頻文章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM