Skip to content

Commit 320437a

Browse files
author
Your Name
committed
发布v1.3.0
1 parent ec12bea commit 320437a

30 files changed

+711
-1017
lines changed

README.md

Lines changed: 94 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -42,70 +42,97 @@ chmod +x /data/local/tmp/stackplz
4242

4343
3. 参考下列命令示例进行hook
4444

45-
**必须指定目标进程的uid**通过包名获取uid的命令如下
45+
通过**指定uid**`/apex/com.android.runtime/lib64/bionic/libc.so``open`函数进行hook
4646

4747
```bash
48-
dumpsys package com.sfx.ebpf | grep userId=
48+
./stackplz --uid 10245 stack --symbol open --unwindstack --regs
4949
```
5050

51-
**简单使用**`--libpath`默认为`/apex/com.android.runtime/lib64/bionic/libc.so`,所以下面的命令是针对uid为10245的进程,hook对应libc.so的`open`函数,这里是通过uid过滤的,即使是多进程也不影响,另外还可以输出hook时的完整寄存器信息!
51+
![](./images/Snipaste_2022-11-13_14-10-18.png)
52+
53+
通过**指定包名**,对`libnative-lib.so``_Z5func1v`符号进行hook
5254

5355
```bash
54-
./stackplz stack --uid 10224 --symbol open --unwindstack --regs
56+
./stackplz --name com.sfx.ebpf stack --library libnative-lib.so --symbol _Z5func1v --unwindstack --regs
5557
```
5658

57-
![](./images/Snipaste_2022-11-10_00-11-12.png)
58-
59+
![](./images/Snipaste_2022-11-13_14-11-03.png)
5960

60-
**复杂使用**:指定偏移,对任意的APP三方库进行hook追踪,记得uid要对应
61+
通过**指定包名和配置文件**进行批量hook
6162

6263
```bash
63-
./stackplz stack --uid 10224 --libpath /data/app/~~d6FTHd4woitjnG95rjCv1w==/com.sfx.ebpf-YyPF9u5v8CBZD6OOfV4XQg==/lib/arm64/libnative-lib.so --offset 0xF37C --unwindstack
64+
./stackplz --name com.sfx.ebpf stack --config config.json
6465
```
6566

66-
eBPF hook需要提供完整的库文件路径,所以我们需要先查看要hook的库具体是啥路径
67-
68-
最准确的做法是当程序运行时,查看程序的`/proc/{pid}/maps`内容,这里的路径是啥就是啥
67+
![](./images/Snipaste_2022-11-13_14-12-00.png)
68+
69+
配置文件示例如下
70+
71+
```json
72+
{
73+
"library_dirs": [
74+
"/apex/com.android.runtime/lib64"
75+
],
76+
"libs": [
77+
{
78+
"library": "bionic/libc.so",
79+
"disable": false,
80+
"configs": [
81+
{
82+
"unwindstack": true,
83+
"regs": true,
84+
"symbols": ["open"],
85+
"offsets": []
86+
},
87+
{
88+
"unwindstack": false,
89+
"regs": true,
90+
"symbols": ["read", "send", "recv"],
91+
"offsets": []
92+
}
93+
]
94+
},
95+
{
96+
"library": "libnative-lib.so",
97+
"disable": false,
98+
"configs": [
99+
{
100+
"unwindstack": true,
101+
"regs": true,
102+
"symbols": ["_Z5func1v"],
103+
"offsets": ["0xF37C"]
104+
}
105+
]
106+
}
107+
]
108+
}
109+
```
69110

70-
![](./images/Snipaste_2022-11-09_15-23-31.png)
111+
字段说明:
71112

72-
路径看起来有些随机字符,但是APP安装后这个是不会变的,所以获取一次就行
113+
- `library_dirs` 目标库的搜索路径,可以设置多个
114+
- `libs` 目标多个库的hook配置
115+
- `library` 库名、完整库路径或者与搜索路径拼接后存在的路径
116+
- `disable` 是否启用hook
117+
- `configs` 目标库的多个hook点配置,按输出需要进行配置
118+
- 即输出堆栈与输出寄存器信息的组合,每一种组合都可以设定多个符号和多个偏移
73119

74-
效果如图
120+
注意事项
75121

76-
![](./images/Snipaste_2022-11-09_15-28-12.png)
122+
- 必须提供包名或者目标的uid,二选一
123+
- 默认hook的库是`/apex/com.android.runtime/lib64/bionic/libc.so`,可以只提供符号进行hook
124+
- hook目标加载的库时,默认在对应的库目录搜索,所以可以直接指定库名而不需要完整路径
125+
- 例如 `/data/app/~~t-iSPdaqQLZBOa9bm4keLA==/com.sfx.ebpf-C_ceI-EXetM4Ma7GVPORow==/lib/arm64`
126+
- 如果要hook的库无法被自动检索到,请提供在内存中加载的完整路径
127+
- 最准确的做法是当程序运行时,查看程序的`/proc/{pid}/maps`内容,这里的路径是啥就是啥
128+
- 批量hook请记得把配置文件推送到程序运行的同一目录
77129

