ঠিক আছে, আপনি যদি আক্ষরিকভাবে এটি অর্জন করতে চান তবে আপনি একটি 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 / শূন্যের সাথে সম্পর্কিত ফাইল বর্ণনাকারী আনতে। তারপরে, আমরা কেবল আমাদের পড়ার () ফাংশনটিতে এক্সওআর সঞ্চালন করি যদি 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