ebpf 隐藏 Android 任意进程或任意文件实现连载 (一)
一,介绍
本文围绕着 linux 系统 ls 命令,并实现 ebpf 内核命令拦截修改 ls 后最终效果等功能
演示视频被投诉下架,说是涉嫌抄袭,所以写了这么一个文字的内容,来讲解下项目的思想出处,和关键代码的分析,并提供源码给各位。

二、案例设计思路:
1. 分析linux系统下 ls 命令底层调用原理
2. 对 ls 命令内部关键系统调用进行hook拦截
3. 劫持并修改关键系统调用的返回值
三、分析 ls 工具底层实现

下面是对截图中部分信息的解释
四、eBPF关键代码实现原理分析 (sys_enter_getdents64 探测)
ebpf 程序代码实现仅分析内核态程序模块,代码块中将会对关键部分内容进行注释说明,下方程序模块主要目的是获取 getdents64 方法的 dirp 地址为后续工作准备
三步
- 确定发生 getdents64 系统调用的进程是我需要的
- 获取当前目录下所有文件对象的 dirp (可以理解为,目录下每个文件都是一个结构体,当前获取的 dirp 是所有文件的 连续的结构体首地址)
- 将 dirp 地址保存到 maps 中提供给其他程序使用
getdents64 方法原型可在命令行处使用 `man 2 getdents64` 查看 ,我会在劫持数据章节中对他进行深度的分析
五,eBPF关键代码实现原理分析(sys_exit_getdents64 探测)
我们知道在 c 语言开发程序时候是经常使用指针的,也就意味着有时候,当使用 c 语言去获取一些数据时,会提前传入一个空的地址,当数据获取成功后在往这个地址中填充数据,getdents64 方法也是如此,所以这里使用到了探测点 `sys_exit_getdents64`。
以下程序模块将会在 getdents64 方法拿到当前目录下所有文件信息后进行一个处理工作,主要用于遍历出当前目录下所有的文件的 dirp 结构体地址,供后面的程序对这些结构体进行操作,达到隐藏文件的目的。
当前代码块主要工作 是找出我要隐藏的目标文件的地址,找到后停止继续查找,在这个过程中他会不断的对 map_to_patch 进行赋值,而 map_to_patch 结构体中保存的永远是目标文件的上一个文件,这样在发生尾调用时候,被调用的程序将会拿到目标文件的上一个文件结构体的地址,并进行算法处理,更改内存达到隐藏目标的目的
六,下一个章节,将会对隐藏文件的具体实现思路进行详细分析
源码公开提供,需要的联系我
感谢 https://github.com/pathtofile