1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| #include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <linux/user.h>
#include <stdio.h>
#include <stdlib.h>
#include "SyscallNames.cc"
int main()
{
int res=0;
int pid;
struct user data;
struct user_regs_struct regs;
if((pid=fork())==0){
printf("je suis le fils\nTracage de test ->\n");
ptrace(PTRACE_TRACEME,NULL,NULL);
execve("Test",NULL,NULL);
}
else{
printf("Je suis le pere\n");
while(1){
wait(&res);
traitement_signal(res,pid);
}
}
}
int traitement_signal(int res, int pid){
int signal,param;
struct user contexte;
if(WIFSTOPPED(res)){
signal=WSTOPSIG(res);
switch(signal){
case SIGTRAP:
ptrace(PTRACE_GETREGS,pid,NULL,&contexte);
param=contexte.regs.orig_eax;
printf("%s,%d,%d\n",getSyscallName(param),param,signal);
param=contexte.regs.ebx;
recupDonn(pid,res,param,"ebx");
param=contexte.regs.ecx;
recupDonn(pid,res,param,"ecx");
ptrace(PTRACE_SYSCALL,pid,NULL,NULL);
break;
default:
ptrace(PTRACE_GETREGS,pid,NULL,&contexte);
printf(" flag : %d\n",contexte.regs.eflags);
printf("le processus recoit un signal: %d, et un res %d\n",signal,SIGTRAP);
ptrace(PTRACE_DETACH,pid,NULL,NULL);
perror("error");
}
}
else{
printf("terminé\n");
exit(0);
perror("close...");
}
}
int recupDonn(int pid, int res, int param, char *nom){
struct user contexte;
printf("%s ",nom);
char data[256];
int *datat=(int *)data;
int j=0,i=0;
while(j<(256/sizeof(int))){
datat[j]=ptrace(PTRACE_PEEKDATA,pid,param+i,NULL);
i+=4;
j++;
}
for (i=0;i<sizeof(data);i++)
printf("%c",data[i]);
printf("\n");
} |
Partager