ebpf入门---监听所有新进程

什么是ebpf

eBPF 全称 extended Berkeley Packet Filter,中文意思是 扩展的伯克利包过滤器。一般来说,要向内核添加新功能,需要修改内核源代码或者编写 内核模块 来实现。而 eBPF 允许程序在不修改内核源代码,或添加额外的内核模块情况下运行

用途

ebpf由于直接与内核交互,所以更为底层,可以用来绕过一些安全组件的监控功能。同时可以做到如你看不见的后门(通过hook read的syscall,篡改返回结果)等等更有意思的场景。个人看来,ebpf在未来会得到更广泛的应用,同时也是以后rootkit的首选

简单使用

今天这个demo是个入门,原理就是hook syscall,判断是否是execve,然后获取对应的pid和执行文件,然后返回并输出

python

整体代码还是很简单的,注释里面也比较详细了

from bcc import BPFbpf_text = """
#include <linux/binfmts.h>
struct data_t {int pid;char comm[TASK_COMM_LEN];char filename[256]; 
};BPF_PERF_OUTPUT(myevents);//注册eventsTRACEPOINT_PROBE(raw_syscalls, sys_enter) {if (args->id != __NR_execve)return 0;struct data_t data = {};data.pid = bpf_get_current_pid_tgid() >> 32;//获取pidbpf_get_current_comm(&data.comm, sizeof(data.comm));//获取当前进程的命令名称bpf_probe_read_user(&data.filename, sizeof(data.filename), (void *)args->args[0]);//用户空间读取execve的第一个参数,通常是要执行的文件路径myevents.perf_submit(args, &data, sizeof(data));// 将data结构体的内容发送到用户空间的events性能事件输出return 0;
}
"""b = BPF(text=bpf_text)#创建了一个BPF对象b,它用于编译和加载前文中定义的eBPF程序def print_event(cpu, data, size):#它是一个回调函数,用于处理从eBPF程序发送到用户空间的事件。函数的参数包括:cpu:捕获事件的CPU编号。,data:一个包含eBPF事件数据的字节流。,size:数据的大小。event = b["myevents"].event(data)#将data字节流转换成一个Python对象,这个对象包含了与eBPF程序中定义的数据结构匹配的字段print("New process created, PID: %d, Command: %s, Path: %s" % (event.pid, event.comm.decode('utf-8', 'replace'), event.filename.decode('utf-8', 'replace')))b["myevents"].open_perf_buffer(print_event)#这行代码将print_event回调函数附加到名为myevents的eBPF性能事件输出上。当myevents输出中有新的事件时,print_event函数将被调用。print("Listening for sys_execve calls... Press Ctrl+C to exit.")
try:while True:b.perf_buffer_poll()#用于轮询性能事件缓冲区,检查是否有任何新的事件到达。如果有,它将调用open_perf_buffer登记的回调函数来处理事件。
except KeyboardInterrupt:pass

运行效果
在这里插入图片描述

go

go代码更为复杂一点,但大体逻辑上类似

package mainimport ("bytes""encoding/binary""fmt""os""os/signal""github.com/iovisor/gobpf/bcc"
)const bpfProgram = `
#include <linux/sched.h>struct data_t {u32 pid;char comm[TASK_COMM_LEN];char filename[256];
};BPF_PERF_OUTPUT(myevents);TRACEPOINT_PROBE(raw_syscalls, sys_enter) {if (args->id != __NR_execve) return 0;struct data_t data = {};data.pid = bpf_get_current_pid_tgid() >> 32;bpf_get_current_comm(&data.comm, sizeof(data.comm));bpf_probe_read_user(&data.filename, sizeof(data.filename), (void *)args->args[0]);myevents.perf_submit(args, &data, sizeof(data));return 0;
}`type execveEvent struct {Pid      uint32Comm     [16]byteFilename [256]byte
}func main() {//创建了一个新的 eBPF 模块,并加载了 eBPF 程序。defer module.Close() 确保在程序结束时清理和关闭 eBPF 模块module := bcc.NewModule(bpfProgram, []string{})defer module.Close()//加载 eBPF 程序中定义的跟踪点tracepoint, err := module.LoadTracepoint("tracepoint__raw_syscalls__sys_enter")if err != nil {fmt.Fprintf(os.Stderr, "Failed to load tracepoint: %s\n", err)os.Exit(1)}//将跟踪点附加到系统调用的入口点err = module.AttachTracepoint("raw_syscalls:sys_enter", tracepoint)if err != nil {fmt.Fprintf(os.Stderr, "Failed to attach tracepoint: %s\n", err)os.Exit(1)}//创建一个新的性能事件表来接收 eBPF 程序发送的事件,并创建一个 Go 通道来接收这些事件table := bcc.NewTable(module.TableId("myevents"), module)channel := make(chan []byte)perfMap, err := bcc.InitPerfMap(table, channel, nil)if err != nil {fmt.Fprintf(os.Stderr, "Failed to init perf map: %s\n", err)os.Exit(1)}go func() {for {data := <-channelvar event execveEventerr := binary.Read(bytes.NewBuffer(data), binary.LittleEndian, &event)if err != nil {fmt.Fprintf(os.Stderr, "Failed to decode received data: %s\n", err)continue}filename := string(bytes.Split(event.Filename[:], []byte("\x00"))[0])fmt.Printf("execve called by PID %d (%s): %s\n", event.Pid, event.Comm, filename)}}()//启动性能事件表来接收事件,并确保在程序结束时停止它perfMap.Start()defer perfMap.Stop()fmt.Println("Waiting for execve events... Press Ctrl-C to exit.")signals := make(chan os.Signal, 1)signal.Notify(signals, os.Interrupt)<-signals
}

