【Android 逆向】函数拦截 ( CPU 高速缓存机制 | CPU 高速缓存机制 导致 函数拦截失败 )
文章目錄
- 一、CPU 高速緩存機(jī)制
- 二、CPU 高速緩存機(jī)制 導(dǎo)致 函數(shù)攔截失敗
一、CPU 高速緩存機(jī)制
CPU 架構(gòu)模型中 , 指令 在開始時 , 存放在內(nèi)存中 , 如 : /proc/pid/maps 中的每個 .so 動態(tài)庫都在內(nèi)存中有一個地址 , 動態(tài)庫中存放的就是指令 ;
CPU 與 內(nèi)存之間的訪問速率比較低 , 這里的低是與 CPU 訪問寄存器比較的 , CPU 訪問寄存器的速度 > CPU 訪問內(nèi)存的速度 > CPU 訪問磁盤的速度 ;
為了提升 CPU 訪問 內(nèi)存 的速度 , 在 CPU 內(nèi)部準(zhǔn)備了一塊 高速緩存 , 內(nèi)存中的指令不是直接放入 CPU , 而是先放到高速緩存中 , 然后從高速緩存讀取到寄存器中進(jìn)行指令操作 ;
如果 CPU 要訪問的指令正好在高速緩存中 , 那么就可以高速執(zhí)行 代碼指令 , 執(zhí)行的同時 , 又將后續(xù)指令源源不斷的加載到高速緩存中 , 這樣就可以保證 CPU 高效執(zhí)行指令 ;
二、CPU 高速緩存機(jī)制 導(dǎo)致 函數(shù)攔截失敗
在上一篇博客 【Android 逆向】函數(shù)攔截原理 ( 通過修改 GOT 全局偏移表攔截函數(shù) | 通過在實(shí)際被調(diào)用的函數(shù)中添加跳轉(zhuǎn)代碼實(shí)現(xiàn)函數(shù)攔截 ) 中的可靠函數(shù)攔截方案中 , 推薦使用 " 在實(shí)際被調(diào)用的函數(shù)中添加跳轉(zhuǎn)代碼實(shí)現(xiàn)函數(shù)攔截 " 方案實(shí)現(xiàn)函數(shù)攔截 ;
上述方案需要在 實(shí)際被調(diào)用的函數(shù) 中 , 寫入一條跳轉(zhuǎn)指令 , 該寫入指令的函數(shù)是存放在內(nèi)存中的 , 也只能是在內(nèi)存中寫入 , CPU 的高速緩存完全由 CPU 內(nèi)部硬件調(diào)用 , 外部代碼無法訪問高速緩存 ;
這里就涉及到一個問題 , 在 被攔截的函數(shù)中插入跳轉(zhuǎn)代碼 , 如果該函數(shù)已經(jīng)被加載到 CPU 的高速緩存中 , 那么 修改內(nèi)存 , 也無法讓 CPU 執(zhí)行該修改后的代碼指令 ;
CPU 中的 高速緩存是 按照命令率進(jìn)行排序 , 使用越頻繁的函數(shù) , 其優(yōu)先級越高 , 越不容易被移除 ;
如果要攔截的函數(shù) , 調(diào)用頻率很高 , 可能改函數(shù)會一直駐留在 CPU 高速緩存中 , 就 一直無法攔截該函數(shù) ;
這就導(dǎo)致了 函數(shù)攔截 , 無法 100% 成功 ;
總結(jié)
以上是生活随笔為你收集整理的【Android 逆向】函数拦截 ( CPU 高速缓存机制 | CPU 高速缓存机制 导致 函数拦截失败 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 命令行工具】Andro
- 下一篇: 【Android 逆向】函数拦截 ( G