2010-04-26 74 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

相關問題