首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我怎么能拦截linux sys调用?

拦截 Linux 系统调用的方法有很多种,其中最常用的是使用 LD_PRELOAD 技术。LD_PRELOAD 是一种环境变量,可以在程序运行时动态链接指定的共享库,从而实现对系统调用的拦截和替换。

以下是一个简单的示例,演示如何使用 LD_PRELOAD 技术拦截 open 系统调用:

  1. 创建一个名为 myopen.c 的文件,其中包含以下代码:
代码语言:c
复制
#include<stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

int open(const char *pathname, int flags, mode_t mode) {
    printf("Intercepted open syscall: pathname=%s, flags=%d, mode=%d\n", pathname, flags, mode);
    return syscall(SYS_open, pathname, flags, mode);
}
  1. 编译 myopen.c 文件,生成一个名为 libmyopen.so 的共享库:
代码语言:bash
复制
gcc -shared -fPIC myopen.c -o libmyopen.so
  1. 在程序运行时设置 LD_PRELOAD 环境变量,以便动态链接 libmyopen.so 文件:
代码语言:bash
复制
LD_PRELOAD=./libmyopen.so ./your_program

在这个示例中,当程序调用 open 系统调用时,LD_PRELOAD 会将 libmyopen.so 文件动态链接到程序中,从而拦截 open 系统调用并输出相关信息。

