在Linux中保存Hook文件

时间:2010-04-26 00:18:44

标签: linux

如何在Linux系统中挂起文件保存(显示我的程序对话框,然后用它们进行操作)?

3 个答案:

答案 0 :(得分:3)

只需使用inotify接口即可获取文件系统更改的通知。请参阅:http://linux.die.net/man/7/inotify

答案 1 :(得分:1)

您可以尝试使用钩子生成C ++代码的FILE_PRELOAD utility,编译和LD_PRELOAD。简单看一下就可以感觉到linux的挂钩有多容易。起点是this tutorial

例如,如果你想用/ tmp / replace_with更改文件/ tmp / some的'open call':

#: FILE_PRELOAD -C "A+f:/tmp/some:/tmp/replace_with" -- bash
#: echo "HaHa" >> /tmp/some
#: ll /tmp/some
  ls: cannot access /tmp/some: No such file or directory
#: cat /tmp/replace_with 
  HaHa

如果您想查看生成代码的来源,只需在选项中添加“-p”。

#: FILE_PRELOAD -p -C "A+f:/tmp/some:/tmp/replace_with" -- bash

您可以在/ tmp / $ USER / FILE_PRELOAD / cpp中找到所有generated.cpp文件。

与linux钩子玩得很好)

生成的代码如下所示:

#include <sys/types.h>
#include <dlfcn.h>
#include <stdio.h>
#include <map>
#include <string>

#define I int
#define C char
#define S string
#define P printf
#define R return

using std::map;
using std::string;
typedef map<S,S> MAP;

static I (*old_open)(const C *p, I flags, mode_t mode);

extern "C" 
I open (const C *p, I flags, mode_t mode){
  old_open = dlsym(RTLD_NEXT, "open");
  P("open hook\n");

  MAP files;
  files[p]=p;
  files["/tmp/some"]="/tmp/replace_with";

  S newpath = files[S(p)]; 

  R old_open(newpath.c_str(), flags, mode);
}

# &compile
gcc -w -fpermissive -fPIC -c -Wall file.cpp
gcc -shared file.o -ldl -lstdc++ -o wrap_loadfile.so
LD_PRELOAD=./wrap_loadfile.so bash

nm -D /lib/libc.so.6 | grep open # we hook this syscall

答案 2 :(得分:0)

如果您可以编译它们,您可以首先链接提供open()的自定义库。

有一种做法的方式。

如果你无法编译它,这大部分时间都有效:

执行系统调用(NR_OPEN,...)

的函数_open_posthook

提供提供新打开的共享库libopenhook。 Rembember你在这里重命名为_open_posthook(),除非你想要递归。别忘了也提供creat()。

使用LD_PRELOAD加载此库。

编辑:如果您正在尝试安全性,这将无效。你可能能够使用strace(),但除非你非常小心,否则一个坚定的程序员也可以克服它。