【Android 逆向】函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )
文章目錄
- 一、GOT 表攔截與插樁攔截
- 二、插樁攔截簡介
- 三、插樁攔截涉及的 ARM 和 x86 中的跳轉(zhuǎn)指令
一、GOT 表攔截與插樁攔截
函數(shù)攔截有 222 種方式 :
- 使用 GOT 表進(jìn)行函數(shù)攔截 : 修改 GOT 表實(shí)現(xiàn)函數(shù)攔截 ;
- 插樁攔截 : 該方法就是 在實(shí)際被調(diào)用的函數(shù)中添加跳轉(zhuǎn)代碼實(shí)現(xiàn)函數(shù)攔截 ;
在 【Android 逆向】函數(shù)攔截原理 ( 通過修改 GOT 全局偏移表攔截函數(shù) | 通過在實(shí)際被調(diào)用的函數(shù)中添加跳轉(zhuǎn)代碼實(shí)現(xiàn)函數(shù)攔截 ) 博客中分析到 , " 使用 GOT 表進(jìn)行函數(shù)攔截 " 方法不能保證 100% 成功 , 插樁攔截 可以實(shí)現(xiàn) 100% 攔截成功率 ;
" 插樁攔截 " 由于需要 修改代碼 , 可能會 被反調(diào)試工具發(fā)現(xiàn) , 如果是游戲 , 賬號估計就涼了 ; 反調(diào)試工具 不可能監(jiān)控所有的函數(shù) , 一個應(yīng)用的函數(shù)個數(shù)都是以萬進(jìn)行計算的 ;
二、插樁攔截簡介
插樁攔截 : 在要 調(diào)用的實(shí)際函數(shù) 的入口處 , 寫入跳轉(zhuǎn)代碼 , 跳轉(zhuǎn)到 我們自定義的 攔截函數(shù)中 , 在攔截函數(shù)中 , 執(zhí)行 處理函數(shù) , 處理函數(shù)再次調(diào)用實(shí)際函數(shù) 或 自己執(zhí)行一些其它函數(shù) ;
三、插樁攔截涉及的 ARM 和 x86 中的跳轉(zhuǎn)指令
插樁攔截 時 , 在 實(shí)際函數(shù) 入口處寫入的 跳轉(zhuǎn)代碼 就是 匯編中的 跳轉(zhuǎn)指令 ;
跳轉(zhuǎn)指令 可以理解為 " 指令 " 或 " 機(jī)器碼 " , 指令是人看到的 匯編指令 , 機(jī)器碼是給 CPU 執(zhí)行的 二進(jìn)制機(jī)器碼 ; 二者是等效的 ;
x86 架構(gòu)下的跳轉(zhuǎn)指令 : 下面的二進(jìn)制數(shù)都是十六進(jìn)制數(shù) ; 323232 位指令 ;
E9 00 00 00 00 , JMP target ;
JMP 是強(qiáng)制跳轉(zhuǎn)指令 , E9 是對應(yīng)的機(jī)器碼 ;
ARM 架構(gòu)下的跳轉(zhuǎn)指令 : 下面的二進(jìn)制數(shù)都是十六進(jìn)制數(shù) ; 323232 位指令 ;
04 F0 1F E5 00 00 00 00 , B target ;
B 指令是無條件跳轉(zhuǎn)指令 , 04 F0 1F E5 是對應(yīng)的機(jī)器碼 ;
x86 架構(gòu)是 復(fù)雜指令集 , ARM 架構(gòu)是 精簡指令集 , 從上面的機(jī)器碼可以看出區(qū)別 , x86 架構(gòu)中指令有 111 字節(jié) , ARM 架構(gòu)中 指令只有 444 字節(jié) ;
總結(jié)
以上是生活随笔為你收集整理的【Android 逆向】函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 逆向】函数拦截 ( G
- 下一篇: 【错误记录】Visual Studio