在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:xHook开源软件地址:https://gitee.com/caikelun/xHook开源软件介绍:xHookxHook 是一个针对 Android 平台 ELF (可执行文件和动态库) 的 PLT (Procedure Linkage Table) hook 库。 xHook 一直在稳定性和兼容性方面做着持续的优化。 特征
编译
./build_libs.sh./install_libs.sh Democd ./xhookwrapper/./gradlew assembleDebugadb install ./app/build/outputs/apk/debug/app-debug.apk API外部 API 头文件: 1. 注册 hook 信息int xhook_register(const char *pathname_regex_str, const char *symbol, void *new_func, void **old_func); 在当前进程的内存空间中,在每一个符合正则表达式
成功返回 0,失败返回 非0。
2. 忽略部分 hook 信息int xhook_ignore(const char *pathname_regex_str, const char *symbol); 根据 成功返回 0,失败返回 非0。
3. 执行 hookint xhook_refresh(int async); 根据前面注册的 hook 信息,执行真正的 hook 操作。 给 成功返回 0,失败返回 非0。 xhook 在内部维护了一个全局的缓存,用于保存最后一次从 4. 清除缓存void xhook_clear(); 清除 xhook 的缓存,重置所有的全局标示。 如果你确定你需要的所有 PLT 入口点都已经被替换了,你可以调用这个函数来释放和节省一些内存空间。 5. 启用/禁用 调试信息void xhook_enable_debug(int flag); 给 调试信息将被输出到 logcat,对应的 TAG 为: 6. 启用/禁用 SFP (段错误保护)void xhook_enable_sigsegv_protection(int flag); 给 xhook 并不是一个常规的业务层的动态库。在 xhook 中,我们不得不直接计算一些内存指针的值。在一些极端的情况和环境下,读或者写这些指针指向的内存会发生段错误。根据我们的测试,xhook 的行为将导致 APP 崩溃率增加 “一千万分之一” (0.0000001)。(具体崩溃率可能会增加多少,也和你想要 hook 的库和符号有关)。最终,我们不得不使用某些方法来防止这些无害的崩溃。我们叫它SFP (段错误保护),它是由这些调用和值组成的: 在 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);//追踪某些调用 (忽略 linker 和 linker64)xhook_register("^/system/.*$", "mmap", my_mmap, NULL);xhook_register("^/vendor/.*$", "munmap", my_munmap, NULL);xhook_ignore (".*/linker$", "mmap");xhook_ignore (".*/linker$", "munmap");xhook_ignore (".*/linker64$", "mmap");xhook_ignore (".*/linker64$", "munmap");//防御某些注入攻击xhook_register(".*com\\.hacker.*\\.so$", "malloc", my_malloc_always_return_NULL, NULL);xhook_register(".*/libhacker\\.so$", "connect", my_connect_with_recorder, NULL);//修复某些系统 bugxhook_register(".*some_vendor.*/libvictim\\.so$", "bad_func", my_nice_func, NULL);//忽略 libwebviewchromium.so 的所有 hook 信息xhook_ignore(".*/libwebviewchromium.so$", NULL);//现在执行 hook!xhook_refresh(1); 技术支持
贡献许可证xHook 使用 MIT 许可证。 xHook 的文档使用 Creative Commons 许可证。 |
请发表评论