0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Android平台bpftrace实践

哆啦安全 来源:哆啦安全 2023-04-27 15:16 次阅读

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的第一个例子试试

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

bpftrace开跑:

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

bpf map用来统计:

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

bpftrace的开发文档
https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md

简单实践over

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3927

    浏览量

    127168
  • 封装
    +关注

    关注

    126

    文章

    7799

    浏览量

    142752
  • 参数
    +关注

    关注

    11

    文章

    1792

    浏览量

    32111

原文标题:Android平台bpftrace实践

文章出处:【微信号:哆啦安全,微信公众号:哆啦安全】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

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

    这篇文章介绍一个基于ebpf技术的强大工具--bpftrace
    发表于 09-01 15:10 1855次阅读
    Linux跟踪工具<b class='flag-5'>bpftrace</b>的原理和使用

    基于ebpf的性能工具-bpftrace脚本语法

    bpftrace 通过高度抽象的封装来使用 eBPF,大多数功能只需要寥寥几笔就可以运行起来,可以很快让我们搞清楚 eBPF 是什么样的,而暂时不关心 eBPF 复杂的内部机理。由于
    的头像 发表于 09-04 16:04 960次阅读
    基于ebpf的性能工具-<b class='flag-5'>bpftrace</b>脚本语法

    4412开发板Android教程——Android平台简介

    经验丰富的工程师可以参与到Android开发Android平台体系结构 Android平台体系结构Linux Kernel显卡、摄像头 、蓝
    发表于 10-20 11:43

    基于android平台的耳机驱动

    工作以后接手的第一个驱动就是android平台下耳机的插拔检测和按键检测。这部分涉及的硬件知识比较简单,但是软件上对中断的处理,软件检测的鲁棒性,都有比较高的要求,涉及到驱动开发中经常使用的中断申请,工作队列,tasklet,竟态和同步,linux input子系统,
    发表于 05-20 10:39

    初级小白实战资料,零基础入门rk3399平台下linux4.4+android8.1开发

    直播时间:7月30日(本周五)19:30直播主题:一起玩安卓刷机与Linux设备驱动(基于RK3399平台下Linux4.4+Android8.1开发)直播讲师:信盈达高级讲师 钟亮直播链接:点击
    发表于 07-27 17:53

    Android内核编译教程

    标准的Linux开发流程一样,Android平台开发的一个很重要的基础工作就是对其内核的编译和移植。本文结合Android的开发文档以及本人的实践经验,简单介绍了
    发表于 06-22 09:11 93次下载

    Android平台发展暗埋隐患

    Android平台发展暗埋隐患 2009年Android平台迅速成长,但也埋下了诸多隐患。Google移动平台总监Andy Rubin日宣
    发表于 07-28 07:38 341次阅读

    android平台初级错误整理

    android平台初级错误整理
    发表于 03-19 11:23 0次下载

    Android应用原型实践分析

    实践经验。 以下为译文: 我最近更文较少,原因有两个: Android最近优化了很多,没有太多可抱怨的地方。各家公司都开始了解:理解Android设计并进行正确的设计有多重要。最多就是说说新G+应用?这个是主要原因:之前我一直
    发表于 10-12 10:55 0次下载
    <b class='flag-5'>Android</b>应用原型<b class='flag-5'>实践</b>分析

    Android平台智能云导游系统的探索

    Android平台智能云导游系统的探索
    发表于 10-31 11:16 5次下载
    <b class='flag-5'>Android</b><b class='flag-5'>平台</b>智能云导游系统的探索

    Android平台发展暗埋隐患

    2009年Android平台迅速成长,但也埋下了诸多隐患。Google移动平台总监Andy Rubin日宣布,今年将有8到9家OEM厂商设计推出至少18部Android手机模型。市场的
    发表于 12-03 15:40 324次阅读

    Microchip Android系统配件开发平台

    Microchip Android系统配件开发平台
    的头像 发表于 06-06 13:46 3287次阅读

    强劲的Linux Trace工具 bpftrace for Linux 2018

    本文主要是Brendan Gregg在介绍 bpftrace在2018年的开发进展,以及对bpftrace的介绍和对Dtrace的区别介绍。
    的头像 发表于 06-04 15:44 1.2w次阅读
    强劲的Linux Trace工具 <b class='flag-5'>bpftrace</b> for Linux 2018

    Android操作系统移植到嵌入式平台的最佳实践

      遵循上述嵌入式工程实践,您可以确保在嵌入式平台上高效成功地移植 Android,并增强现有连接设备的功能或从头开始设计新系统,而无需太多麻烦。
    的头像 发表于 07-01 10:20 1967次阅读

    基于ebpf的性能工具-bpftrace

    在前面我已经分享了关于ebpf入门的文章: 基于ubuntu22.04-深入浅出 eBPF 。 这篇文章介绍一个基于ebpf技术的强大工具--bpftrace。 在现代计算机系统中,了解系统的内部
    的头像 发表于 09-04 16:02 645次阅读
    基于ebpf的性能工具-<b class='flag-5'>bpftrace</b>