78130
查看更多帮助信息使用如下命令:
79131

80132
- `/data/local/tmp/stackplz -h`
81133
- `/data/local/tmp/stackplz stack -h`
82134

83-
输出到日志文件添加`--log-file tmp.log`
84-
85-
只输出到日志,不输出到终端再加一个`--quiet`即可
86-
87-
# 批量hook
88-
89-
准备好`stackplz``config.json`,推送到手机
90-
91-
```bash
92-
adb push stackplz /data/local/tmp
93-
adb push config.json /data/local/tmp
94-
```
95-
96-
参考下面的命令,目前可以仅使用`--regs`表示输出寄存器信息,但是现在还没有把批量hook的点和结果对应...所以请耐心等待完善
97-
98-
```bash
99-
./stackplz stack -u 10245 --config config.json --unwindstack --regs --log-file tmp.log
100-
```
101-
102-
效果如图:
103-
104-
![](./images/Snipaste_2022-11-10_23-13-11.png)
105-
106-
有的时候可能丢失了部分信息,后续尝试完善,或者减少系统函数的hook点位
107-
108-
![](./images/Snipaste_2022-11-10_23-14-05.png)
135+
输出到日志文件添加`-o/--out tmp.log`,只输出到日志,不输出到终端再加一个`--quiet`即可
109136

110137
# 编译
111138

@@ -179,7 +206,7 @@ adb push bin/stackplz /data/local/tmp
179206

180207
# TODO
181208

182-
- 通过配置文件实现批量hook
209+
- 从0到1文章
183210
- 优化代码逻辑...
184211

185212
# Q & A
@@ -204,11 +231,33 @@ adb push bin/stackplz /data/local/tmp
204231

205232
3. perf event ring buffer full, dropped 9 samples
206233

207-
待完善,wating plz...
234+
有待优化,目前建议是不输出堆栈,或者减少hook点
235+
236+
4. 通过符号hook确定调用了但是不输出信息?
237+
238+
某些符号存在多种实现(或者重定位?),这个时候需要指定具体使用的符号或者偏移
239+
240+
例如`strchr`可能实际使用的是`__strchr_aarch64`,这个时候应该指定`__strchr_aarch64`而不是`strchr`
241+
242+
```bash
243+
coral:/data/local/tmp # readelf -s /apex/com.android.runtime/lib64/bionic/libc.so | grep strchr
244+
868: 00000000000b9f00 32 GNU_IFUNC GLOBAL DEFAULT 14 strchrnul
245+
869: 00000000000b9ee0 32 GNU_IFUNC GLOBAL DEFAULT 14 strchr
246+
1349: 000000000007bcf8 68 FUNC GLOBAL DEFAULT 14 __strchr_chk
247+
689: 000000000004a8c0 132 FUNC LOCAL HIDDEN 14 __strchrnul_aarch64_mte
248+
692: 000000000004a980 172 FUNC LOCAL HIDDEN 14 __strchrnul_aarch64
249+
695: 000000000004aa40 160 FUNC LOCAL HIDDEN 14 __strchr_aarch64_mte
250+
698: 000000000004ab00 204 FUNC LOCAL HIDDEN 14 __strchr_aarch64
251+
5143: 00000000000b9ee0 32 FUNC LOCAL HIDDEN 14 strchr_resolver
252+
5144: 00000000000b9f00 32 FUNC LOCAL HIDDEN 14 strchrnul_resolver
253+
5550: 00000000000b9ee0 32 GNU_IFUNC GLOBAL DEFAULT 14 strchr
254+
6253: 000000000007bcf8 68 FUNC GLOBAL DEFAULT 14 __strchr_chk
255+
6853: 00000000000b9f00 32 GNU_IFUNC GLOBAL DEFAULT 14 strchrnul
256+
```
208257

209-
3. 仅使用`--regs`不知道对应哪个hook点
258+
如图,我们可以看到直接调用了`__strchr_aarch64`而不是经过`strchr`再去调用`__strchr_aarch64`
210259

211-
待完善,wating plz...
260+
![](./images/Snipaste_2022-11-13_14-19-38.png)
212261

213262
# 交流
214263

assets/ebpf_probe.go

Lines changed: 11 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cli/cmd/global.go

Lines changed: 0 additions & 56 deletions
This file was deleted.

0 commit comments

Comments
 (0)