Android 上主流Hook工具原理分析

类Xposed

类Xposed主要包含xposed、edxposed、lsposed,这三个都依赖于xposed的原始hook框架,所以介绍这三个相当于是

Xposed

注入

Hook

EDXposed

注入

Hook

LsPosed

注入

Hook

Frida

注入

Frida注入方式有很多,frida-server自带的attach、spawn,还有各种千奇百怪的利用frida-gadget做核心,其他的注入方式来注入的,我这里就不一一展开说明了,我也没怎么用过哪些注入方式。

attach

spawn

Hook-Inline Hook

Frida-gum

这里主要是参考evilpan大佬的文章Frida Internal - Part 1: 架构、Gum 与 V8

按照其中给出的frida-gum例子结合源码来做分析

使用https://github.com/frida/frida/releases中的https://github.com/frida/frida/releases/download/15.2.2/frida-gum-devkit-15.2.2-android-arm64.tar.xz ,解压缩后,会有一个.c、一个.h以及一个.a文件,主要是按照其中的frida-gum-example.c的demo来做分析。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
GumInterceptor * interceptor;
GumInvocationListener * listener;

gum_init_embedded ();

interceptor = gum_interceptor_obtain ();
listener = g_object_new (EXAMPLE_TYPE_LISTENER, NULL);

gum_interceptor_begin_transaction (interceptor);
gum_interceptor_attach (interceptor,
GSIZE_TO_POINTER (gum_module_find_export_by_name (NULL, "open")),
listener,
GSIZE_TO_POINTER (EXAMPLE_HOOK_OPEN));
gum_interceptor_attach (interceptor,
GSIZE_TO_POINTER (gum_module_find_export_by_name (NULL, "close")),
listener,
GSIZE_TO_POINTER (EXAMPLE_HOOK_CLOSE));
gum_interceptor_end_transaction (interceptor);

close (open ("/etc/hosts", O_RDONLY));


g_object_unref (listener);
g_object_unref (interceptor);

gum_deinit_embedded ();

人眼看代码看,但是感觉并不是很清晰,并不知道具体干了什么,还需要结合调试来看完整的过程。

frida-gum代码阅读笔记

调试Frida-gum

前面所说,肉眼看代码分析其流程可能会出现很大的问题,程序代码多个if-else结构,走入的流程不尽相同,所以需要实际调试来分析。

怎么调试呢?这是个问题,其次官方release中的frida-gum-devkit是怎么编译的。

Frida-gum을 이용한 Android Hook

了解大致的编译流程后,如何基于源码进行调试,可否改造成cmake项目。

GOT/PLT Hook

Bhook

https://github.com/bytedance/bhook

ByteHook 是一个 Android PLT hook 库,它支持 armeabi-v7a, arm64-v8a, x86 和 x86_64。

字节跳动的大多数 Android app(包括抖音,今日头条,西瓜视频)在线上环境中使用了 ByteHook 作为 PLT hook 方案。

其中主要是监控dl、linker等,用来解析ELF的执行视图,并将.rel.plt,.rel.dyn等重定向内容改成hook的内容。

Inline Hook

介绍Frida-gum,这在Frida一节会讲