Я работаю над приложением Linux, включающим ptrace, чтобы наблюдать за другим процессом, созданным системным вызовом fork().
Строго говоря: я хочу реализовать внедрение ошибок в разветвленный процесс (процесс чили или «трассировку»).
Как вы можете видеть на рисунке ниже:
трассировщик получает структуру regs (struct_user_regs) от трассируемого с помощью запроса PTRACE_GETREGS. после этого трассировщик изменяет значение EIP трассируемого (когда ядро переключается на трассируемое, выполнение ордера будет нарушать так называемую ошибку потока управления CFE). затем запрос PTRAC E_CONT будет отправлен трассируемому, чтобы продолжить его выполнение.
К сожалению, после изменения трассировки EPI трассировка не продолжает выполнение из-за (ошибки сегментации). Как я могу указать другое подходящее значение для трассируемого EIP?
вот код
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include<sys/user.h>
#include<sys/reg.h>
#include<stdlib.h>
#include<stdio.h>
#include <asm/ptrace-abi.h>
int main()
{
pid_t child;
int status;
int sum=0;
struct user_regs_struct regs;
child = fork();
if(child == 0) {
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
printf("hello world 1\n");
printf("hello world 2\n");
raise (SIGINT); // just to move control to the tracer
printf("hello world 3\n");
printf("hello world 4\n");
printf("hello world 5\n");
exit(EXIT_SUCCESS);
}
else {
wait(NULL);
ptrace(PTRACE_GETREGS, child,NULL, ®s);
printf("\n EIP @ 0x %#lx\n",regs.eip);
//get the tracee EIP
long int new_eip=ptrace(PTRACE_PEEKTEXT, child,regs.eip,NULL);
//chabge EIP and poke it again
new_eip += ???; // make change that let to jump to another tracee instruction address (say to print hello world 5)
ptrace(PTRACE_POKETEXT, child,regs.eip,new_eip);
ptrace(PTRACE_CONT, child, NULL, NULL);
}
return 0;
}
есть идеи? Спасибо за вашу помощь.