summaryrefslogtreecommitdiff
path: root/wrapper
diff options
context:
space:
mode:
authorJakob <jakob@memeware.net>2017-09-02 18:28:20 -0400
committerJakob <jakob@memeware.net>2017-09-02 18:28:20 -0400
commit42f581e3e19430c1458be1a86d6c1b74eb148f0e (patch)
tree1c199ee495187a82929c1f3f6aeeb68a965fa8a7 /wrapper
parent8b232076240dc7e6f8abdfca3d1634ae065c691b (diff)
Began to implement runtime manipulation utilities.
Diffstat (limited to 'wrapper')
-rw-r--r--wrapper/ptrace.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/wrapper/ptrace.c b/wrapper/ptrace.c
index 706b13e..7e5dfa8 100644
--- a/wrapper/ptrace.c
+++ b/wrapper/ptrace.c
@@ -84,3 +84,75 @@ int cont(int pid) {
return 0;
}
+
+
+/* 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;
+
+ ptrace(PTRACE_GETREGS, pid, NULL, &regs);
+
+ return ((unsigned long long *) &regs)[idx];
+}
+
+
+unsigned long getreg32(int pid, int idx) {
+ struct i386_user_regs_struct regs;
+
+ ptrace(PTRACE_GETREGS, pid, NULL, &regs);
+
+ return ((unsigned long *) &regs)[idx];
+}