Я пытаюсь изменить strace, чтобы захватить системный вызов открытия файла и изменить фактически открытый файл. Например, пользователь пытается: open(OUT,">input.txt"), но действительно будет открыт файл "input.txt.version1".
У меня был некоторый успех, когда длина нового имени точно такая же, как длина старого имени, с помощью ptrace(PTRACE_POKEDATA, pid, addr, laddr). Я перехватываю вызов open в open.c и модифицирую umoven в util.c, чтобы заменить символы вместо peek.
Но это не удается, когда новое имя файла длиннее, потому что оно может выйти за пределы исходной длины массива имен файлов. Что мне действительно нужно сделать, так это заменить указатель на массив символов новым указателем на мою собственную строку.
Имя файла находится в tcp->u_arg[0], что является регистром rdi в системах x86. Я пробовал варианты следующего без везения:
struct user_regs_struct x86_64_r;
uint64_t *const x86_64_rdi_ptr = (uint64_t *) &x86_64_r.rdi;
ptrace(PTRACE_POKEDATA, tcp->pid, x86_64_rdi_ptr, &newPath);
Как заменить имя файла новым путем произвольной длины? Ответ, использующий только ptrace вместо модификации strace, тоже подойдет. strace просто заботится о многих других проблемах.