プロジェクト

全般

プロフィール

ねこみみタイフーン » nkmmtyp_regdump_20150711.c

プロトタイプ - kanata, 2025/04/13 16:38

 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/user.h>

void dump_reg(long long int reg,char *name);

int main( int argc ,char *argv[] )
{
pid_t pid;
struct user_regs_struct regs;

/* 引数の取得 */
if( argc < 2 ){
printf("Usage:\n");
printf(" # %s pid \n\n",argv[0]);
exit(1);
}
pid = atoi(argv[1]);

/* 読み出し対象のトレース状態化と/porc/<PID>/memのオープン */
if(ptrace(PTRACE_ATTACH,pid,NULL,NULL) != 0 ){
fprintf(stderr,"Failed to attach (pid: %d)\n",pid);
exit(1);
}
if(waitpid(pid,NULL,0) < 0 ){ /* ATTACH の完了を待つ */
fprintf(stderr,"Failed to waitpid (pid: %d)\n",pid);
exit(1);
}

if( ptrace(PTRACE_GETREGS, pid, 0, &regs) != 0 ){
fprintf(stderr,"Failed to access registers (pid: %d)\n",pid);
exit(1);
}


dump_reg(regs.rax,"rax");
dump_reg(regs.orig_rax,"orig_rax");
dump_reg(regs.rbx,"rbx");
dump_reg(regs.rcx,"rcx");
dump_reg(regs.rdx,"rdx");

dump_reg(regs.rbp,"rbp");
dump_reg(regs.rip,"rip");
dump_reg(regs.rsp,"rsp");

dump_reg(regs.rsi,"rsi");
dump_reg(regs.rdi,"rdi");

dump_reg(regs.r8,"r8");
dump_reg(regs.r9,"r9");
dump_reg(regs.r10,"r10");
dump_reg(regs.r11,"r11");
dump_reg(regs.r12,"r12");
dump_reg(regs.r13,"r13");
dump_reg(regs.r14,"r14");
dump_reg(regs.r15,"r15");

dump_reg(regs.eflags,"eflags");

dump_reg(regs.cs,"cs");
dump_reg(regs.ss,"ss");
dump_reg(regs.ds,"ds");
dump_reg(regs.es,"es");
dump_reg(regs.fs,"fs");
dump_reg(regs.gs,"gs");
dump_reg(regs.fs_base,"fs_base");
dump_reg(regs.gs_base,"gs_base");

ptrace(PTRACE_DETACH,pid,NULL,NULL);
return EXIT_SUCCESS;
}

void dump_reg(long long int reg,char *name){
int i;
unsigned char disp_ascii_word;
unsigned char disp_ascii_digit[17];
unsigned char disp_ascii_work[3];
unsigned char disp_ascii[9];

memset(disp_ascii,'\0',sizeof(disp_ascii));

memset(disp_ascii_digit,'\0',sizeof(disp_ascii_digit));
memset(disp_ascii_work,'\0',sizeof(disp_ascii_work));
sprintf(disp_ascii_digit,"%016lx",reg);

for( i = 0 ; i < 8 ; i++ ){
memcpy(&disp_ascii_work,&disp_ascii_digit[i*2],2);
disp_ascii_word = (unsigned char)strtol(disp_ascii_work,NULL,16);
if(disp_ascii_word < 0x20 || disp_ascii_word >= 0x7F){
disp_ascii[i] = '.';
}else{
disp_ascii[i] = disp_ascii_word;
}
}

printf("%8s: %16lx %16ld %s\n",name,reg,reg,&disp_ascii);
}

(2-2/3)