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 编译与体验