2010-04-26 150 views
0

如何在Linux系统中钩住文件保存(以显示我的程序对话框,然后与它们一起运行)?在Linux中保存钩子文件

+0

什么样的程序是你想修改? Linux不是Windows,不只有一种程序保存你可以“挂钩”的文件。 – bmargulies 2010-04-26 00:20:45

+0

我很想制作一个程序,它可以将每一个保存在PC上的文件(如图像,音乐,文档或其他东西)挂钩,并强制用户标记它们,最终获得真正的好用和有用的标签收藏。像这样的东西) – peaceprayer 2010-04-27 20:35:22

回答

0

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

有一种做股票的方式。

如果你不能编译它,这个工程的大部分时间:

写入功能_open_posthook,做系统调用(NR_OPEN,...)

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

用LD_PRELOAD加载这个库。

编辑:如果你尝试的安全性,这将无法正常工作。你可能会使用strace(),但除非你非常小心,一个坚定的程序员也可以克服这一点。

+0

如果程序确实没有开始使用GUI,这将不会帮助他或她“弹出对话框”。 – bmargulies 2010-04-26 01:05:59

+0

您可以使用某个IPC将消息发送给帮助程序,然后可以显示对话。虽然这很丑陋。我认为这就是Windows访问AV扫描仪通常所做的。使用LD_PRELOAD钩子是不安全的,因为充分确定的应用程序(或者确实是静态链接的)可以绕过它。 – MarkR 2010-04-26 12:40:47

1

您可以尝试FILE_PRELOAD utility,它们会生成带钩子的C++代码,编译和LD_PRELOAD它。在简短的看了一下之后,你可以感觉到如何轻松地挂接linux。起点是this tutorial

例如,如果你想改变文件/ tmp的“公开征集” /一些带有的/ tmp/replace_with:

#: 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 

在另外的所有generated.cpp文件,你可以找到在/ tmp/$ USER/FILE_PRELOAD/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 
+1

为什么要使用疯狂的定义?......其实,为什么地图,C++,cstr-string转换和其他一切呢? :) – viraptor 2013-06-07 16:39:44

+0

)疯狂的定义,因为我喜欢短文,像[这里](http://nsl.com/papers/origins.htm)。其他с++的东西,因为它有点容易写和理解(我希望)。 – 2013-06-10 05:36:50

相关问题