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

image-20240507160213733

重启 sshd 服务

/data/adb/modules/ssh/opensshd.init stop
/data/adb/modules/ssh/opensshd.init start

随后在 ubuntu 中下载 eadb 和 debianfs

image-20240507154231052

在手机的 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 插件

image-20240509205100257

之后关闭虚拟机让手机的 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

我在编译的过程中遇到了如下的报错

image-20240512122600431

先装个 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 没安装

image-20240512124227438

装一个 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!

image-20240512135018318

# 参考资料

  • eBPF on Android 之 bcc 环境准备 ——eadb 原版
  • [原创] 60 秒学会用 eBPF-BCC hook 系统调用 ( 2 ) hook 安卓所有 syscall
  • eBPF on Android 之 bcc 编译与体验
更新于 阅读次数