最近有位读者私信,说能不能推荐一些大厂使用的安卓类开源项目,想了下,读者中也有不少搞安卓开发的,所以今天给大家推荐一个大厂出品的安卓开源项目。
这个项目是「ByteHook」,目前在 GitHub 收获了 670 Star,是一个针对 Android App 的 PLT hook 框架。
这个框架也是最近才开源,字节跳动团队大多数 Android App 开发在线上使用了这个项目作为方案,对于创业公司或者安卓开发者是一个学习参考,它提供了一个 Android 应用程序使用 PLT 钩子的整体方案,而可选择替换地址。
我们平常玩的抖音、今日头条、西瓜视频 APP ,字节跳动在在线上环境中使用了ByteHook作为PLT钩子方案。
这个框架主要有以下特征:
支持 Android 4.1 - 12 (API 级别 16 - 31)。
支持 armeabi-v7a、arm64-v8a、x86 和 x86_64。
对同一个函数的多个hook和unhook相互不冲突。
可以勾上进程中的个别、部分或全部的动态库。
自动钩子新加载的动态库。
自动避免代理函数之间的循环调用和循环调用。
代理功能中支持回溯调用栈。
使用 MIT 许可授权。
如何上手使用?
- 在build.gradle中增加依赖
所有项目{
存储库{
MavenCentral()
}
}
安卓{
构建功能{
预制真
}
}
依赖{
实现’ com.bytedance:bytehook:1.0.2 ’
}
2.在 CMakeLists.txt 中增加依赖
find_package(bytehook REQUIRED CONFIG)
add_library(mylib SHARED mylib.c)
target_link_libraries(mylib bytehook::bytehook)
-
指定一个或多个你需要的 ABI
android {
defaultConfig {
ndk {
abiFilters ‘armeabi-v7a’, ‘arm64-v8a’, ‘x86’, ‘x86_64’
}
}
} -
增加打包选项
-
初始化
import com.bytedance.android.bytehook.ByteHook;
public class MySdk {
public static synchronized void init() {
ByteHook.init();
}
}
- 钩和解钩
bytehook_stub_t bytehook_hook_single(
const char *caller_path_name,
const char *callee_path_name,
const char *sym_name,
void *new_func,
bytehook_hooked_t hooked,
void *hooked_arg);
bytehook_stub_t bytehook_hook_partial(
bytehook_caller_allow_filter_t caller_allow_filter,
void *caller_allow_filter_arg,
const char *callee_path_name,
const char *sym_name,
void *new_func,
bytehook_hooked_t hooked,
void *hooked_arg);
bytehook_stub_t bytehook_hook_all(
const char *callee_path_name,
const char *sym_name,
void *new_func,
bytehook_hooked_t hooked,
void *hooked_arg);
int bytehook_unhook(bytehook_stub_t stub);
那么这个框架的原理是什么样的?
ELF 文件的起始处,有一个固定格式的定长的文件头。ELF 文件头中包含了 SHT和 PHT在当前 ELF 文件中的起始位置和长度,SHT 和 PHT 分别描述了 ELF 的“连接视图”和“执行视图”的基本信息。
linker(动态链接器)
00
relocation 完成之后的函数调用关系如下
ByteHook 中另外几个关键模块
最后,为了鼓励鼓励,不点赞来一下吗,祝各位程序员开发无 Bug,发大财,行大运。