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,一经查实,立即删除!

相关文章

私域流量怎样运营?建议你使用“5步推进法”!

私域“五步推进法”是一种确保客户添加上线工作有效进行的策略。 第一步&#xff0c;树标杆。我们需要在企业内部筛选出客户添加数量较多的区域和员工&#xff0c;将其塑造为榜样&#xff0c;并发挥其示范作用。如果企业在全国范围内拥有多家门店&#xff0c;可从不同的省份或…

鸿蒙App基础

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

一拖二快充线独特优势

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

在Linux/Ubuntu/Debian上将富文本Markdown (`.md`) 文件转换为HTML

你可以使用Pandoc将 Markdown (.md) 文件转换为 HTML。如果你没有安装 Pandoc&#xff0c;可以使用以下步骤安装&#xff1a; 打开终端。 运行以下命令安装 Pandoc&#xff1a; sudo apt-get update sudo apt-get install pandoc安装 Pandoc 后&#xff0c;你可以使用它将 Mar…

Lua调用c++函数的两种办法

使用Lua5.1.5进行的操作 方法一: lua调用应用程序中的函数 lua脚本,调用应用程序中的计算平均值的函数 script.lua number,sum,avg = average(10,20,30,40,50); print("The number is ", number

LLDB-调试

远程调试Android Device Android端启动lldb server 在此之前将lldb server push到设备&#xff0c;如/data/loca/tmp lldb-server platform \ --server --listen unix-abstract:///data/local/tmp/debug.sock后台运行&#xff1a; lldb-server platform \ --server --listen …

【树】-Lc617-合并二叉树(同时递归2棵树)

写在前面 最近想复习一下数据结构与算法相关的内容&#xff0c;找一些题来做一做。如有更好思路&#xff0c;欢迎指正。 目录 写在前面一、场景描述二、具体步骤1.环境说明2.代码 写在后面 一、场景描述 合并二叉树。将它们中的一个覆盖到另一个上时&#xff0c;两个二叉树的一…

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

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

Vue教学18:Element UI进阶组件探索,提升Vue应用的专业性

大家好,欢迎回到我们的Vue教学系列博客!在前十七篇博客中,我们学习了Vue.js的基础知识、安装Node.js与npm、使用Vue Devtools进行调试、Vue实例与生命周期钩子、数据绑定(单向与双向)、计算属性与侦听器、条件渲染和列表渲染、事件处理、组件之间的传值(props和$emit)、…

测试常用的Linux命令

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

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

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

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

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

ERP物资采购策略解决方案

ERP物资采购策略解决方案 企业在不断探索物资采购的最优管理模式中&#xff0c;针对采购性质、对象、价值等方面&#xff0c;其使用的策略是不同的。如何最大限度地满足企业的各种需要是对ERP软件适应性提出的挑战。 一、 物资采购的对象 首先我们要明确企业物…

Python中排序函数sorted的用法

Python中排序函数sorted的用法 列表对象提供了sort()方法支持原地排序&#xff0c;而内置函数sorted()返回新列表&#xff0c;并不对原列表进行任何修改。 sorted()方法可以对列表、元组、字典、range对象等进行排序。 列表的sort()方法和内置函数sorted()都支持key参数实现复…

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

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

数学建模【主成分分析】

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

【element-ui】el-table表格高亮选中

highlight-current-row 是否要高亮当前行 <el-tableref"singleTable"highlight-current-rowcurrent-change"handleCurrentChange"></el-table>修改高亮行的颜色 .current-row {background-color: pink; }由current-change事件来管理选中时触发…

基于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;贵公司的多位咨询老师也表现出了高…

快速使用transformers的pipeline实现各种深度学习任务

目录 引言 安装 情感分析 文本生成 文本摘要 图片分类 实例分割 目标检测 音频分类 自动语音识别 视觉问答 文档问题回答 图文描述 引言 在这篇中文博客中,我们将深入探讨使用transformers库中的pipeline()函数,它为预训练模型提供了一个简单且快速的推理方法。…