From 984ff93406e79df67060e0d87d04eb9d40242697 Mon Sep 17 00:00:00 2001 From: Itamar Date: Sat, 4 Apr 2020 11:26:56 +0300 Subject: [PATCH] ptrace: Add PT_PEEK PT_PEEK reads a single word from the tracee's address space and returns it to the tracer. --- Applications/Debugger/main.cpp | 12 ++++++++++-- Kernel/Process.cpp | 16 ++++++++++++++++ Kernel/UnixTypes.h | 1 + Libraries/LibC/sys/ptrace.h | 1 + 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/Applications/Debugger/main.cpp b/Applications/Debugger/main.cpp index fd76270957..dae194388f 100644 --- a/Applications/Debugger/main.cpp +++ b/Applications/Debugger/main.cpp @@ -108,9 +108,17 @@ int main(int argc, char** argv) return 1; } - printf("hit breakpoint\n"); + PtraceRegisters regs; + if (ptrace(PT_GETREGS, g_pid, ®s, 0) == -1) { + perror("getregs"); + return 1; + } - sleep(1); + printf("hit breakpoint\n"); + printf("eip:0x%x\n", regs.eip); + + uint32_t data = ptrace(PT_PEEK, g_pid, (void*)regs.eip, 0); + printf("data: 0x%x\n", data); if (ptrace(PT_CONTINUE, g_pid, 0, 0) == -1) { perror("continue"); diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index b786f92258..d3ccd13b87 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -69,6 +69,7 @@ #include #include #include +#include #include #include #include @@ -4973,6 +4974,21 @@ int Process::sys$ptrace(const Syscall::SC_ptrace_params* user_params) } break; } + case PT_PEEK: { + uint32_t* addr = reinterpret_cast(params.addr); + if (!MM.validate_user_read(peer->process(), VirtualAddress(addr), sizeof(uint32_t))) { + return -EFAULT; + } + + uint32_t result; + + SmapDisabler dis; + ProcessPagingScope scope(peer->process()); + result = *addr; + + return result; + break; + } default: return -EINVAL; diff --git a/Kernel/UnixTypes.h b/Kernel/UnixTypes.h index c890befbf7..4448de7f00 100644 --- a/Kernel/UnixTypes.h +++ b/Kernel/UnixTypes.h @@ -554,3 +554,4 @@ struct rtentry { #define PT_SYSCALL 4 #define PT_GETREGS 5 #define PT_DETACH 6 +#define PT_PEEK 7 diff --git a/Libraries/LibC/sys/ptrace.h b/Libraries/LibC/sys/ptrace.h index 9f385d4787..11559bcc9f 100644 --- a/Libraries/LibC/sys/ptrace.h +++ b/Libraries/LibC/sys/ptrace.h @@ -36,6 +36,7 @@ __BEGIN_DECLS #define PT_SYSCALL 4 #define PT_GETREGS 5 #define PT_DETACH 6 +#define PT_PEEK 7 int ptrace(int request, pid_t pid, void* addr, int data);