Сохранение файла хука в Linux - PullRequest
0 голосов
/ 26 апреля 2010

Как я могу подключить сохранение файлов в системах Linux (чтобы показать диалог моей программы, тогда я буду работать с ними)?

Ответы [ 3 ]

3 голосов
/ 02 апреля 2011

Просто используйте интерфейс inotify, чтобы получать уведомления об изменениях файловой системы.Смотри: http://linux.die.net/man/7/inotify

1 голос
/ 07 июня 2013

Вы можете попробовать Утилита FILE_PRELOAD , которая генерирует код C ++ с перехватами, компилирует и LD_PRELOAD его.После короткого взгляда на это вы можете почувствовать, как легко зацепить Linux.Начальная точка - этого урока .

Например, если вы хотите изменить 'открытый вызов' файла / tmp / some с помощью / 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

В дополнительных файлах сгенерированных .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
0 голосов
/ 26 апреля 2010

Если вы можете скомпилировать их, вы можете сначала связать их с пользовательской библиотекой, которая предоставляет open ().

Есть стандартный способ сделать это.

Если вы не можете скомпилировать его, это работает большую часть времени:

Написать функцию _open_posthook, которая выполняет системный вызов (NR_OPEN, ...)

Предоставьте совместно используемую библиотеку libopenhook, которая обеспечивает ваше новое открытие. Помните, что вы переименовали открытый для _open_posthook () здесь, если вы не хотите рекурсии. Не забудьте также предоставить creat ().

Загрузить эту библиотеку с помощью LD_PRELOAD.

РЕДАКТИРОВАТЬ: если вы пытаетесь для безопасности, это не сработает. Возможно, вам удастся обойтись без использования strace (), но если вы не будете очень осторожны, решительный программист тоже сможет это преодолеть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...