效果
在这里插入图片描述

但是这两个都有一个共性的问题,python虽然可以是pyinstaller去编译成可执行文件,但和go编译的结果都是动态链接的,而往往目标机器上可能没有对应的库,所以我们要转化为静态链接,目前这两个demo我尝试了一下是无法变成静态链接的,如果有思路也可以进一步交流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/729685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙App基础

像素单位 .1、基础单位 为开发者提供4种像素单位&#xff0c;框架采用vp为基准数据单位。 PS&#xff1a;个人建议使用lpx&#xff0c;配置好配置文件&#xff0c;这里就可以按照UI设计稿实际的来&#xff0c;可以更好的实现设计效果 名称描述px屏幕物理像素单位vp屏幕密度相…

一拖二快充线独特优势

在现代社会&#xff0c;手机已成为我们生活中不可或缺的一部分。随着科技的不断进步&#xff0c;手机的功能越来越强大&#xff0c;从通讯工具逐渐转变为工作、学习和娱乐的得力助手。然而&#xff0c;手机的电量问题一直是困扰着我们的难题。为了解决这个问题&#xff0c;市场…

3•8向女同胞致敬|营销枢纽SaaS厂商乐通达(ltd.com)正式更名枢纽云

为了向女同胞致敬&#xff0c;我们特地选择3月8日女神节变更公司名称&#xff0c;因为《如果SaaS有性别&#xff0c;那 TA一定是女性 》。 2024年3月8日&#xff0c;“杭州乐通达网络有限公司”名称正式变更为“杭州枢纽云计算有限公司”&#xff08;简称&#xff1a;营销枢纽&…

测试常用的Linux命令

前言 直接操作硬件 将把操作硬件的代码封装成系统调用&#xff0c;供程序员使用 虚拟机软件 可以模拟的具有完整硬件系统的功能 可以在虚拟机上安装不同的操作系统 Linux内核只有一个&#xff0c;发行版有很多种 内核来运行程序和管理像磁盘和打印机等硬件设备的核心程序 终端…

积鼎科技两款国产流体仿真软件入选《上海市工业软件推广目录》!

为落实《上海市促进工业软件高质量发展行动计划(2021-2023年)》&#xff0c;聚焦重点行业和领域痛点问题&#xff0c;提升关键软件技术创新和供给能力&#xff0c;推动工业软件产品应用和产业生态建设更好支撑全市制造业数字化转型&#xff0c;《2023年上海市工业软件推荐目录》…

YOLOv8改进 | 独家创新篇 | 利用DCNv3集合DLKA形成全新的注意力机制(全网独家创新)

一、本文介绍 本文给大家带来的机制是由我独家创新结合Deformable Large Kernel Attention (D-LKA) 注意力机制和DCNv3可变形卷积的全新注意力机制模块(算是二次创新),D-LKA的基本原理是结合了大卷积核和可变形卷积的注意力机制,通过采用大卷积核来模拟类似自我关注的感受…

Linux安全--为Nginx加上PHP解析功能

yum install php-fpm -y安装php进程管理器 找到Nginx安装的路径 编辑Nginx配置文件

数学建模【主成分分析】

一、主成分分析简介 主成分分析&#xff08;Principal Component Analysis&#xff0c;PCA&#xff09;是一种降维算法&#xff0c;它能将多个指标转换为少数几个主成分&#xff0c;这些主成分是原始变量的线性组合&#xff0c;且彼此之间互不相关&#xff0c;其能反映出原始数…

