ठीक है, अगर आप सचमुच इसे हासिल करना चाहते हैं , तो आप LD_PRELOAD हुक का उपयोग कर सकते हैं । मूल विचार सी लाइब्रेरी से किसी फ़ंक्शन को फिर से लिखना और सामान्य के बजाय इसका उपयोग करना है।
यहां एक सरल उदाहरण है जहां हम 0x42 के साथ आउटपुट बफर को पढ़ने () फ़ंक्शन को XOR में ओवरराइड करते हैं ।
#define _GNU_SOURCE
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <dlfcn.h>
#include <unistd.h>
static int dev_zero_fd = -1;
int open64(const char *pathname, int flags)
{
static int (*true_open64)(const char*, int) = NULL;
if (true_open64 == NULL) {
if ((true_open64 = dlsym(RTLD_NEXT, "open64")) == NULL) {
perror("dlsym");
return -1;
}
}
int ret = true_open64(pathname, flags);
if (strcmp(pathname, "/dev/zero") == 0) {
dev_zero_fd = ret;
}
return ret;
}
ssize_t read(int fd, void *buf, size_t count)
{
static ssize_t (*true_read)(int, void*, size_t) = NULL;
if (true_read == NULL) {
if ((true_read = dlsym(RTLD_NEXT, "read")) == NULL) {
perror("dlsym");
return -1;
}
}
if (fd == dev_zero_fd) {
int i;
ssize_t ret = true_read(fd, buf, count);
for (i = 0; i < ret; i++) {
*((char*)buf + i) ^= 0x42;
}
return ret;
}
return true_read(fd, buf, count);
}
हमारे द्वारा पढ़ी जाने वाली प्रत्येक फ़ाइल पर एक भोली कार्यान्वयन XOR 0x42 होगा, जिसके अवांछनीय परिणाम होंगे। इस समस्या को हल करने के लिए, मैंने भी खुले () फ़ंक्शन को झुका दिया , जिससे यह फ़ाइल डिस्क्रिप्टर / dev / शून्य से जुड़ा हुआ है। उसके बाद, हम केवल XOR को हमारे रीड () फंक्शन पर करते हैंfd == dev_zero_fd
।
उपयोग:
$ gcc hook.c -ldl -shared -o hook.so
$ LD_PRELOAD=$(pwd)/hook.so bash #this spawns a hooked shell
$ cat /dev/zero
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB