Android 逆向函数拦截实例 ( 函数拦截流程 | 定位动态库及函数位置 )
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 逆向函数拦截实例 ( 函数拦截流程 | 定位动态库及函数位置 )相关的知识,希望对你有一定的参考价值。
文章目录
一、函数拦截流程
函数拦截流程 :
- 定位动态库及函数位置 : 获取该动态库在内存中的位置 , 以便于 查找函数位置 ;
- 插桩 : 在函数的入口处插桩 , 这个 " 桩 " 指的是 " 跳转指令 " ;
- 刷新 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);
clock_gettime
: 获取时间 , 单位 微秒 ; 计算 精度 和 纳秒 ;
#include <time.h>
int clock_gettime(clockid_t clk_id,struct timespec *tp);
Hook 环境描述 : 使用 tool
工具 向 被调试进程 注入 libbridge.so
动态库 , 然后执行该动态库的 load
方法 , 将libnative.so
动态库注入到远程进程中 , Hook 操作就是在 libnative.so
动态库中执行的 ;
注意 : libnative.so
动态库 是运行在远程进程中 ;
执行 C/C++ 程序 Hook 时 , 先定位函数在内存中的地址 , 由于当前执行的 libnative.so
动态库 代码已经注入到了远程进程中 , 因此 libnative.so
动态库执行在远程被调试的进程 , 可以直接通过 gettimeofday
和 clock_gettime
函数指针 , 拿到该函数的地址 ;
函数名 就是 函数指针 , 也就是 函数在内存中的地址 ;
以上是关于Android 逆向函数拦截实例 ( 函数拦截流程 | 定位动态库及函数位置 )的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向函数拦截实例 ( ② 插桩操作 | 保存实际函数入口 6 字节数据 | 在插桩的函数入口写入跳转指令 | 构造拼接桩函数 )
Android 逆向函数拦截 ( GOT 表数据结构分析 | 函数根据 GOT 表进行跳转的流程 )
Android 逆向函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )
Android 逆向函数拦截原理 ( 通过修改 GOT 全局偏移表拦截函数 | 通过在实际被调用的函数中添加跳转代码实现函数拦截 )