牛逼,字节跳动又一开源大作!程序员的福音!

牛逼,字节跳动又一开源大作!程序员的福音!_第1张图片

最近有位读者私信,说能不能推荐一些大厂使用的安卓类开源项目,想了下,读者中也有不少搞安卓开发的,所以今天给大家推荐一个大厂出品的安卓开源项目。

这个项目是「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 许可授权。
如何上手使用?

  1. 在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)

  1. 指定一个或多个你需要的 ABI
    android {
    defaultConfig {
    ndk {
    abiFilters ‘armeabi-v7a’, ‘arm64-v8a’, ‘x86’, ‘x86_64’
    }
    }
    }

  2. 增加打包选项

  3. 初始化
    import com.bytedance.android.bytehook.ByteHook;

public class MySdk {
public static synchronized void init() {
ByteHook.init();
}
}

  1. 钩和解钩
    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 的“连接视图”和“执行视图”的基本信息。

牛逼,字节跳动又一开源大作!程序员的福音!_第2张图片

linker(动态链接器)

牛逼,字节跳动又一开源大作!程序员的福音!_第3张图片

00
relocation 完成之后的函数调用关系如下

牛逼,字节跳动又一开源大作!程序员的福音!_第4张图片

ByteHook 中另外几个关键模块

牛逼,字节跳动又一开源大作!程序员的福音!_第5张图片

最后,为了鼓励鼓励,不点赞来一下吗,祝各位程序员开发无 Bug,发大财,行大运。

你可能感兴趣的:(有趣话题,行业话题,干货,android)