【Android 逆向】函数拦截原理 ( 通过修改 GOT 全局偏移表拦截函数 | 通过在实际被调用的函数中添加跳转代码实现函数拦截 )
文章目錄
- 一、通過修改 GOT 全局偏移表攔截函數(shù)
- 二、通過在實際被調(diào)用的函數(shù)中添加跳轉(zhuǎn)代碼實現(xiàn)函數(shù)攔截
一、通過修改 GOT 全局偏移表攔截函數(shù)
使用 GOT 全局偏移表 攔截函數(shù) , 只需要將 GOT 表中的 函數(shù)地址 指向 我們 自定義的 攔截函數(shù) 即可 ;
當(dāng)調(diào)用 指定的 需要被 攔截的函數(shù)時 , 就會調(diào)用我們 自定義的 攔截函數(shù) , 之后再調(diào)用 自定義的處理函數(shù) , 處理函數(shù)有如下處理方式 :
- ① 調(diào)用被攔截函數(shù) : 真實調(diào)用實際 被攔截的函數(shù) , 只是 對參數(shù) 或 返回值 進(jìn)行一系列處理 , 然后返回 返回值 ;
- ② 不調(diào)用被攔截函數(shù) : 也可以不調(diào)用 被攔截函數(shù) , 自己實現(xiàn)一個新的邏輯 替代 被攔截的函數(shù) ;
GOT 表的攔截地址就是一個跳轉(zhuǎn)代碼 ;
該方法存在弊端 , 如果使用 dlopen 函數(shù)打開動態(tài)庫 , 可以直接拿到函數(shù)地址執(zhí)行該函數(shù) , 此時根本就不會向 GOT 表中存放函數(shù)地址 , 這樣就攔截不到函數(shù)了 ;
參考之前的博客 【Android 逆向】Android 進(jìn)程注入工具開發(fā) ( 注入代碼分析 | 獲取注入的 libbridge.so 動態(tài)庫中的 load 函數(shù)地址 并 通過 遠(yuǎn)程調(diào)用 執(zhí)行該函數(shù) ), 使用 dlopen 函數(shù)直接加載 libbridge.so 動態(tài)庫 , 然后調(diào)用 dlsym 函數(shù) , 獲取 libbridge.so 動態(tài)庫中的 load 函數(shù)地址 , 根據(jù)該函數(shù)地址 , 可以直接調(diào)用函數(shù) , 這樣就完美的避開了 GOT 全局偏移表 , 而執(zhí)行函數(shù) ;
因此 , 使用 GOT 表攔截函數(shù)并不能保證 100% 成功 ;
二、通過在實際被調(diào)用的函數(shù)中添加跳轉(zhuǎn)代碼實現(xiàn)函數(shù)攔截
在 實際的被調(diào)用的函數(shù) 中 , 添加 跳轉(zhuǎn)代碼 , 跳轉(zhuǎn)到 攔截函數(shù) 中 , 然后 攔截函數(shù) 調(diào)用 處理函數(shù) , 處理函數(shù)調(diào)用真正的實際函數(shù) , 返回一個返回值 ;
該跳轉(zhuǎn)代碼添加的方式是 直接覆蓋 實際函數(shù)的 代碼 , 不能改變 函數(shù)代碼 的總體大小 , 否則會導(dǎo)致整體的函數(shù)庫調(diào)用出現(xiàn)問題 ; 如 : 跳轉(zhuǎn)代碼 5 字節(jié) , 直接將 實際函數(shù)的 前 5 字節(jié) 修改為 跳轉(zhuǎn)代碼 ;
這里注意 , 處理函數(shù) 調(diào)用 被攔截的 實際函數(shù)時 , 這個實際函數(shù)中 開始的代碼 是我們插入的 跳轉(zhuǎn)代碼 , 真實調(diào)用時 , 一定要將 跳轉(zhuǎn)代碼 恢復(fù)成原來的狀態(tài) 然后才能繼續(xù)調(diào)用 ;
該方法 100% 可以執(zhí)行成功 ;
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的【Android 逆向】函数拦截原理 ( 通过修改 GOT 全局偏移表拦截函数 | 通过在实际被调用的函数中添加跳转代码实现函数拦截 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 逆向】函数拦截原理 (
- 下一篇: 【Android 命令行工具】Andro