【Android 逆向】函数拦截原理 ( 可执行程序基本结构 | GOT 全局偏移表 | 可执行程序函数调用步骤 )
文章目錄
- 一、可執行程序基本結構
- 二、GOT 全局偏移表
- 三、可執行程序函數調用步驟
一、可執行程序基本結構
程序加載到內存中之后 , 會分為以下 333 個部分 :
- 可執行程序
- 自定義函數庫 : Linux / Android 系統中 .so 動態庫 / .a 靜態庫 , Windows 系統中 .dll 動態庫 / .lib 靜態庫 ;
- 系統函數庫
Java 加載到內存之后 , 是 JAR 文件或 DEX 文件 ; Python 加載到內存之后 , 是 Python 腳本 ; 但是二者最終想要在 CPU 上執行 , 還是要轉為以上 333 部分才能執行 ;
二、GOT 全局偏移表
上述 可執行程序 , 自定義庫 , 系統庫 , 按照 333 者發生作用的機制 , 又可以進一步進行如下劃分 :
可執行程序 可以 調用函數 , 這個被調用的函數 可以是 自定義庫 中的函數 , 也可以是 系統庫 中的函數 ;
此時就會存在一個 GOT 全局偏移表 , 當 可執行程序編譯 時 , 并 不知道每個函數的具體位置 ;
函數相對于其所在的函數庫的相對偏移是確定的 , 但是在不同平臺加載時 , 該偏移值是不同的 ;
GOT 表的作用 : 記錄每個函數的位置 , 其分為 222 部分 ;
- 跳轉信息 : 一部分在 可執行程序 中是 跳轉信息 , 會 跳轉到函數對應的 系統庫 或 自定義庫中 ;
- 位置信息 : 另一部分是 函數在函數庫的 位置信息 , 跳轉到對應的函數庫中之后 , 然后再跳轉到 函數庫 中的函數位置 ;
GOT 表 是在加載動態庫 時生成數據的 , 根據加載函數庫時的參數 , 可以設置 加載時填充位置信息 , 還是 調用時填充位置信息 ;
GOT 表是從全局加載的符號表 , 符號表中可能有值 , 也可能沒有值 , 這是由動態庫加載的參數決定的 , 函數調用時 , 該函數的地址值肯定是存在的 ;
三、可執行程序函數調用步驟
可執行程序函數調用步驟 :
① 函數調用 : 可執行程序 執行時 , 先調用函數 , 此時不知道 被調用的函數 地址 ;
② 根據 GOT 表跳轉函數庫 : 跳轉到 GOT 表 , GOT 表會橫跨 可執行程序 , 自定義庫 , 系統庫 333 部分 , 在 可執行程序 內部的部分 是 函數庫跳轉信息 , 先跳轉到對應的函數庫 ;
③ 在函數庫中根據 GOT 表跳轉到函數位置 : 然后查找 GOT 表在函數庫部分的內容 , 是函數的地址 , 根據該函數地址跳轉到函數位置 ;
總結
以上是生活随笔為你收集整理的【Android 逆向】函数拦截原理 ( 可执行程序基本结构 | GOT 全局偏移表 | 可执行程序函数调用步骤 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 逆向】Android
- 下一篇: 【Android 逆向】函数拦截原理 (