【Android 逆向】函数拦截 ( 使用 cache_flush 系统函数刷新 CPU 高速缓存 | 刷新 CPU 高速缓存弊端 | 函数拦截推荐时机 )

2023-03-29 20:39:47 浏览数 (1)

文章目录

  • 一、使用 cache_flush 系统函数刷新 CPU 高速缓存
  • 二、使用 cache_flush 系统函数刷新 CPU 高速缓存的弊端
  • 三、函数拦截推荐时机

一、使用 cache_flush 系统函数刷新 CPU 高速缓存


使用 " 在实际被调用的函数中添加跳转代码实现函数拦截 " 方案 进行函数拦截 , 由于存在 CPU 的高速缓存机制 , 无法保证 100% 成功 ;

这里就需要刷新 CPU 的高速缓存 , 调用 cache_flush 系统函数 , 就会将 CPU 中高速缓存中涉及到该进程的所有数据全部清除 , 然后重新从内存中加载缓存信息 , 此时就可以将 修改后 添加了跳转函数的 被拦截函数 , 重新加载到内存中去 , 此时 CPU 就可以执行 修改后的 被拦截函数 ; 拦截生效 ;

二、使用 cache_flush 系统函数刷新 CPU 高速缓存的弊端


使用 cache_flush 系统函数刷新 CPU 高速缓存的弊端 :

① 性能损耗 : CPU 重建缓存 , 导致执行效率降低 , 可能导致卡顿 , 闪退等情况 ;

② 影响其它进程 : 多核 CPU 如果刷新 高速缓存 , 可能导致其它进程的 高速缓存 也被刷新 , 影响到其它进程执行 ;

③ 影响多线程代码逻辑 : 多个线程竞争 CPU 执行权限 , 清空了 CPU 高速缓存中 ,

多线程执行的逻辑 参考 【Java 并发编程】线程简介 ( 并发类型 | 线程状态 | CPU 数据缓存 ) 博客 , Java 线程 运行时 , 每个 Java 线程都配套一个 工作内存 , 然后工作内存从 主内存 中获取数据 , 主内存被所有工作内存共享 ;

  • 工作内存 就是 线程的 本地内存 , 其中存储的是主内存中的 变量副本 , 使用主内存的变量前 , 先将变量拷贝工作内存中 ;
  • 当在线程中 修改了工作内存中的数据 , 需要同时 将变量的修改同步到主内存中 ;

这里的 工作线程 / 本地线程 相当于 CPU 中的 L1 / L2 缓存 , 主内存 相当于 CPU 中的 L3 缓存 ;

如果把高速缓存清了 , 多线程执行肯定会存在问题 ;

三、函数拦截推荐时机


鉴于 函数拦截 需要 清空 CPU 高速缓存 有上述弊端 , 因此这里建议在 程序初始化时进行函数拦截 , 不要在程序运行过程中进行 函数拦截 ;

如果必须在程序启动后进行拦截 , 只能冒险进行 清空 CPU 高速缓存 , 但是建议一次性把所有的函数拦截都做了 , 不要频繁进行 函数拦截 清空 CPU 高速缓存 操作 , 次数越多 , 出问题的几率就越大 ;

0 人点赞