【Android 逆向】函数拦截 ( CPU 高速缓存机制 | CPU 高速缓存机制 导致 函数拦截失败 )

举报
韩曙亮 发表于 2022/01/11 00:52:42 2022/01/11
【摘要】 文章目录 一、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% 成功 ;

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/121218698

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。