From 6f0a28b09a670371b22658a295403ab2573ed993 Mon Sep 17 00:00:00 2001 From: Jakob Date: Sun, 3 Sep 2017 14:35:48 -0400 Subject: Fixed up how the user regs struct is accessed. --- wrapper/ptrace.c | 83 +++++++++++++++----------------------------------------- 1 file changed, 22 insertions(+), 61 deletions(-) (limited to 'wrapper') diff --git a/wrapper/ptrace.c b/wrapper/ptrace.c index 7e5dfa8..8517519 100644 --- a/wrapper/ptrace.c +++ b/wrapper/ptrace.c @@ -19,9 +19,12 @@ #include #include +#include +#include #include #include +#include #include @@ -86,73 +89,31 @@ int cont(int pid) { } -/* user_regs_struct is copied from sys/user.h so that we can debug a - 32-bit executable on a 64-bit platform. */ -struct amd64_user_regs_struct { - __extension__ unsigned long long r15; - __extension__ unsigned long long r14; - __extension__ unsigned long long r13; - __extension__ unsigned long long r12; - __extension__ unsigned long long rbp; - __extension__ unsigned long long rbx; - __extension__ unsigned long long r11; - __extension__ unsigned long long r10; - __extension__ unsigned long long r9; - __extension__ unsigned long long r8; - __extension__ unsigned long long rax; - __extension__ unsigned long long rcx; - __extension__ unsigned long long rdx; - __extension__ unsigned long long rsi; - __extension__ unsigned long long rdi; - __extension__ unsigned long long orig_rax; - __extension__ unsigned long long rip; - __extension__ unsigned long long cs; - __extension__ unsigned long long eflags; - __extension__ unsigned long long rsp; - __extension__ unsigned long long ss; - __extension__ unsigned long long fs_base; - __extension__ unsigned long long gs_base; - __extension__ unsigned long long ds; - __extension__ unsigned long long es; - __extension__ unsigned long long fs; - __extension__ unsigned long long gs; -}; - - -struct i386_user_regs_struct { - unsigned long ebx; - unsigned long ecx; - unsigned long edx; - unsigned long esi; - unsigned long edi; - unsigned long ebp; - unsigned long eax; - unsigned long xds; - unsigned long xes; - unsigned long xfs; - unsigned long xgs; - unsigned long orig_eax; - unsigned long eip; - unsigned long xcs; - unsigned long eflags; - unsigned long esp; - unsigned long xss; -}; - - -unsigned long long getreg64(int pid, int idx) { - struct amd64_user_regs_struct regs; +/* TODO: As of now, Hypodermis is strongly tied to the Intel x86 + family of processors. This should really be expanded. */ +int is_amd64(void) { + struct utsname ub; - ptrace(PTRACE_GETREGS, pid, NULL, ®s); + uname(&ub); - return ((unsigned long long *) ®s)[idx]; + return !strcmp(ub.machine, "x86_64"); } -unsigned long getreg32(int pid, int idx) { - struct i386_user_regs_struct regs; +#ifdef __x86_64__ +unsigned long long getreg(int pid, int idx) { + struct user_regs_struct regs; + + ptrace(PTRACE_GETREGS, pid, NULL, ®s); + + return ((unsigned long long *) ®s)[idx]; +} +#else +unsigned long getreg(int pid, int idx) { + struct user_regs_struct regs; ptrace(PTRACE_GETREGS, pid, NULL, ®s); - return ((unsigned long *) ®s)[idx]; + return ((unsigned long *) ®s)[idx]; } +#endif -- cgit v1.3