nkmmtyp_regdump_20150711.c

プロトタイプ - kanata, 2015/07/11 10:15

ダウンロード (2.512 KB)

 
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
  /* 読み出し対象のトレース状態化と/porc/<PID>/memのオープン */
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 ){ /* ATTACH の完了を待つ */
33
    fprintf(stderr,"Failed to waitpid (pid: %d)\n",pid);
34
    exit(1);
35
  }
36

    
37
  if( ptrace(PTRACE_GETREGS, pid, 0, &regs) != 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

    
クリップボードから画像を追加 (サイズの上限: 100 MB)