电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>电子资料>x-hook针对Android平台ELF的PLT hook库

x-hook针对Android平台ELF的PLT hook库

2022-06-23 | zip | 0.55 MB | 次下载 | 免费

资料介绍

授权协议 MIT
开发语言 C/C++
软件类型 开源软件
所属分类 手机/移动开发

软件简介

爱奇艺开源的一个针对 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 文件。

?
?

下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1山景DSP芯片AP8248A2数据手册
  2. 1.06 MB  |  532次下载  |  免费
  3. 2RK3399完整板原理图(支持平板,盒子VR)
  4. 3.28 MB  |  339次下载  |  免费
  5. 3TC358743XBG评估板参考手册
  6. 1.36 MB  |  330次下载  |  免费
  7. 4DFM软件使用教程
  8. 0.84 MB  |  295次下载  |  免费
  9. 5元宇宙深度解析—未来的未来-风口还是泡沫
  10. 6.40 MB  |  227次下载  |  免费
  11. 6迪文DGUS开发指南
  12. 31.67 MB  |  194次下载  |  免费
  13. 7元宇宙底层硬件系列报告
  14. 13.42 MB  |  182次下载  |  免费
  15. 8FP5207XR-G1中文应用手册
  16. 1.09 MB  |  178次下载  |  免费

本月

  1. 1OrCAD10.5下载OrCAD10.5中文版软件
  2. 0.00 MB  |  234315次下载  |  免费
  3. 2555集成电路应用800例(新编版)
  4. 0.00 MB  |  33566次下载  |  免费
  5. 3接口电路图大全
  6. 未知  |  30323次下载  |  免费
  7. 4开关电源设计实例指南
  8. 未知  |  21549次下载  |  免费
  9. 5电气工程师手册免费下载(新编第二版pdf电子书)
  10. 0.00 MB  |  15349次下载  |  免费
  11. 6数字电路基础pdf(下载)
  12. 未知  |  13750次下载  |  免费
  13. 7电子制作实例集锦 下载
  14. 未知  |  8113次下载  |  免费
  15. 8《LED驱动电路设计》 温德尔著
  16. 0.00 MB  |  6656次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935054次下载  |  免费
  3. 2protel99se软件下载(可英文版转中文版)
  4. 78.1 MB  |  537798次下载  |  免费
  5. 3MATLAB 7.1 下载 (含软件介绍)
  6. 未知  |  420027次下载  |  免费
  7. 4OrCAD10.5下载OrCAD10.5中文版软件
  8. 0.00 MB  |  234315次下载  |  免费
  9. 5Altium DXP2002下载入口
  10. 未知  |  233046次下载  |  免费
  11. 6电路仿真软件multisim 10.0免费下载
  12. 340992  |  191187次下载  |  免费
  13. 7十天学会AVR单片机与C语言视频教程 下载
  14. 158M  |  183279次下载  |  免费
  15. 8proe5.0野火版下载(中文版免费下载)
  16. 未知  |  138040次下载  |  免费