Вы можете попробовать Утилита 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