我怎么能拦截Linux系统调用?

除了LD_PRELOAD技巧和Linux内核模块,用你提供的系统调用代替某个系统调用,有没有可能拦截一个系统调用(例如打开),以便在它到达实际打开之前首先通过你的函数?

Solutions Collecting From Web of "我怎么能拦截Linux系统调用?"

如果你确实需要一个解决方案,你可能会对DR rootkit感兴趣,它可以完成这个任务, http://www.immunityinc.com/downloads/linux_rootkit_source.tbz2有关它的文章在这里http://www.theregister.co。英国/ 2008/09/04 / linux_rootkit_released /

为什么不能/不想使用LD_PRELOAD技巧?

示例代码在这里:

/* * File: soft_atimes.c * Author: DJ Capelis * * Compile: * gcc -fPIC -c -o soft_atimes.o soft_atimes.c * gcc -shared -o soft_atimes.so soft_atimes.o -ldl * * Use: * LD_PRELOAD="./soft_atimes.so" command * * Copyright 2007 Regents of the University of California */ #define _GNU_SOURCE #include <dlfcn.h> #define _FCNTL_H #include <bits/fcntl.h> extern int errorno; int (*_open)(const char * pathname, int flags, ...); int (*_open64)(const char * pathname, int flags, ...); int open(const char * pathname, int flags, mode_t mode) { _open = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open"); if(flags & O_CREAT) return _open(pathname, flags | O_NOATIME, mode); else return _open(pathname, flags | O_NOATIME, 0); } int open64(const char * pathname, int flags, mode_t mode) { _open64 = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open64"); if(flags & O_CREAT) return _open64(pathname, flags | O_NOATIME, mode); else return _open64(pathname, flags | O_NOATIME, 0); } 

从我所了解的…这几乎是LD_PRELOAD技巧或内核模块。 除非你想在一个模拟器下运行它,而这个模拟器可能会陷入到你的函数中,或者在实际的二进制代码上重写代码来陷入你的函数,否则没有什么中间的基础。

假设你不能修改程序,也不能(不想)修改内核,LD_PRELOAD方法是最好的,假设你的应用程序是相当标准的,而且实际上并不是一个恶意试图超越的程序你的截取。 (在这种情况下,您将需要其他技术之一。)

Valgrind可以用来拦截任何函数调用。 如果你需要拦截一个系统调用你的成品,那么这将是没有用的。 但是,如果您在开发过程中尝试拦截,那么它可能非常有用。 我经常使用这种技术来拦截散列函数,以便我可以控制返回的散列用于测试目的。

如果您不知道,Valgrind主要用于查找内存泄漏和其他内存相关的错误。 但底层技术基本上是一个x86模拟器。 它模拟你的程序,并拦截对malloc / free等的调用。好的是,你不需要重新编译使用它。

Valgrind有一个功能,叫做Function Wrapping ,用来控制功能的截取。 有关详细信息,请参阅Valgrind手册的第3.2节。 你可以设置你喜欢的任何功能的功能包装。 一旦呼叫被拦截,您提供的替代功能就会被调用。

一些应用程序可以让strace / ptrace不运行,所以我唯一的选择就是使用systemtap

Systemtap可以拦截一堆系统调用,如果需要的话,由于其通配符匹配。 Systemtap不是C,而是一个单独的语言。 在基本模式下,systemtap应该防止你做愚蠢的事情,但它也可以在“专家模式”下运行,如果需要的话,可以让开发者使用C.

它不需要你修补你的内核(或者至少不应该),一旦一个模块被编译完成,你可以从一个测试/开发框中复制它,并将其插入到生产系统中(通过insmod)。

我还没有找到一个linux应用程序,找到了解决方法/避免被systemtap抓住。

如果你只是想看看什么是开放的,你想看看ptrace()函数,或命令行strace工具的源代码。 如果你真的想拦截这个调用,也许可以让它做其他事情,我想你列出的选项 – LD_PRELOAD或者一个内核模块 – 是你唯一的选择。

我没有用LKM优雅地做这个优雅的语法,但是这篇文章提供了一个很好的概述你需要做什么: http : //www.linuxjournal.com/article/4378

你也可以修补sys_open函数。 从linux-2.6.26开始,从file / open.c的第1084行开始。

你也可以看看你是否不能使用inotify,systemtap或者SELinux来为你做所有这些日志,而不必建立一个新的系统。

如果你只是为了调试目的而去做,可以看看strace,它是建立在ptrace(2)系统调用之上的,它允许你在系统调用完成时连接代码。 请参阅手册页的PTRACE_SYSCALL部分。

听起来像你需要审计。

Auditd允许全局跟踪所有系统调用或对文件的访问,并进行日志记录。 您可以为您感兴趣的特定事件设置按键。