frida-gum简介
[frida-gum](frida/frida-gum: Cross-platform instrumentation and introspection library written in C (github.com))是frida的核心hook的实现,提供inline hook、代码追踪、内存监听等。上一段时间想对K50的某些HAL服务进行hook,实现对真彩显示的优化,便试着使用这个库了。
使用
1.概述
我的目的是对一个正常的linux进程进行hook,在开始使用前,先思考下完成hook的大致逻辑。
- 编写一个so,需要这个so在被dlopen打开时执行我们的hook注册逻辑
- 通过ptrace在目标进程分配内存并调用dlopen函数
2.编写hook的so
项目结构及修改内容
首先,我使用的是frida-gum,在frida的release里有已经编译好的frida-gum-devkit压缩包,下载后解压里面含有静态链库libfrida-gum.a和头文件frida-gum.h以及简单的hook例子frida-gum-example.c
$ tar xvf frida-gum-devkit-16.0.10-android-arm64.tar.xz
./
./frida-gum-example.c
./frida-gum.h
./libfrida-gum.a
随后建立一个ndk项目,结构如下,
$ tree
.
└── jni
├── Android.mk
├── Application.mk
├── frida-gum-example.c
├── inc
│ ├── frida-gum.h
│ └── libfrida-gum.a
└── main.c
2 directories, 6 files
Android.mk需要修改的内容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := truetoneopt
LOCAL_SRC_FILES := main.c
# 注意引入inc下的frida-gum的头文件和链接静态库
LOCAL_C_INCLUDES := $(LOCAL_PATH)/inc/
LOCAL_LDLIBS := -llog -L$(LOCAL_PATH)/inc/ -lfrida-gum
LOCAL_BRANCH_PROTECTION :=
include $(BUILD_SHARED_LIBRARY)
hook注册逻辑
这里使用的是**attribute((constructor))**关键词来让我们的so在被dlopen的时候加载
void __attribute__((constructor)) entry(void);
void entry(){
// frida-gum使用的是GObject
GumInterceptor *interceptor;
GumInvocationListener *listener;
// 初始化gum
gum_init_embedded();
// 获取interceptor对象
interceptor = gum_interceptor_obtain();
}