pixel6 到手的第一件事,当然是去玩玩看 ebpf 了~ebpf 的无痕 hook 听上去就感觉相当的强大,去官网看了一下 ebpf 知名度排名前几的项目,那非 bcc 莫属了,用 python 就可以运行 ebpf 代码,虽然 ebpf 的核心代码还是 C 写的,但是用 python 去执行就感觉十分的舒适
在网上也找到了三篇非常详细的 Android bcc 编译教程,前人种树,后人乘凉 ^.^  可以试试看 ebpf 究竟是什么样子的啦
- eBPF on Android 之 bcc 环境准备 ——eadb 原版
 - [原创] 60 秒学会用 eBPF-BCC hook 系统调用 ( 2 ) hook 安卓所有 syscall
 - eBPF on Android 之 bcc 编译与体验
 
# bcc 环境搭建
接下来进行 bcc 的环境搭建,我们将使用 eadb 在手机中配置 Debian 系统,并通过 ssh 让 Windows 上的 vscode 可以连接手机中的 Debian
想要使用 bcc 的全部功能,首先检查 linux 内核版本,我的内核版本为 5.10
uname -a  | 
然后检查 BPF 的配置是否开启
oriole:/ # zcat /proc/config.gz | grep PROBE | |
CONFIG_GENERIC_IRQ_PROBE=y  | |
CONFIG_ARCH_SUPPORTS_UPROBES=y  | |
CONFIG_KPROBES=y  | |
CONFIG_UPROBES=y  | |
CONFIG_KRETPROBES=y  | |
CONFIG_HAVE_KPROBES=y  | |
CONFIG_HAVE_KRETPROBES=y  | |
# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set | |
CONFIG_GENERIC_CPU_AUTOPROBE=y  | |
CONFIG_TIMER_PROBE=y  | |
CONFIG_KPROBE_EVENTS=y  | |
CONFIG_UPROBE_EVENTS=y  | |
CONFIG_PROBE_EVENTS=y  | |
# CONFIG_BPF_KPROBE_OVERRIDE is not set | |
# CONFIG_KPROBE_EVENT_GEN_TEST is not set | 
随后使用 magisk root 手机,然后安装 MagiskSSH
ubuntu 中在 root 权限下安装 adb 和 fastboot
apt install adb,fastboot  | 
随后在 ubuntu 中输入下列命令生成 rsa 密钥,一路回车
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"  | 
将公钥推送到手机中
adb push ~/.ssh/id_rsa.pub /data/local/tmp  | 
将公钥追加写入 MagiskSSH 的配置文件中
cat /data/local/tmp/id_rsa.pub >> /data/ssh/shell/.ssh/authorized_keys  | |
chmod 600 /data/ssh/shell/.ssh/authorized_keys  | |
cat /data/local/tmp/id_rsa.pub >> /data/ssh/root/.ssh/authorized_keys  | |
chmod 600 /data/ssh/root/.ssh/authorized_keys  | 
使用 MT 管理器编辑 /data/ssh/sshd_config , 把下面的内容粘贴到文件开头并保存即可
Port 22225 | |
PasswordAuthentication yes  | |
PermitEmptyPasswords yes  | |
PermitUserEnvironment yes  | 

重启 sshd 服务
/data/adb/modules/ssh/opensshd.init stop  | |
/data/adb/modules/ssh/opensshd.init start  | 
随后在 ubuntu 中下载 eadb 和 debianfs

在手机的 WLAN 网络详情里找到手机热点的 IP 地址
配置 debian 环境
./eadb --ssh root@192.168.50.191 -p 22225 prepare -a debianfs-arm64-full.tar.gz  | 
然后运行下面的命令就可以连接上了
./eadb --ssh root@192.168.50.191 -p 22225 shell  | 
为 Debian 配置 ssh
apt-get update | |
apt-get install ssh  | 
打开 /etc/ssh/sshd_config
vim /etc/ssh/sshd_config | 
并按下 ctrl+shift+v  粘贴下列的内容
AuthorizedKeysFile .ssh/authorized_keys  | |
Port 11111 | |
PubkeyAuthentication yes  | |
PermitRootLogin yes  | |
PasswordAuthentication yes  | |
GSSAPIAuthentication no # 加速SSH  | |
UseDNS no # 加速SSH  | 
在虚拟机 ubuntu 中查看生成的公钥
cat ~/.ssh/id_rsa.pub | 
在手机 Debian 中手动粘贴导入公钥
vim id_rsa.pub | 
在手机 Debian 中增加公钥并配置权限
cat id_rsa.pub >> ~/.ssh/authorized_keys  | |
chmod 600 ~/.ssh/authorized_keys;chmod 700 ~/.ssh  | |
service ssh restart # 手机每次重启后,第一次进入 debian, 可能都需要手动启动下 ssh 服务  | 
如果没有 ~/.ssh/authorized_keys  文件,新建一个就行了
mkdir ~/.ssh;touch ~/.ssh/authorized_keys  | 
修改 Debian 的 root 密码
passwd root | 
在 ubuntu 中查看私钥,然后复制到 Windows 的一个文件 id_rsa  中
cat ~/.ssh/id_rsa | 
然后打开 C:\Users\admin\.ssh\config , 配置 ssh, 并在 vscode 中安装 ssh 插件

之后关闭虚拟机让手机的 USB 连上 Windows, 在 vscode 中就可以连上啦
vscode 第一次连接 Debian, 会在 Debian 中安装 vscode 服务器,如果不开代理的话速度会相当相当的慢,要想给 Debian 挂代理的话,只要在手机中把 Clash 开起来就可以啦
# bcc 编译运行
环境搭建好了之后,就可以编译 bcc 了
先把 bcc 下过来
git clone https://github.com/iovisor/bcc.git | 
编译 bcc
mkdir bcc/build; cd bcc/build  | |
cmake .. | |
make | 
我在编译的过程中遇到了如下的报错

先装个 pip
wget https://bootstrap.pypa.io/get-pip.py | |
python get-pip.py  | 
然后再安装 setuptools
wget https://files.pythonhosted.org/packages/af/e7/02db816dc88c598281bacebbb7ccf2c9f1a6164942e88f1a0fded8643659/setuptools-45.0.0-py2.py3-none-any.whl | |
pip install setuptools-45.0.0-py2.py3-none-any.whl | 
后来又报错 zip 没安装

装一个 zip
apt-get install zip  | 
重新 make  之后编译成功~
然后把 bcc 安装一下
make install  | 
随后再编译一下 python 的 bcc
cmake -DPYTHON_CMD=python3 ..  | |
pushd src/python/ | |
make | |
make install  | |
popd | 
试试看官方的例子
python3 bcc/examples/hello_world.py  | 
结果竟然没输出?
哈哈,原来是 tracing 的开关没开,开一下
echo 1 > /sys/kernel/tracing/tracing_on  | 
Hello, World!

# 参考资料
- eBPF on Android 之 bcc 环境准备 ——eadb 原版
 - [原创] 60 秒学会用 eBPF-BCC hook 系统调用 ( 2 ) hook 安卓所有 syscall
 - eBPF on Android 之 bcc 编译与体验