Android中的Serializable、Parcelable">Android中的Serializable、Parcelable
724
2025-03-31
文章目錄
一、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
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。