資料介紹
軟件簡介
愛奇藝開源的一個針對 Android 平臺 ELF (可執(zhí)行文件和動態(tài)庫) 的 PLT (Procedure Linkage Table) hook 庫。
xhook 一直在穩(wěn)定性和兼容性方面做著持續(xù)的優(yōu)化。
??????????????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 權限。
-
不依賴于任何的第三方動態(tài)庫。
-
純 C 的代碼。比較小的庫體積。
編譯
你需要 google NDK 來編譯 xhook。
最新版本的 xhook 在開發(fā)和調試中使用的 NDK 版本是?r16b。
-
編譯動態(tài)庫 (libxhook.so 和其他的用于測試的動態(tài)庫)
./build_libs.sh
-
把動態(tài)庫安裝到 Demo 工程的 libs 目錄中
./install_libs.sh
-
清除動態(tài)庫
./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
?必須具有和原函數(shù)同樣的函數(shù)聲明。
成功返回 0,失敗返回 非0。
pathname_regex_str
?只支持?POSIX BRE?定義的正則表達式語法。
2. 執(zhí)行 hook
int?xhook_refresh(int?async);
根據(jù)前面注冊的 hook 信息,執(zhí)行真正的 hook 操作。
給?async
?參數(shù)傳?1
?表示執(zhí)行異步的 hook 操作,傳?0
?表示執(zhí)行同步的 hook 操作。
成功返回 0,失敗返回 非0。
xhook 在內部維護了一個全局的緩存,用于保存最后一次從?/proc/self/maps
?讀取到的 ELF 加載信息。每次一調用?xhook_refresh
?函數(shù),這個緩存都將被更新。xhook 使用這個緩存來判斷哪些 ELF 是這次新被加載到內存中的。我們每次只需要針對這些新加載的 ELF 做 hook 就可以了。
3. 清除緩存
void?xhook_clear();
清除 xhook 的緩存,重置所有的全局標示。
如果你確定你需要的所有 PLT 入口點都已經(jīng)被替換了,你可以調用這個函數(shù)來釋放和節(jié)省一些內存空間。
4. 啟用/禁用 調試信息
void?xhook_enable_debug(int?flag);
給?flag
?參數(shù)傳?1
?表示啟用調試信息,傳?0
?表示禁用調試信息。 (默認為:禁用)
調試信息將被輸出到 logcat,對應的 TAG 為:xhook
。
5. 啟用/禁用 SFP (段錯誤保護)
void?xhook_enable_sigsegv_protection(int?flag);
給?flag
?參數(shù)傳?1
?表示啟用 SFP,傳?0
?表示禁用 SFP。 (默認為:啟用)
xhook 并不是一個常規(guī)的業(yè)務層的動態(tài)庫。在 xhook 中,我們不得不直接計算一些內存指針的值。在一些極端的情況和環(huán)境下,讀或者寫這些指針指向的內存會發(fā)生段錯誤。根據(jù)我們的測試,xhook 的行為將導致 APP 崩潰率增加 “一千萬分之一” (0.0000001)。(具體崩潰率可能會增加多少,也和你想要 hook 的庫和符號有關)。最終,我們不得不使用某些方法來防止這些無害的崩潰。我們叫它SFP (段錯誤保護),它是由這些調用和值組成的:sigaction()
,?SIGSEGV
,?siglongjmp()
?和?sigsetjmp()
。
在 release 版本的 APP 中,你應該始終啟用 SFP,這能防止你的 APP 因為 xhook 而崩潰。在 debug 版本的 APP 中,你應該始終禁用 SFP,這樣你就不會丟失那些一般性的編碼失誤導致的段錯誤,這些段錯誤是應該被修復的。
應用舉例
//監(jiān)測內存泄露 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); //監(jiān)控?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); //修復某些系統(tǒng)?bug xhook_register(".*some_vendor.*/libvictim\\.so$",?"bad_func",?my_nice_func,?NULL); //現(xiàn)在執(zhí)行?hook! xhook_refresh(1);
許可證
Copyright (c) 2018-present, 愛奇藝, Inc. All rights reserved.
xhook 中大多數(shù)的源碼使用 MIT 許可證,另外的一些源碼使用 BSD 樣式的許可證。
詳細信息請查看 LICENSE 文件。
- ByteHook Android應用PLT hook框架
- STM32f10x官方固件庫資料 192次下載
- STM32f10x官方固件庫資料 76次下載
- 使用內核三步實現(xiàn)InlineHook的詳細分析 5次下載
- 內核級HOOK的幾種實現(xiàn)方法與應用說明 5次下載
- 如何使用Labwindow CVI軟件平臺進行Mysql數(shù)據(jù)庫開發(fā) 22次下載
- Android平臺移動電子商務系統(tǒng)設計與實現(xiàn) 13次下載
- Android開發(fā)的各大網(wǎng)絡請求庫實際案例 4次下載
- ELF 11次下載
- 基于Android平臺的藏文輸入法設計與實現(xiàn) 8次下載
- HOOK和數(shù)據(jù)庫訪問 0次下載
- Android系統(tǒng)下OpenCV的人臉檢測模塊的設計 118次下載
- 基于NDIS-HOOK的個人防水墻設計 0次下載
- 利用Hook技術實現(xiàn)進程控制
- 基于VxWorks的端口控制實現(xiàn)
- RTOS中鉤子函數(shù)的用途及用法 323次閱讀
- ELF 1技術貼|如何移植OpenCV 422次閱讀
- frida-inject工具使用及說明 內置frida-inject工具到手機系統(tǒng) 6552次閱讀
- OpenCV圖像處理庫的跨平臺:Emgu CV 4084次閱讀
- 多平臺的關系數(shù)據(jù)庫管理和開發(fā)工具 937次閱讀
- 安全開發(fā)之應用層Hook技術 1415次閱讀
- 聊聊新版RT-Thread內核中的鉤子 1248次閱讀
- 深入了解 ELF每個結構的細節(jié) 3093次閱讀
- 什么是ELF文件?ELF文件結構概覽 1.8w次閱讀
- Hook OpenMemory的導出方法名 1097次閱讀
- HOOK函數(shù)概述、用途和用法 1.4w次閱讀
- Linux系統(tǒng)如何解析ELF文件 3414次閱讀
- 利用Xposed去hook住Android系統(tǒng)框架層函數(shù)去脫殼 4200次閱讀
- 嵌入式bin文件和elf文件重點 9252次閱讀
- 基于Android平臺的雙網(wǎng)雙待的設計方法 2881次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 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開發(fā)指南
- 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數(shù)字電路基礎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次下載 | 免費
評論