Я хочу получить инструкции от запущенного процесса и изменить его с помощью ptrace. Когда переменная instr (содержит текущую инструкцию - PTRACE_PEEKDATA) беззнаковая, все работает, но когда я меняю ее на long int, возникает ошибка (дамп памяти). ptrace(PTRACE_PEEKDATA, ...) возвращает long int, так что это не должно быть проблемой. Я работаю на Убунту.
Где я ошибся? Я новичок в этом, так что это, вероятно, будет что-то глупое.
Мой код:
#include <stdio.h>
#include <sys/ptrace.h>
#include <sys/user.h>
#include <sys/types.h>
#include <stdlib.h>
#include <wait.h>
int main()
{
int status;
char *pid_char;
pid_t PID;
struct user_regs_struct reg; /* register */
long int instr;
unsigned changedInstr;
printf("Tracee PID: ");
scanf("%s", pid_char);
PID = atoi(pid_char);
printf("\n");
/* PTRACE STARTS */
ptrace(PTRACE_ATTACH, PID, NULL, NULL);
waitpid(PID, &status, 0);
ptrace(PTRACE_GETREGS, PID, NULL, ®);
instr = ptrace(PTRACE_PEEKDATA, PID, reg.rip, NULL);
printf("Current Instruction: %llx\n", instr);
scanf("%u", &changedInstr);
ptrace(PTRACE_POKEDATA, PID, reg.rip, &changedInstr);
ptrace(PTRACE_DETACH, PID, NULL, NULL);
return 0;
}
On error, all requests return -1, and errno is set appropriately.
Вы проверили ошибку? А ты сменилinstr
сunsigned long
? Это единственное изменение? Как я могу воспроизвести его с помощью какой-либо программы? - person KamilCuk   schedule 09.11.2018