1
|
#include <stdio.h>
|
2
|
#include <stdlib.h>
|
3
|
#include <string.h>
|
4
|
#include <unistd.h>
|
5
|
#include <fcntl.h>
|
6
|
#include <errno.h>
|
7
|
#include <sys/ptrace.h>
|
8
|
#include <sys/types.h>
|
9
|
#include <sys/stat.h>
|
10
|
#include <sys/user.h>
|
11
|
|
12
|
void dump_reg(long long int reg,char *name);
|
13
|
|
14
|
int main( int argc ,char *argv[] )
|
15
|
{
|
16
|
pid_t pid;
|
17
|
struct user_regs_struct regs;
|
18
|
|
19
|
|
20
|
if( argc < 2 ){
|
21
|
printf("Usage:\n");
|
22
|
printf(" # %s pid \n\n",argv[0]);
|
23
|
exit(1);
|
24
|
}
|
25
|
pid = atoi(argv[1]);
|
26
|
|
27
|
|
28
|
if(ptrace(PTRACE_ATTACH,pid,NULL,NULL) != 0 ){
|
29
|
fprintf(stderr,"Failed to attach (pid: %d)\n",pid);
|
30
|
exit(1);
|
31
|
}
|
32
|
if(waitpid(pid,NULL,0) < 0 ){
|
33
|
fprintf(stderr,"Failed to waitpid (pid: %d)\n",pid);
|
34
|
exit(1);
|
35
|
}
|
36
|
|
37
|
if( ptrace(PTRACE_GETREGS, pid, 0, ®s) != 0 ){
|
38
|
fprintf(stderr,"Failed to access registers (pid: %d)\n",pid);
|
39
|
exit(1);
|
40
|
}
|
41
|
|
42
|
|
43
|
dump_reg(regs.rax,"rax");
|
44
|
dump_reg(regs.orig_rax,"orig_rax");
|
45
|
dump_reg(regs.rbx,"rbx");
|
46
|
dump_reg(regs.rcx,"rcx");
|
47
|
dump_reg(regs.rdx,"rdx");
|
48
|
|
49
|
dump_reg(regs.rbp,"rbp");
|
50
|
dump_reg(regs.rip,"rip");
|
51
|
dump_reg(regs.rsp,"rsp");
|
52
|
|
53
|
dump_reg(regs.rsi,"rsi");
|
54
|
dump_reg(regs.rdi,"rdi");
|
55
|
|
56
|
dump_reg(regs.r8,"r8");
|
57
|
dump_reg(regs.r9,"r9");
|
58
|
dump_reg(regs.r10,"r10");
|
59
|
dump_reg(regs.r11,"r11");
|
60
|
dump_reg(regs.r12,"r12");
|
61
|
dump_reg(regs.r13,"r13");
|
62
|
dump_reg(regs.r14,"r14");
|
63
|
dump_reg(regs.r15,"r15");
|
64
|
|
65
|
dump_reg(regs.eflags,"eflags");
|
66
|
|
67
|
dump_reg(regs.cs,"cs");
|
68
|
dump_reg(regs.ss,"ss");
|
69
|
dump_reg(regs.ds,"ds");
|
70
|
dump_reg(regs.es,"es");
|
71
|
dump_reg(regs.fs,"fs");
|
72
|
dump_reg(regs.gs,"gs");
|
73
|
dump_reg(regs.fs_base,"fs_base");
|
74
|
dump_reg(regs.gs_base,"gs_base");
|
75
|
|
76
|
ptrace(PTRACE_DETACH,pid,NULL,NULL);
|
77
|
return EXIT_SUCCESS;
|
78
|
}
|
79
|
|
80
|
void dump_reg(long long int reg,char *name){
|
81
|
int i;
|
82
|
unsigned char disp_ascii_word;
|
83
|
unsigned char disp_ascii_digit[17];
|
84
|
unsigned char disp_ascii_work[3];
|
85
|
unsigned char disp_ascii[9];
|
86
|
|
87
|
memset(disp_ascii,'\0',sizeof(disp_ascii));
|
88
|
|
89
|
memset(disp_ascii_digit,'\0',sizeof(disp_ascii_digit));
|
90
|
memset(disp_ascii_work,'\0',sizeof(disp_ascii_work));
|
91
|
sprintf(disp_ascii_digit,"%016lx",reg);
|
92
|
|
93
|
for( i = 0 ; i < 8 ; i++ ){
|
94
|
memcpy(&disp_ascii_work,&disp_ascii_digit[i*2],2);
|
95
|
disp_ascii_word = (unsigned char)strtol(disp_ascii_work,NULL,16);
|
96
|
if(disp_ascii_word < 0x20 || disp_ascii_word >= 0x7F){
|
97
|
disp_ascii[i] = '.';
|
98
|
}else{
|
99
|
disp_ascii[i] = disp_ascii_word;
|
100
|
}
|
101
|
}
|
102
|
|
103
|
printf("%8s: %16lx %16ld %s\n",name,reg,reg,&disp_ascii);
|
104
|
}
|
105
|
|