需要注意的是,LD_PRELOAD 技术只能拦截用户空间的系统调用,无法拦截内核空间的系统调用。此外,LD_PRELOAD 技术也存在一些限制,例如无法拦截直接使用 syscall 函数的程序,也无法拦截使用动态链接的程序等。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Linux 内核 内存管理】mmap 系统调用源码分析 ② ( sys_mmap_pgoff 系统调用函数执行流程 | sys_mmap_pgoff 函数源码 )

    文章目录 一、sys_mmap_pgoff 系统调用函数执行流程 二、sys_mmap_pgoff 系统调用函数源码 调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的..." 整数倍 " , 如果偏移是内存页大小的整数倍 , 则调用 sys_mmap_pgoff 函数 , 继续向下执行 ; 一、sys_mmap_pgoff 系统调用函数执行流程 ---- 在 sys_mmap_pgoff...vm_mmap_pgoff 函数 , 继续向后执行 ; 二、sys_mmap_pgoff 系统调用函数源码 ---- 该 sys_mmap_pgoff 系统调用函数源码 , 定义在 Linux 内核源码的...linux-4.12\mm\mmap.c#1475 位置 ; sys_mmap_pgoff 函数源码如下 : SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr...vm_mmap_pgoff(file, addr, len, prot, flags, pgoff); out_fput: if (file) fput(file); return retval; } 源码路径 : linux

    1.2K20

    如何增强Linux内核中的访问控制安全 | 洞见

    ---- Linux中常见的拦截过滤 本文着重介绍Linux平台上常见的拦截: 用户态动态库拦截。 内核态系统调用拦截。 堆栈式文件系统拦截。 inline hook拦截。...---- Linux系统调用劫持 最近发现在4.4.0的内核中有513多个系统调用(很多都没用过),系统调用劫持的目的是改变系统中原有的系统调用,用我们自己的程序替换原有的系统调用。...Linux内核中所有的系统调用都是放在一个叫做sys_call_table的内核数组中,数组的值就表示这个系统调用服务程序的入口地址。整个系统调用的流程如下: ?...以下是实现的一个最简单的堆栈式文件系统,实现了最简单的打开、读写文件,麻雀虽小但五脏俱全。...---- 总结 篇幅有限,本文只是介绍了Linux上的拦截技术,后续有机会可以一起探讨windows和macOS上的拦截技术。

    2.4K10

    增强Linux内核中访问控制安全的方法

    Linux中常见的拦截过滤 本文着重介绍Linux平台上常见的拦截: 用户态动态库拦截。 内核态系统调用拦截。 堆栈式文件系统拦截。 inline hook拦截。...Linux系统调用劫持 最近发现在4.4.0的内核中有513多个系统调用(很多都没用过),系统调用劫持的目的是改变系统中原有的系统调用,用我们自己的程序替换原有的系统调用。...Linux内核中所有的系统调用都是放在一个叫做sys_ call _table的内核数组中,数组的值就表示这个系统调用服务程序的入口地址。整个系统调用的流程如下: ?...以下是实现的一个最简单的堆栈式文件系统,实现了最简单的打开、读写文件,麻雀虽小但五脏俱全。...总结 篇幅有限,本文只是介绍了Linux上的拦截技术,后续有机会可以一起探讨windows和macOS上的拦截技术。

    1.6K41

    手把手教你|拦截系统调用

    Linux 系统中,系统调用一般使用 int 0x80 指令(x86)或者 syscall 指令(x64)来调用。...二、系统调用原理 在 Linux 内核中,使用 sys_call_table 数组来保存所有系统调用sys_call_table 数组每一个元素代表着一个系统调用的入口,其定义如下: typedef...上面的代码会根据 eax 寄存器中的值来调用正确的系统调用,其过程如下图所示: 三、系统调用拦截 了解了系统调用的原理后,要拦截系统调用就很简单了。那么如何拦截呢?...比如,我们想要拦截 write() 系统调用,那么只需要将 sys_call_table 数组的第一个元素换成我们编写好的函数(因为 write() 系统调用sys_call_table 数组的索引为...这说明拦截系统调用成功了。

    1.8K10

    内核地址空间大冒险:系统调用

    1 开启冒险之旅 是一个线程,出生在这个Linux帝国,今天的任务是去执行一段人类用C语言编写的代码。...注意到墙的最上面还有一块招牌,上面写着:sys_call_table。 ? “年轻人,这是系统调用表,来,把你的编号给我”,老头转过身来。...一看,上面写着: sys_open: 0x7ffe10002030 “老先生,看来你对这里很熟嘛,还没看都知道是要去sys_open”。...3 系统调用 “系统调用?什么意思?”,第一次听到这几个字。 “你现在来到我们这里办事,这就叫系统调用啊!”。 “还是不太明白,还请老先生赐教”。 “好吧,年轻人好学,老朽就给你说道说道。...“唉,此言差矣,这些个函数的地址都是机密,怎么能随便透露给你们上面的应用程序呢。而且,为了安全,这些地址会随着帝国每次启动变化的,不是一个固定的地址,所以还是要用编号来查哦!”

    68410

    利用 ebpf sockmapredirection 提升 socket 性能(2020)

    作用: 一段 BPF 程序监听所有的内核 socket 事件,并将新建的 socket 记录到这个 map; 另一段 BPF 程序拦截所有 sendmsg 系统调用,然后去 map 里查找 socket...基于这个 sockmap,编写两段 BPF 程序分别完成以下功能: 程序一:拦截所有 TCP connection 事件,然后将 socket 信息存储到这个 map; 程序二:拦截所有 sendmsg...BPF 程序二:拦截 sendmsg 系统调用,socket 重定向 第二段 BPF 程序的功能: 拦截所有的 sendmsg 系统调用,从消息中提取 key; 根据 key 查询 sockmap,找到这个...拦截 sendmsg 系统调用 __section("sk_msg") // 加载目标文件(ELF )中的 `sk_msg` section,`sendmsg` 系统调用时触发执行 int bpf_redir....8.html [8] linux/bpf.h: https://github.com/torvalds/linux/blob/master/include/uapi/linux/bpf.h [9] tools

    3K11

    内核地址空间大冒险:系统调用

    1开启冒险之旅 是一个线程,出生在这个Linux帝国,今天的任务是去执行一段人类用C语言编写的代码。...注意到墙的最上面还有一块招牌,上面写着:sys_call_table。 ? “年轻人,这是系统调用表,来,把你的编号给我”,老头转过身来。...一看,上面写着: sys_open: 0x7ffe10002030 “老先生,看来你对这里很熟嘛,还没看都知道是要去sys_open”。...3 系统调用 “系统调用?什么意思?”,第一次听到这几个字。 “你现在来到我们这里办事,这就叫系统调用啊!”。 “还是不太明白,还请老先生赐教”。 “好吧,年轻人好学,老朽就给你说道说道。...“唉,此言差矣,这些个函数的地址都是机密,怎么能随便透露给你们上面的应用程序呢。而且,为了安全,这些地址会随着帝国每次启动变化的,不是一个固定的地址,所以还是要用编号来查哦!”

    62710

    一文看懂eBPF|eBPF的简单使用

    eBPF(extended Berkeley Packet Filter) 可谓 Linux 社区的新宠,很多大公司都开始投身于 eBPF 技术,如 Goole、Facebook、Twitter 等。...调用 bpf() 系统调用把 eBPF 字节码加载到内核。 内核态 当用户调用 bpf() 系统调用把 eBPF 字节码加载到内核时,内核先会对 eBPF 字节码进行安全验证。...拦截器:拦截器其实是一段 Java 代码,用于拦截切点在执行前(或执行后),先运行这段 Java 代码。 eBPF 程序就像 AOP 中的拦截器,而内核的某个运行路径就像 AOP 中的切点。...BCC 工具安装 在 Ubuntu 系统中安装 BCC 工具是比较简单的,可以使用以下命令: $ sudo apt-get install bpfcc-tools linux-headers-$(uname...将 eBPF 程序挂载到内核探针(简称 kprobe),其中 do_sys_openat2() 是系统调用 openat() 在内核中的实现。

    2.2K20

    Kernel Exception 问题分析详解

    2.Panic – 困惑,恐慌,它表示Linux kernel遇到了一个不知道该怎么继续的情况。内核行为表现为通知感兴趣模块,死机或者重启。...对linux kernel来讲,目前配置为39bit的kernel空间。..._exp_detail.txt:详细异常信息 SYS_ANDROID_LOG:android main log SYS_KERNEL_LOG:kernel log SYS_LAST_KMSG:上次重启前的...2.软件异常捕获 在kernel代码里,一般会通过BUG(),BUG_ON(),panic()来拦截超出预期的行为,这是软件主动回报异常的功能。 在内核调用可以用来方便标记bug,提供断言并输出信息。...为了避免异常嵌套,在发生第2次异常时,我们就拦截下来,我们在3个地方用于拦截nested panic: do_PrefetchAbort() do_DataAbort() do_undefinstr()

    2.2K20

    白话容器基础(二):隔离与限制

    在上一篇文章中,详细介绍了 Linux 容器中用来实现“隔离”的技术手段:Namespace。...此外,用户应用运行在虚拟机里面,它 对宿主机操作系统的调用就不可避免地要经过虚拟化软件的拦截和处理,这本身又是一层性能损耗,尤其对计算资源、网络和磁盘 I/O 的损耗非常大。...何况,默认情况下,谁也不知道到底该开启哪些系统调用,禁止哪些系统调用。 所以,在生产环境中,没有人敢把运行在物理机上的 Linux 容器直接暴露到公网上。...可以看到,在 /sys/fs/cgroup 下面有很多诸如 cpuset、cpu、 memory 这样的子目录,也叫子系统。这些都是这台机器当前可以被 Cgroups 进行限制的资源种 类。...总结 在这篇文章中,首先介绍了容器使用 Linux Namespace 作为隔离手段的优势和劣势,对比了 Linux 容器跟虚拟机技术的不同,进一步明确了“容器只是一种特殊 的进程”这个结论。

    46320

    内核级防篡改

    基于Linux Kernel 3.10、4.18,通过register_kprobe方法注册kallsyms_lookup_name探针,检测系统环境是否可以获取sys_call_table,如果可以,...0:-1; } 调用: if(get_kallsyms_lookup_name() < 0){ printk(KERN_ERR "%s %s failed, load my lkm faild...(见/usr/include/asm*/unistd.h) 其对应操作的底层函数(函数名一般为sys_+操作名,如sys_unlinkat)以及具体参数可以参考linux/syscalls.h: 系统函数操作实现...规则匹配函数 定义规则匹配函数,用于加载遍历规则,并匹配与当前目录进程是否符合拦截条件。.../index.html", 不管文件如何绕过,落实到底部还是会被自动解析出磁盘inode位置,也可以说是文件ID(这里的理解还不够透彻),文件ID可以使用d_path获取到绝对目录,即"/www/wwwroot

    1.9K20

    一个整数+1,攻破了Linux内核!

    本故事根据Linux内核真实漏洞改编 帝国危机 夜幕降临,喧嚣褪去,繁忙的Linux帝国渐渐平静了下来,谁也没有想到,一场危机正在悄然而至...... “咚咚!”...“不对,在他进来之前,一个用户空间的程序怎么能改IDT的内容呢?他没权限访问才对,你是不是看错了?”...“没有看错,他改的是时候,还特地留意了一下他的调用堆栈,不是在用户空间,是从内核空间的函数——perf_swevent_init方向来的”,老头说到。...不过它操作的是perf_swevent_enabled数组,跟IDT八杆子打不到一块儿去,怎么能修改到IDT呢?”,助理摸了摸头,往后退了两步,瞧着是没看出什么问题。 “不见得!”...“比如记录中断和异常的处理函数的IDT,又比如记录系统调用sys_call_table,这些表中的函数地址都位于帝国内核空间,要是这个加1,加的不是别人,而是这些表中的函数地址,那可就麻烦了。”

    38420
    领券