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