使用frida-gum编写Android原生进程的hook


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();
}

文章作者: f19
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 f19 !
  目录