【Android 逆向】ART 函数抽取加壳 ④ ( 对 libc.so#execve 函数进行内联 HOOK 操作 )
文章目录
在
- 【Android 逆向】ART 函数抽取加壳 ① ( ART 下的函数抽取恢复时机 | 禁用 dex2oat 机制源码分析 )
- 【Android 逆向】ART 函数抽取加壳 ② ( 禁用 dex2oat 简介 | TurboDex 中禁用 dex2oat 参考示例 )
两篇博客中 , 简单介绍了 禁用 dex2oat 机制 的原理 , 下面开始 实现 dex2oat 禁用功能 ;
在 【Android 逆向】ART 函数抽取加壳 ③ ( 禁用 dex2oat 操作 HOOK 点介绍 | 集成 InLineHook ) 博客中 , 介绍了 HOOK 点 , 以及 集成 HOOK C 代码的库 InLineHook ;
一、对 libc.so#execve 函数进行内联 HOOK 操作
要 HOOK libc 函数库 中的 exec_utils.cc#execve 函数 , 首先要查找到 libc 库的基地址 , 然后查找 exec_utils.cc#execve 函数的地址 ;
execve 函数 定义在 bionic/libc/include/unistd.h 中 , 在 exec_utils.cc 中进行调用 ;
使用 在 【Android 逆向】ART 函数抽取加壳 ③ ( 禁用 dex2oat 操作 HOOK 点介绍 | 集成 InLineHook ) 博客中继承的 InLineHook 函数库 实现上述 native 中的 HOOK 操作 ;
首先 , 调用 hook\dlfcn\dlfcn_compat.h 中的 dlopen_compat 函数 , 传入 libc 库的文件名即 " libc.so " 作为第一个参数 , 传入 RTLD_NOW 作为第二个参数作为标志位 , 该函数的原型如下 :
void *dlopen_compat(const char *filename, int flags);
该操作也可以使用 dlopen 函数 , 这里对该函数进行封装 , 是因为在 Android 7.0 之后 , 这些函数都受 命名空间限制 , 对于某些函数库可能执行失败 ;
然后 , 调用 hook\dlfcn\dlfcn_compat.h 中的 dlsym_compat 函数 查找 exec_utils.cc#execve 函数 在 " libc.so " 函数库 中的地址 , 第一个参数是 " libc.so " 函数库的基地址 , 第二个参数是函数名称即 " execve " , 该函数的原型如下 :
void *dlsym_compat(void *handle, const char *symbol);
该操作也可以使用 dlsym 函数 , 这里对该函数进行封装 , 是因为在 Android 7.0 之后 , 这些函数都受 命名空间 限制 , 对于某些函数库可能执行失败 ;
再后 , 注册内联 HOOK 操作 , 调用 " hook\include\inlineHook.h " 中定义的 " registerInlineHook " 函数 , 传入的参数含义如下 :
- uint32_t target_addr 参数 : execve 函数在 " libc.so " 函数库中的地址 ;
- uint32_t new_addr 参数 : HOOK 后要替换的函数地址 , 使用自定义的函数替代原函数执行 ;
- uint32_t **proto_addr 参数 : 保存原函数地址 , 用于在新函数中调用原函数 , 实现代理模式 ;
enum ele7en_status registerInlineHook(uint32_t target_addr, uint32_t new_addr, uint32_t **proto_addr);
最后 , 执行内联 HOOK 操作 , 注册完毕后 , 调用 " hook\include\inlineHook.h " 中定义的 " inlineUnHook " 函数 , 传入被 HOOK 的函数地址 , 也就是 exec_utils.cc#execve 函数在 " libc.so " 函数库中的地址 ;
enum ele7en_status inlineUnHook(uint32_t target_addr);
执行成功 , 该函数返回 0 , 失败返回其它值 ;
本部分代码示例如下 :
// 导入 inLineHook 头文件
extern "C" {
#include "hook/dlfcn/dlfcn_compat.h"
#include "hook/include/inlineHook.h"
}
// 注册执行 Hook 操作
void hookLibc() {
// 查找 libc.so 函数库的基地址
void *libc_addr = dlopen_compat("libc.so", RTLD_NOW);
// 查找 execve 在 libc.so 函数库的偏移地址
void *execve_addr = dlsym_compat(libc_addr, "execve");
// 地址不为空才能向后执行
if (execve_addr != NULL) {
// 注册内联 Hook 函数 , 传入参数
// ① execve 在 libc.so 函数库的偏移地址 ,
// ② 自己实现的 myexecve 函数
// ③ Android 自带的原始的 execve 函数地址
// 返回 0 即注册成功
if (ELE7EN_OK == registerInlineHook((uint32_t) execve_addr, (uint32_t) myexecve,
(uint32_t **) &android_execve)) {
// 正式执行 Hook 操作
if (ELE7EN_OK == inlineHook((uint32_t) execve_addr)) {
LOGD("Hook Success");
} else {
LOGD("Hook Fail");
}
}
}
}
相关文章
- android系统开机画面_Android开机画面
- strictmode android,(十三)Android 性能优化 StrictMode
- Android 屏幕适配
- android-短信验证功能,Android实现获取短信验证码的功能以及自定义GUI短信验证详解…
- iphone4装android,iPhone4可安装Android实现双系统启动.pdf
- android toast显示时间,Android Toast自定义显示时间「建议收藏」
- android登录注册_android studio注册页面
- android触摸屏事件,Android Touch事件分析
- android 复制控件,Android长按复制文本功能[通俗易懂]
- Android Services Library_android freeware
- 怎样可以把手机app的文字复制出来_Android长按弹出选项框
- Android 手写延迟优化(一):利用前缓冲快速上屏
- 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取 Activity 中的所有方法 | 获取方法上的注解 | 获取注解上的注解 | 通过注解属性获取事件信息 )
- 【Android 逆向】Android 进程注入工具开发 ( 远程进程注入动态库文件操作 | 注入动态库 加载 业务动态库 | 业务动态库启动 | pthread_create 线程开发 )
- 【错误记录】编译 Android 版本的 ijkplayer 报错 ( You must define ANDROID_NDK before starting. | 下载指定版本 NDK )
- 【Android 逆向】ART 函数抽取加壳 ⑥ ( 函数抽取后续操作 “ 还原被抽取的函数 “ | LoadClass 类加载 | LoadClassMembers 类成员加载 )
- Android开发中遇到的问题(三)——eclipse创建android项目无法正常预览布局文件详解手机开发
- 关于Android的UI测试详解手机开发
- 独家报道:Realme Flash是首款采用磁性无线充电的Android手机
- Replicant:真正自由的 Android 版本
- Android应用程序窗口(Activity)窗口对象(Window)创建指南
- android开发文件读写应用案例分析
- Android系统自带样式(android:theme)
- Android使用Pull方法解析XML文件的方法