文章目录
一、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% 成功 ;