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

Posted 程序员IT工场:cxyITgc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛逼,字节跳动又一开源大作!程序员的福音!相关的知识,希望对你有一定的参考价值。

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

这个项目是「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 的“连接视图”和“执行视图”的基本信息。

linker(动态链接器)

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

ByteHook 中另外几个关键模块

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

以上是关于牛逼,字节跳动又一开源大作!程序员的福音!的主要内容,如果未能解决你的问题,请参考以下文章

牛逼!字节跳动《MYSQL笔记》火了,完整版PDF开放下载!

字节跳动开源的一个 Golang 微服务 HTTP 框架

又一 AI 大牛离职返校!前字节跳动 AI Lab 总监李磊加入 UCSB 执教

又一 AI 大牛离职返校!前字节跳动 AI Lab 总监李磊加入 UCSB 执教

程序员亲测,认真学习这个开源项目就能拿到字节跳动的 offer!

一经开源就火了,字节跳动开源微服务中间件CloudWeGo