基于springboot的家庭装修报价系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 SpringBoot框架 3 1.2 ECharts 3 1.3 Vue框架 3 1.4 Bootstrap框架 3 1.5 JQuery技术 4 1.6 Ajax技术 4 1.7 本章小结 4 2 系统分析 5 2.1 需求分析 5 2.2 非功能需求 7 2.3 本章小结 8 3 系统设计 9 3.1 系统总体设计 9 …

【能力素质模型建立】某大型国有能源公司能力素质模型项目纪实

【客户评价】 我们之前挑选过很多家做管理咨询的企业&#xff0c;经过多家企业的竞标&#xff0c;我们最终选择了北京华恒智信人力资源顾问有限公司&#xff0c;因为在竞标中我们看到了贵公司的专业性和敬业精神。 在项目合作中&#xff0c;贵公司的多位咨询老师也表现出了高…

LeetCode100 刷题记录

文章目录 矩阵相关1. 旋转矩阵2. 搜索二维矩阵 矩阵相关 1. 旋转矩阵 题目描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵…

【C++杂货铺】详解string

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 为什么学习string &#x1f4c1; 认识string&#xff08;了解&#xff09; &#x1f4c1; string的常用接口 &#x1f4c2; 构造函数 &#x1f4c2; string类对象的容量操作 &#x1f4c2; string类对象的访问以及遍历操…

js判断页面是否是在iframe里面

文章目录 一、前言1.1、_blank跳转1.2、_self跳转 二、方法2.1、判断子项目是否是在iframe内部2.2、实现_self跳转 三、最后 一、前言 上面是父前端项目里的iframe加载了子前端项目的页面。此时如果点击子项目的内容&#xff0c;如果要进行父项目浏览器页面跳转&#xff0c;可以…

C++初阶 类(上)

目录 1. 什么是类 2. 如何定义出一个类 3. 类的访问限定符 4. 类的作用域 5. 类的实例化 6. 类的大小 7. this指针 1.this指针的引出 2. this指针的特性 8. 面试题 1. 什么是类 在C语言中&#xff0c;不同类型的数据集合体是结构体。为了方便管理结构体&#xff0c;我…

HarmonyOS NEXT应用开发案例——自定义TabBar

介绍 本示例主要介绍了TabBar中间页面如何实现有一圈圆弧外轮廓以及TabBar页签被点击之后会改变图标显示&#xff0c;并有一小段动画效果。 效果图预览 使用说明&#xff1a; 依次点击tabBar页面&#xff0c;除了社区图标之外&#xff0c;其它图标往上移动一小段距离。 实现…

中霖教育:消防工程师报考条件汇总

消防工程师考试报名条件汇总&#xff0c;想要参加考试的考生可以根据自己的专业和学历判断自己是否符合条件。 1、大专学历&#xff0c;消防工程专业&#xff0c;工作年限满6年&#xff0c;从事消防安全技术工作满4年;消防工程相关专业&#xff0c;工作年限满7年&#xff0c;从…

浅谈字典攻击

一、前言 字典攻击是一种常见的密码破解方法&#xff0c;它使用预先编制的字典文件作为攻击字典&#xff0c;通过尝试猜测密码的方式来破解密码。下面是一个关于字典攻击的博客&#xff0c;希望能够为您了解字典攻击提供帮助。 二、字典攻击概述 字典攻击是一种密码破解方法&…

文献学习-14-一种用于高精度微创手术的纤维机器人

Authors: Mohamed E. M. K. Abdelaziz1,2 †, Jinshi Zhao1,3 †, Bruno Gil Rosa1,2 , Hyun-Taek Lee4 , Daniel Simon3,5 , Khushi Vyas1,2 , Bing Li6,7 , Hanifa Koguna3 , Yue Li1 , Ali Anil Demircali3 , Huseyin Uvet8 , Gulsum Gencoglan9,10, Arzu Akcay11,12, Moham…

CDR(CorelDRAW)2024最新汉化注册补丁包下载

CorelDRAW 2024是一款功能强大的平面设计软件&#xff0c;广泛应用于图形设计、编辑照片以及创建网站等领域。凭借对高级操作系统的支持、多监视器查看和4K显示屏的兼容性&#xff0c;它让初始用户、图形专家、小型企业主和设计爱好者都能自信快速地交付专业级结果。 CorelDRA…

一文教你搞懂Vue生命周期

Vue生命周期 生命周期示意图 Vue3 组件创建阶段 new vue new一个vue的实例对象&#xff1b;此时会进入组件的创建过程&#xff08;该组件在代码中被注册并使用时&#xff0c;就代表着其被new了一个新的实例对象&#xff09;。 Init Events & Lifecycle 初始化组件的事件和…