Android上的ebpf已經成為現實
-
維術大佬修改的debian方案挺好,可以直接在android跑bcc、bpftrace等基于ebpf封裝的工具
-
臉哥實踐出真知下的go + c 混合開發ebpf程序的方案挺好,開發環境簡單了,運行也不再需要debian環境依賴了,調用棧也有了unix domaian socket和load so的方案,屬實方便了許多
-
stackplz 和 estrace 屬實挺好,學到很多,臉哥和各位大佬牛逼
-
-
android上的ebpf實踐感覺大多還是基于syscall監測的需求
-
之前看了一些bpftrace的文章感覺用它來開發類似syscall的需求應該是更快的
-
需依賴debian環境
-
腳本化,參數解析之類的簡單,很簡單,非常簡單
-
當然了,能力不如bcc下的程序和臉哥他們用的方案強,主要是一些api來到bpftrace這邊不知道是啥,當然也可能是我的問題,沒有發掘出它的實力
-
接下來搞個簡單的bpftrace demo來仿寫一丟丟的estrace
-
設備環境:
复制 推薦鈔能力解決,直接上高內核版本 設備:小米12 內核:5.10.101-android12-9-00005-ga829d48e78bd-ab9206161(原版未改)
開發環境:
复制 eadbdebian+vscoderemote 當Xiaomi12遇到 eBPF:https://mp.weixin.qq.com/s/h_ixxr1WZ8VqYt-zMrwSDA eBPF on Android之bcc環境準備——eadb簡版:https://blog.seeflower.dev/archives/138/ 60秒學會用eBPF-BCC hook系統調用 ( 2 ) hook安卓所有syscall:https://bbs.kanxue.com/thread-275176.htm 文章看下來并實踐的話,你應該已經vscode可以遠程開發和跑bcc腳本了
Android Debian bpftrace環境初始化
复制 進入debian環境:/data/eadb/run/data/eadb/debian vi /etc/apt/sources.list deb http://ftp.cn.debian.org/debian sid main apt-get update apt-get install bpftrace bpftrace -V bpftrace v0.17.0
比著estrace上代碼
复制 #!/usr/bin/env bpftrace struct timespec { long tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ }; BEGIN { printf("Tracing all system calls... Hit Ctrl-C to end. "); } tracepointsys_enter /uid == $1/ { if (args->id == 221){ // int execve(const char *pathname, char *const argv[], char *const envp[]); printf("comm: %s, nr: %d, ", comm, args->id); printf("execve: path=%s, argv=", str(uptr(args->args[0]))); join(uptr(args->args[1])); }else if (args->id == 281){ // int execveat(int dirfd, const char *pathname, char *const argv[], char *const envp[], int flags); printf("comm: %s, nr: %d, ", comm, args->id); printf("execveat: path=%s, argv=", str(uptr(args->args[1]))); join(uptr(args->args[2])); }else if (args->id == 101){ // int nanosleep(const struct timespec *req, struct timespec *rem); printf("comm: %s, nr: %d, ", comm, args->id); $wait_time = (struct timespec *)uptr(args->args[0]); printf("nanosleep: tv_sec=%ld, tv_nsec=%ld ", $wait_time->tv_sec, $wait_time->tv_nsec); }else if (args->id == 56){ // int openat(int dirfd, const char *pathname, int flags, mode_t mode); //printf("comm: %s, nr: %d, ", comm, args->id); //printf("openat: path=%s ", str(uptr(args->args[1]))); @mem["openat", str(uptr(args->args[1]))] = count(); }else if (args->id == 78){ // ssize_t readlinkat(int dirfd, const char *pathname, char *buf, size_t bufsiz); //printf("comm: %s, nr: %d, ", comm, args->id); //printf("readlinkat: path=%s ", str(uptr(args->args[1]))); @mem["readlinkat", str(uptr(args->args[1]))] = count(); } return; }
代碼說明
-
就搞了一些系統調用號,主要是實踐bpftrace的能力,調用號數量不是問題,加就行了,體力活
-
gpt查下函數原型,比著解析參數就是了
-
對了,我現在不賣了gpt賬號了,買別人的吧
-
https://www.fakabang.com/details/F5DC5860
-
-
bpftrace的命令行參數解析,比較方便
-
主要是監測點的參數解析,不論是單個char *還是char *[],解析和輸出都非常方便
-
結構體也是支持的
-
bpf map用起來也是十分的方便,還可以數據統計
-
-
總之就是十分的方便
-
-
也可以ustack拿到用戶空間的調用棧,但好像解析有問題,不能直接顯示出具體的文件和偏移,不過感覺問題不大,自己去maps對照下映射文件和偏移也行
-
修改參數好像有點問題,沒找到api,只看到了override
-
-
單論syscall監測場景感覺足夠了,方便快捷是其他方案無法比擬的
-
-
就這樣吧
簡單跑下代碼看看,拿estrace的第一個例子試試
bpftrace開跑:
bpf map用來統計:
复制 bpftrace的開發文檔 https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md
簡單實踐over
審核編輯 :李倩
-
Android
+關注
關注
12文章
3977瀏覽量
130610 -
封裝
+關注
關注
128文章
8774瀏覽量
145841 -
參數
+關注
關注
11文章
1867瀏覽量
33232
原文標題:Android平臺bpftrace實踐
文章出處:【微信號:哆啦安全,微信公眾號:哆啦安全】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
基于ebpf的性能工具-bpftrace腳本語法

基于android平臺的耳機驅動
初級小白實戰資料,零基礎入門rk3399平臺下linux4.4+android8.1開發
Android內核編譯教程
Android平臺發展暗埋隱患
Android應用原型實踐分析

Android平臺發展暗埋隱患
強勁的Linux Trace工具 bpftrace for Linux 2018

將Android操作系統移植到嵌入式平臺的最佳實踐
基于ebpf的性能工具-bpftrace

評論