ebpf初探
type
status
date
slug
tags
summary
category
icon
password
概念
首先看一下安卓官方文档的定义:
扩展型柏克莱封包过滤器 (eBPF) 是一个内核中的虚拟机,可运行用户提供的 eBPF 程序来扩展内核功能。这些程序可以挂接到内核中的探测点或事件,并用于收集有用的内核统计信息、监控和调试。程序使用 bpf
系统调用加载到内核中,并作为 eBPF 机器指令的二进制 blob 由用户提供。Android 构建系统支持使用本文所述的简单 build 文件语法将 C 程序编译为 eBPF 程序。
Android 加载器:在Android启动期间, 系统会加载位于/system/etc/bpf/的所有eBPF程序,这些程序是Android构建系统根据C程序构建而成的二进制对象,并附带了Android源码树中的Android.bp文件。构建系统将生成的对象存储在/system/etc/bpf中,这些对象将成为系统映像的一部分
这么看有点不明晰,简单地说,ebpf是无需改变内核代码或加载内核模块的情况下拓展内核功能的技术,那确实方便
GKI(General Kernel Image) :通用内核镜像,android 12以上强制GKI,几乎完整支持eBPF的所有功能,如果设备是GKI的,那么可以不需要编译内核代码就能支持eBPF,且GKI设备之间的eBPF程序可以比较好的拓展
我自己的设备是安卓11,4.13,不完全支持
ls /sys/fs/bpf
和 lsmod | grep bpf
折腾了半天实在不好搞,得自己编译内核,但没找到版本很符合的源码,硬弄怕出现硬件问题
于是又买了个支持的()
工具 stackplz
来试试这个可爱小工具
可以监控 syscall 的调用 以及 libc,挺方便的
写一个小demo
首先,我们要的功能是,匹配到openat带maps路径就给它重定向一个maps
说起来,如果把所有对文件、环境的读写操作都导入一个挂载的沙箱中,这种可实现吗(咕咕)
linux
先改一下代码试试:
获取ecc编译器:
下载 ecli 工具,用于运行 eBPF 程序:
android
eadb项目链接如下
下载
debianfs-arm64-full.tar.gz
,当前最新版是v0.1.6
创建
/data/eadb
文件夹,推送rootfs到手机上下载/克隆
eadb
项目,进入assets
目录,推送脚本到手机并给脚本加上权限将eadb的assets文件夹推送到
/data/eadb
目录下,并给其中的脚本添加执行权限进入
adb shell
,切换到root用户执行rootfs的解压脚本现在可以进入debian环境了(adb shell后切换root用户)
上一篇
CPU工作的三种模式
下一篇
ICBC
Loading...