Как подменить один из аргументов системного вызова в хуке этого вызова в модуля ядра Linux

Как подменить один из аргументов системного вызова в хуке этого вызова в модуля ядра Linux ? Я заменил в таблице системных вызовов вызов execve на свою обертку, которая при попытке исполнить определенный файл вызывает другой бинарник. Иными словами подменяет у execve первый аргумент. Но execve возвращает код 14 #define EFAULT 14 /* Bad address */. Как мне передать указатель на строку с путем к файлу, который я хочу вызвать вместо empty_file чтоб execve смог это прочитать?

const char* empty_file = "/home/amamedov/dev/university/proxy-exec/tests/test";
char* callable_file = "/home/amamedov/dev/university/proxy-exec/tests/build/dev_test";
    int pec_execve(struct pt_regs *args) {
        char buffer[256];
        raw_copy_from_user(buffer, (const char*)args->di, sizeof(buffer));
        if (strcmp(buffer, empty_file) == 0) {
            pr_info("pec_execve: file path[%s]", buffer);
            args->di = (unsigned long)callable_file;
        }
        return original_execve(args);
    }

Так же пробовал выделять память с флагами GFP_HIGHUSER и GFP_USER


Ответы (0 шт):