Я пытаюсь изменить strace, чтобы захватить файл syscall и изменить файл, который фактически открыт. Например, пользователь пытается: открыть (OUT, "> input.txt"), но файл, который действительно будет открыт, это «input.txt.version1».Изменение strace для захвата и замены имени файла в открытом syscall
У меня был некоторый успех, когда длина нового имени точно такая же, как длина старого имени, используя ptrace (PTRACE_POKEDATA, pid, addr, laddr). Я перехватываю открытый вызов в open.c и изменяю umoven в util.c, чтобы вызывать вместо того, чтобы заглядывать, чтобы заменить символы.
Но это терпит неудачу, когда новое имя файла больше, поскольку оно может превышать длину массива исходного файла. Мне действительно нужно заменить указатель на массив символов новым указателем на мою собственную строку.
Имя файла находится в 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 просто заботится о многих других проблемах уже.
К downvoter: пожалуйста, объясните. –
Зачем это делать? Похоже на вредоносное программное обеспечение. – Olaf
@Olaf Это может быть полезно для отладки ... –