这篇文章上次修改于 799 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

前言

好像还没有人发过编译安卓版ecapture的教程,这里记录下编译要点

步骤

编译必须是在arm64的系统下进行

官方指南建议使用ubuntu aarch64编译,不过编译老是买服务器也耗不起

所以我这搞个手机编译,首先参考下面的文章在手机上准备好rootfs

eBPF on Android之bcc环境准备——eadb简版

在rootfs系统安装上下面的库/软件,如果遇到网络问题自行挂代理

安装编译工具

apt install cmake
apt install llvm-12
apt install clang-12

安装go,通过下面的方式安装(记得proxychains挂代理)

wget "https://golang.org/dl/go1.17.12.linux-arm64.tar.gz"
tar -C /usr/local -xvf "go1.17.12.linux-arm64.tar.gz"

rootfs好像没有xz命令,安装上

apt install xz-utils

拉取ecapture

git clone https://github.com/ehids/ecapture.git
cd ecapture

先向~/.bashrc添加下面的配置,然后source ~/.bashrc

注意,如果rootfs退出重新进,这一步需要再次手动执行

export GOPATH=$HOME/go
export PATH=/usr/local/go/bin:$PATH:$GOPATH/bin

然后设置环境变量

export CMD_CLANG=clang-12
export CMD_STRIP=llvm-strip-12
export CMD_LLC=llc-12
export GOPROXY=https://proxy.golang.com.cn,direct

开始编译

ANDROID=1 make nocore

然后会提示找不到linux/kconfig.h,详细错误如下

clang-12 \
                -I ./kern -I ./kern/bpf/arm64 \
                -I /lib/modules/5.10.43-android12-9-00007-g9771767708df-ab8009062/build/arch/arm64/include \
                -I /lib/modules/5.10.43-android12-9-00007-g9771767708df-ab8009062/build/arch/arm64/include/uapi \
                -I /lib/modules/5.10.43-android12-9-00007-g9771767708df-ab8009062/build/arch/arm64/include/generated \
                -I /lib/modules/5.10.43-android12-9-00007-g9771767708df-ab8009062/build/arch/arm64/include/generated/uapi \
                -I /lib/modules/5.10.43-android12-9-00007-g9771767708df-ab8009062/build/include \
                -I /lib/modules/5.10.43-android12-9-00007-g9771767708df-ab8009062/build/include \
                -I /lib/modules/5.10.43-android12-9-00007-g9771767708df-ab8009062/build/include/uapi \
                -I /lib/modules/5.10.43-android12-9-00007-g9771767708df-ab8009062/build/include/generated \
                -I /lib/modules/5.10.43-android12-9-00007-g9771767708df-ab8009062/build/include/generated/uapi \
                -emit-llvm -O2 -S -xc -g -D__BPF_TRACING__ -D__KERNEL__ -DNOCORE  -Wall -Wno-unused-variable -Wno-frame-address -Wno-unused-value -Wno-unknown-warning-option -Wno-pragma-once-outside-header -Wno-pointer-sign -Wno-gnu-variable-sized-type-not-at-end -Wno-deprecated-declarations -Wno-compare-distinct-pointer-types -Wno-address-of-packed-member -fno-stack-protector -fno-jump-tables -fno-unwind-tables -fno-asynchronous-unwind-tables \
                 \
                -c kern/openssl_kern.c \
                -o - |llc-12 \
                -march=bpf \
                -filetype=obj \
                -o user/bytecode/openssl_kern.o
In file included from kern/openssl_kern.c:1:
./kern/ecapture.h:14:10: fatal error: 'linux/kconfig.h' file not found
#include <linux/kconfig.h>
         ^~~~~~~~~~~~~~~~~
1 error generated.

这是因为找不到内核头文件,这里查找的路径是/lib/modules/5.10.43-android12-9-00007-g9771767708df-ab8009062/build

然后看看手机上有没有/sys/kernel/kheaders.tar.xz,这个就是内核头文件的压缩包

如果没有则需要在编译内核的时候设置CONFIG_IKHEADERS选项

还有个方案是参考自己手机内核源码中的kernel_headers.py脚本,自行梳理头文件关系

先把/sys/kernel/kheaders.tar.xz复制到rootfs中

cp /sys/kernel/kheaders.tar.xz /data/eadb/debian/kheaders.tar.xz

在rootfs的终端执行解压命令(不同手机不同内核版本,这个目录可能不同,请根据报错显示的来)

mkdir -p /lib/modules/5.10.43-android12-9-00007-g9771767708df-ab8009062/build
tar -xvf kheaders.tar.xz -C /lib/modules/5.10.43-android12-9-00007-g9771767708df-ab8009062/build

现在再次执行ANDROID=1 make nocore编译

然后就可以使用下面这样的命令抓包了,注意要指定网卡,另外指定uid或者pid

./ecapture tls -i wlan0 -u 10224 --libssl /apex/com.android.conscrypt/lib64/libssl.so --pthread /apex/com.android.runtime/lib64/bionic/libc.so

编译要点:

  • arm64系统
  • 指定CMD_CLANG CMD_STRIP CMD_LLC环境变量
  • 设置加速Go下载的环境变量GOPROXY
  • 提取内核头文件到特定目录