0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Android平臺(tái)bpftrace實(shí)踐

哆啦安全 ? 來源:哆啦安全 ? 2023-04-27 15:16 ? 次閱讀

Android上的ebpf已經(jīng)成為現(xiàn)實(shí)

  • 維術(shù)大佬修改的debian方案挺好,可以直接在android跑bcc、bpftrace等基于ebpf封裝的工具

  • 臉哥實(shí)踐出真知下的go + c 混合開發(fā)ebpf程序的方案挺好,開發(fā)環(huán)境簡(jiǎn)單了,運(yùn)行也不再需要debian環(huán)境依賴了,調(diào)用棧也有了unix domaian socket和load so的方案,屬實(shí)方便了許多

    • stackplz 和 estrace 屬實(shí)挺好,學(xué)到很多,臉哥和各位大佬牛逼

  • android上的ebpf實(shí)踐感覺大多還是基于syscall監(jiān)測(cè)的需求

  • 之前看了一些bpftrace的文章感覺用它來開發(fā)類似syscall的需求應(yīng)該是更快的

    • 需依賴debian環(huán)境

    • 腳本化,參數(shù)解析之類的簡(jiǎn)單,很簡(jiǎn)單,非常簡(jiǎn)單

    • 當(dāng)然了,能力不如bcc下的程序和臉哥他們用的方案強(qiáng),主要是一些api來到bpftrace這邊不知道是啥,當(dāng)然也可能是我的問題,沒有發(fā)掘出它的實(shí)力

    • 接下來搞個(gè)簡(jiǎn)單的bpftrace demo來仿寫一丟丟的estrace

設(shè)備環(huán)境:

推薦鈔能力解決,直接上高內(nèi)核版本
設(shè)備:小米12
內(nèi)核:5.10.101-android12-9-00005-ga829d48e78bd-ab9206161(原版未改)

開發(fā)環(huán)境:

eadbdebian+vscoderemote


當(dāng)Xiaomi12遇到 eBPF:https://mp.weixin.qq.com/s/h_ixxr1WZ8VqYt-zMrwSDA
eBPF on Android之bcc環(huán)境準(zhǔn)備——eadb簡(jiǎn)版:https://blog.seeflower.dev/archives/138/
60秒學(xué)會(huì)用eBPF-BCC hook系統(tǒng)調(diào)用 ( 2 ) hook安卓所有syscall:https://bbs.kanxue.com/thread-275176.htm


文章看下來并實(shí)踐的話,你應(yīng)該已經(jīng)vscode可以遠(yuǎn)程開發(fā)和跑bcc腳本了

Android Debian bpftrace環(huán)境初始化

進(jìn)入debian環(huán)境:/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;
}

代碼說明

  • 就搞了一些系統(tǒng)調(diào)用號(hào),主要是實(shí)踐bpftrace的能力,調(diào)用號(hào)數(shù)量不是問題,加就行了,體力活

    • gpt查下函數(shù)原型,比著解析參數(shù)就是了

    • 對(duì)了,我現(xiàn)在不賣了gpt賬號(hào)了,買別人的吧

    • https://www.fakabang.com/details/F5DC5860

  • bpftrace的命令行參數(shù)解析,比較方便

  • 主要是監(jiān)測(cè)點(diǎn)的參數(shù)解析,不論是單個(gè)char *還是char *[],解析和輸出都非常方便

  • 結(jié)構(gòu)體也是支持的

  • bpf map用起來也是十分的方便,還可以數(shù)據(jù)統(tǒng)計(jì)

  • 總之就是十分的方便

  • 也可以u(píng)stack拿到用戶空間的調(diào)用棧,但好像解析有問題,不能直接顯示出具體的文件和偏移,不過感覺問題不大,自己去maps對(duì)照下映射文件和偏移也行

  • 修改參數(shù)好像有點(diǎn)問題,沒找到api,只看到了override

  • 單論syscall監(jiān)測(cè)場(chǎng)景感覺足夠了,方便快捷是其他方案無法比擬的

  • 就這樣吧

