【Android 逆向】函数拦截实例 ( 函数拦截流程 | ① 定位动态库及函数位置 )

举报
韩曙亮 发表于 2022/01/11 02:20:31 2022/01/11
【摘要】 文章目录 一、函数拦截流程二、定位动态库及函数位置 一、函数拦截流程 函数拦截流程 : 定位动态库及函数位置 : 获取该动态库在内存中的位置 , 以便于 查找函数...





一、函数拦截流程



函数拦截流程 :

  • 定位动态库及函数位置 : 获取该动态库在内存中的位置 , 以便于 查找函数位置 ;
  • 插桩 : 在函数的入口处插桩 , 这个 " 桩 " 指的是 " 跳转指令 " ;
  • 刷新 CPU 高速缓存 : 执行 cache_flush 系统调用函数 刷新 CPU 的高速缓存 ; 该步骤 只在 ARM 架构的 CPU 中执行 , x86 架构的 CPU 不需要刷新缓存 ;
  • 处理拦截函数 : 执行函数时 , 执行到插入的 " 桩 " , 即跳转指令 , 跳转到自定义的函数中 , 执行完毕后 , 又跳转回原函数中继续执行原函数 ;
  • 返回特定结果 : 将想要返回的结果返回 ;




二、定位动态库及函数位置



拦截 2 2 2 个函数 ,

  • gettimeofday : 获取时间 , 单位 秒 ; struct timeval*tv 参数保存获取时间结果的结构体 ,struct timezone *tz 参数用于保存时区结果 ;
#include <sys/time.h>
int gettimeofday(struct timeval*tv, struct timezone *tz);

  
 
  • 1
  • 2
  • clock_gettime : 获取时间 , 单位 微秒 ; 计算 精度 和 纳秒 ;
#include <time.h>
int clock_gettime(clockid_t clk_id,struct timespec *tp);

  
 
  • 1
  • 2

Hook 环境描述 : 使用 tool 工具 向 被调试进程 注入 libbridge.so 动态库 , 然后执行该动态库的 load 方法 , 将libnative.so 动态库注入到远程进程中 , Hook 操作就是在 libnative.so 动态库中执行的 ;

注意 : libnative.so 动态库 是运行在远程进程中 ;

执行 C/C++ 程序 Hook 时 , 先定位函数在内存中的地址 , 由于当前执行的 libnative.so 动态库 代码已经注入到了远程进程中 , 因此 libnative.so 动态库执行在远程被调试的进程 , 可以直接通过 gettimeofdayclock_gettime 函数指针 , 拿到该函数的地址 ;

函数名 就是 函数指针 , 也就是 函数在内存中的地址 ;

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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