资料介绍
软件简介
爱奇艺开源的一个针对 Android 平台 ELF (可执行文件和动态库) 的 PLT (Procedure Linkage Table) hook 库。
xhook 一直在稳定性和兼容性方面做着持续的优化。
??????????????oooo????????????????????????????oooo???????? ??????????????`888????????????????????????????`888???????? ??oooo????ooo??888?.oo.????.ooooo.???.ooooo.???888??oooo?? ???`88b..8P'???888P"Y88b??d88'?`88b?d88'?`88b??888?.8P'??? ?????Y888'?????888???888??888???888?888???888??888888.???? ???.o8"'88b????888???888??888???888?888???888??888?`88b.?? ??o88'???888o?o888o?o888o?`Y8bod8P'?`Y8bod8P'?o888o?o888o
特征
-
支持 Android 4.0 (含) 以上版本 (API level >= 14)。
-
支持 armeabi, armeabi-v7a 和 arm64-v8a。
-
支持?ELF HASH?和?GNU HASH?索引的符号。
-
支持?SLEB128?编码的重定位信息。
-
不需要 ROOT 权限。
-
不依赖于任何的第三方动态库。
-
纯 C 的代码。比较小的库体积。
编译
你需要 google NDK 来编译 xhook。
最新版本的 xhook 在开发和调试中使用的 NDK 版本是?r16b。
-
编译动态库 (libxhook.so 和其他的用于测试的动态库)
./build_libs.sh
-
把动态库安装到 Demo 工程的 libs 目录中
./install_libs.sh
-
清除动态库
./clean_libs.sh
Demo
cd?./xhookwrapper/ ./gradlew?assembleDebug adb?install?./app/build/outputs/apk/debug/app-debug.apk
API
外部 API 头文件:?libxhook/jni/xhook.h
1. 注册 hook 信息
int?xhook_register(const?char??*pathname_regex_str,?? ???????????????????const?char??*symbol,?? ???????????????????void????????*new_func,?? ???????????????????void???????**old_func);
在当前进程的内存空间中,在每一个符合正则表达式?pathname_regex_str
?的已加载ELF中,每一个调用?symbol
?的 PLT 入口点的地址值都将给替换成?new_func
。之前的 PLT 入口点的地址值将被保存在?old_func
?中。
new_func
?必须具有和原函数同样的函数声明。
成功返回 0,失败返回 非0。
pathname_regex_str
?只支持?POSIX BRE?定义的正则表达式语法。
2. 执行 hook
int?xhook_refresh(int?async);
根据前面注册的 hook 信息,执行真正的 hook 操作。
给?async
?参数传?1
?表示执行异步的 hook 操作,传?0
?表示执行同步的 hook 操作。
成功返回 0,失败返回 非0。
xhook 在内部维护了一个全局的缓存,用于保存最后一次从?/proc/self/maps
?读取到的 ELF 加载信息。每次一调用?xhook_refresh
?函数,这个缓存都将被更新。xhook 使用这个缓存来判断哪些 ELF 是这次新被加载到内存中的。我们每次只需要针对这些新加载的 ELF 做 hook 就可以了。
3. 清除缓存
void?xhook_clear();
清除 xhook 的缓存,重置所有的全局标示。
如果你确定你需要的所有 PLT 入口点都已经被替换了,你可以调用这个函数来释放和节省一些内存空间。
4. 启用/禁用 调试信息
void?xhook_enable_debug(int?flag);
给?flag
?参数传?1
?表示启用调试信息,传?0
?表示禁用调试信息。 (默认为:禁用)
调试信息将被输出到 logcat,对应的 TAG 为:xhook
。
5. 启用/禁用 SFP (段错误保护)
void?xhook_enable_sigsegv_protection(int?flag);
给?flag
?参数传?1
?表示启用 SFP,传?0
?表示禁用 SFP。 (默认为:启用)
xhook 并不是一个常规的业务层的动态库。在 xhook 中,我们不得不直接计算一些内存指针的值。在一些极端的情况和环境下,读或者写这些指针指向的内存会发生段错误。根据我们的测试,xhook 的行为将导致 APP 崩溃率增加 “一千万分之一” (0.0000001)。(具体崩溃率可能会增加多少,也和你想要 hook 的库和符号有关)。最终,我们不得不使用某些方法来防止这些无害的崩溃。我们叫它SFP (段错误保护),它是由这些调用和值组成的:sigaction()
,?SIGSEGV
,?siglongjmp()
?和?sigsetjmp()
。
在 release 版本的 APP 中,你应该始终启用 SFP,这能防止你的 APP 因为 xhook 而崩溃。在 debug 版本的 APP 中,你应该始终禁用 SFP,这样你就不会丢失那些一般性的编码失误导致的段错误,这些段错误是应该被修复的。
应用举例
//监测内存泄露 xhook_register(".*\\.so$",?"malloc",??my_malloc,??NULL); xhook_register(".*\\.so$",?"calloc",??my_calloc,??NULL); xhook_register(".*\\.so$",?"realloc",?my_realloc,?NULL); xhook_register(".*\\.so$",?"free",????my_free,????NULL); //监控?sockets?生命周期 xhook_register(".*\\.so$",?"getaddrinfo",?my_getaddrinfo,?NULL); xhook_register(".*\\.so$",?"socket",??????my_socket,??????NULL); xhook_register(".*\\.so$",?"setsockopt"???my_setsockopt,??NULL); xhook_register(".*\\.so$",?"bind",????????my_bind,????????NULL); xhook_register(".*\\.so$",?"listen",??????my_listen,??????NULL); xhook_register(".*\\.so$",?"connect",?????my_connect,?????NULL); xhook_register(".*\\.so$",?"shutdown",????my_shutdown,????NULL); xhook_register(".*\\.so$",?"close",???????my_close,???????NULL); //过滤出和保存部分安卓?log?到本地文件 xhook_register(".*\\.so$",?"__android_log_write",??my_log_write,??NULL); xhook_register(".*\\.so$",?"__android_log_print",??my_log_print,??NULL); xhook_register(".*\\.so$",?"__android_log_vprint",?my_log_vprint,?NULL); xhook_register(".*\\.so$",?"__android_log_assert",?my_log_assert,?NULL); //追踪某些调用 xhook_register("^/system/.*$",?"mmap",???my_mmap,???NULL); xhook_register("^/vendor/.*$",?"munmap",?my_munmap,?NULL); //防御某些注入攻击 xhook_register(".*com\\.hacker.*\\.so$",?"malloc",??my_malloc_always_return_NULL,?NULL); xhook_register(".*/libhacker\\.so$",?????"connect",?my_connect_with_recorder,?????NULL); //修复某些系统?bug xhook_register(".*some_vendor.*/libvictim\\.so$",?"bad_func",?my_nice_func,?NULL); //现在执行?hook! xhook_refresh(1);
许可证
Copyright (c) 2018-present, 爱奇艺, Inc. All rights reserved.
xhook 中大多数的源码使用 MIT 许可证,另外的一些源码使用 BSD 样式的许可证。
详细信息请查看 LICENSE 文件。
- ByteHook Android应用PLT hook框架
- STM32f10x官方固件库资料 192次下载
- STM32f10x官方固件库资料 76次下载
- 使用内核三步实现InlineHook的详细分析 5次下载
- 内核级HOOK的几种实现方法与应用说明 5次下载
- 如何使用Labwindow CVI软件平台进行Mysql数据库开发 22次下载
- Android平台移动电子商务系统设计与实现 13次下载
- Android开发的各大网络请求库实际案例 4次下载
- ELF 11次下载
- 基于Android平台的藏文输入法设计与实现 8次下载
- HOOK和数据库访问 0次下载
- Android系统下OpenCV的人脸检测模块的设计 118次下载
- 基于NDIS-HOOK的个人防水墙设计 0次下载
- 利用Hook技术实现进程控制
- 基于VxWorks的端口控制实现
- RTOS中钩子函数的用途及用法 323次阅读
- ELF 1技术贴|如何移植OpenCV 422次阅读
- frida-inject工具使用及说明 内置frida-inject工具到手机系统 6552次阅读
- OpenCV图像处理库的跨平台:Emgu CV 4084次阅读
- 多平台的关系数据库管理和开发工具 937次阅读
- 安全开发之应用层Hook技术 1415次阅读
- 聊聊新版RT-Thread内核中的钩子 1248次阅读
- 深入了解 ELF每个结构的细节 3093次阅读
- 什么是ELF文件?ELF文件结构概览 1.8w次阅读
- Hook OpenMemory的导出方法名 1097次阅读
- HOOK函数概述、用途和用法 1.4w次阅读
- Linux系统如何解析ELF文件 3414次阅读
- 利用Xposed去hook住Android系统框架层函数去脱壳 4200次阅读
- 嵌入式bin文件和elf文件重点 9252次阅读
- 基于Android平台的双网双待的设计方法 2881次阅读
下载排行
本周
- 1山景DSP芯片AP8248A2数据手册
- 1.06 MB | 532次下载 | 免费
- 2RK3399完整板原理图(支持平板,盒子VR)
- 3.28 MB | 339次下载 | 免费
- 3TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 4DFM软件使用教程
- 0.84 MB | 295次下载 | 免费
- 5元宇宙深度解析—未来的未来-风口还是泡沫
- 6.40 MB | 227次下载 | 免费
- 6迪文DGUS开发指南
- 31.67 MB | 194次下载 | 免费
- 7元宇宙底层硬件系列报告
- 13.42 MB | 182次下载 | 免费
- 8FP5207XR-G1中文应用手册
- 1.09 MB | 178次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33566次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21549次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6656次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537798次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420027次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191187次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183279次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论