簡(jiǎn)單跑下代碼看看,拿estrace的第一個(gè)例子試試

2bb39218-e4ca-11ed-ab56-dac502259ad0.png

bpftrace開跑:

2bd770ca-e4ca-11ed-ab56-dac502259ad0.png

bpf map用來統(tǒng)計(jì):

2bff63e6-e4ca-11ed-ab56-dac502259ad0.png

bpftrace的開發(fā)文檔
https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md

簡(jiǎn)單實(shí)踐over

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    3904

    瀏覽量

    126637
  • 封裝
    +關(guān)注

    關(guān)注

    125

    文章

    7599

    瀏覽量

    142160
  • 參數(shù)
    +關(guān)注

    關(guān)注

    11

    文章

    1670

    瀏覽量

    31896

原文標(biāo)題:Android平臺(tái)bpftrace實(shí)踐

文章出處:【微信號(hào):哆啦安全,微信公眾號(hào):哆啦安全】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux跟蹤工具bpftrace的原理和使用

    這篇文章介紹一個(gè)基于ebpf技術(shù)的強(qiáng)大工具--bpftrace。
    發(fā)表于 09-01 15:10 ?1664次閱讀
    Linux跟蹤工具<b class='flag-5'>bpftrace</b>的原理和使用

    基于ebpf的性能工具-bpftrace腳本語法

    bpftrace 通過高度抽象的封裝來使用 eBPF,大多數(shù)功能只需要寥寥幾筆就可以運(yùn)行起來,可以很快讓我們搞清楚 eBPF 是什么樣的,而暫時(shí)不關(guān)心 eBPF 復(fù)雜的內(nèi)部機(jī)理。由于
    的頭像 發(fā)表于 09-04 16:04 ?822次閱讀
    基于ebpf的性能工具-<b class='flag-5'>bpftrace</b>腳本語法

    4412開發(fā)板Android教程——Android平臺(tái)簡(jiǎn)介

    經(jīng)驗(yàn)豐富的工程師可以參與到Android開發(fā)Android平臺(tái)體系結(jié)構(gòu) Android平臺(tái)體系結(jié)構(gòu)Linux Kernel顯卡、攝像頭 、藍(lán)
    發(fā)表于 10-20 11:43

    基于android平臺(tái)的耳機(jī)驅(qū)動(dòng)

    工作以后接手的第一個(gè)驅(qū)動(dòng)就是android平臺(tái)下耳機(jī)的插拔檢測(cè)和按鍵檢測(cè)。這部分涉及的硬件知識(shí)比較簡(jiǎn)單,但是軟件上對(duì)中斷的處理,軟件檢測(cè)的魯棒性,都有比較高的要求,涉及到驅(qū)動(dòng)開發(fā)中經(jīng)常使用的中斷申請(qǐng),工作隊(duì)列,tasklet,竟態(tài)和同步,linux input子系統(tǒng),
    發(fā)表于 05-20 10:39

    初級(jí)小白實(shí)戰(zhàn)資料,零基礎(chǔ)入門rk3399平臺(tái)下linux4.4+android8.1開發(fā)

    直播時(shí)間:7月30日(本周五)19:30直播主題:一起玩安卓刷機(jī)與Linux設(shè)備驅(qū)動(dòng)(基于RK3399平臺(tái)下Linux4.4+Android8.1開發(fā))直播講師:信盈達(dá)高級(jí)講師 鐘亮直播鏈接:點(diǎn)擊
    發(fā)表于 07-27 17:53

    Android內(nèi)核編譯教程

    標(biāo)準(zhǔn)的Linux開發(fā)流程一樣,Android平臺(tái)開發(fā)的一個(gè)很重要的基礎(chǔ)工作就是對(duì)其內(nèi)核的編譯和移植。本文結(jié)合Android的開發(fā)文檔以及本人的實(shí)踐經(jīng)驗(yàn),簡(jiǎn)單介紹了
    發(fā)表于 06-22 09:11 ?93次下載

    Android平臺(tái)發(fā)展暗埋隱患

    Android平臺(tái)發(fā)展暗埋隱患 2009年Android平臺(tái)迅速成長(zhǎng),但也埋下了諸多隱患。Google移動(dòng)平臺(tái)總監(jiān)Andy Rubin日宣
    發(fā)表于 07-28 07:38 ?331次閱讀

    android平臺(tái)初級(jí)錯(cuò)誤整理

    android平臺(tái)初級(jí)錯(cuò)誤整理
    發(fā)表于 03-19 11:23 ?0次下載

    Android應(yīng)用原型實(shí)踐分析

    實(shí)踐經(jīng)驗(yàn)。 以下為譯文: 我最近更文較少,原因有兩個(gè): Android最近優(yōu)化了很多,沒有太多可抱怨的地方。各家公司都開始了解:理解Android設(shè)計(jì)并進(jìn)行正確的設(shè)計(jì)有多重要。最多就是說說新G+應(yīng)用?這個(gè)是主要原因:之前我一直
    發(fā)表于 10-12 10:55 ?0次下載
    <b class='flag-5'>Android</b>應(yīng)用原型<b class='flag-5'>實(shí)踐</b>分析

    Android平臺(tái)智能云導(dǎo)游系統(tǒng)的探索

    Android平臺(tái)智能云導(dǎo)游系統(tǒng)的探索
    發(fā)表于 10-31 11:16 ?5次下載
    <b class='flag-5'>Android</b><b class='flag-5'>平臺(tái)</b>智能云導(dǎo)游系統(tǒng)的探索

    Android平臺(tái)發(fā)展暗埋隱患

    2009年Android平臺(tái)迅速成長(zhǎng),但也埋下了諸多隱患。Google移動(dòng)平臺(tái)總監(jiān)Andy Rubin日宣布,今年將有8到9家OEM廠商設(shè)計(jì)推出至少18部Android手機(jī)模型。市場(chǎng)的
    發(fā)表于 12-03 15:40 ?300次閱讀

    Microchip Android系統(tǒng)配件開發(fā)平臺(tái)

    Microchip Android系統(tǒng)配件開發(fā)平臺(tái)
    的頭像 發(fā)表于 06-06 13:46 ?3220次閱讀

    強(qiáng)勁的Linux Trace工具 bpftrace for Linux 2018

    本文主要是Brendan Gregg在介紹 bpftrace在2018年的開發(fā)進(jìn)展,以及對(duì)bpftrace的介紹和對(duì)Dtrace的區(qū)別介紹。
    的頭像 發(fā)表于 06-04 15:44 ?1.2w次閱讀
    強(qiáng)勁的Linux Trace工具 <b class='flag-5'>bpftrace</b> for Linux 2018

    Android操作系統(tǒng)移植到嵌入式平臺(tái)的最佳實(shí)踐

      遵循上述嵌入式工程實(shí)踐,您可以確保在嵌入式平臺(tái)上高效成功地移植 Android,并增強(qiáng)現(xiàn)有連接設(shè)備的功能或從頭開始設(shè)計(jì)新系統(tǒng),而無需太多麻煩。
    的頭像 發(fā)表于 07-01 10:20 ?1883次閱讀

    基于ebpf的性能工具-bpftrace

    在前面我已經(jīng)分享了關(guān)于ebpf入門的文章: 基于ubuntu22.04-深入淺出 eBPF 。 這篇文章介紹一個(gè)基于ebpf技術(shù)的強(qiáng)大工具--bpftrace。 在現(xiàn)代計(jì)算機(jī)系統(tǒng)中,了解系統(tǒng)的內(nèi)部
    的頭像 發(fā)表于 09-04 16:02 ?578次閱讀
    基于ebpf的性能工具-<b class='flag-5'>bpftrace</b>