From a7aff4b60d537e6f336ff7e8affe8801a92c20f0 Mon Sep 17 00:00:00 2001 From: jD91mZM2 Date: Tue, 25 Jun 2019 10:07:58 +0200 Subject: [PATCH] WIP(ptrace): Add an alternative to Linux' user_regs_struct --- src/data.rs | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/flag.rs | 6 ++++ 2 files changed, 94 insertions(+) diff --git a/src/data.rs b/src/data.rs index 89e3b9e..010967b 100644 --- a/src/data.rs +++ b/src/data.rs @@ -217,3 +217,91 @@ impl DerefMut for TimeSpec { } } } + +#[derive(Copy, Clone, Debug, Default)] +#[repr(C)] +pub struct IntRegisters { + pub r15: usize, + pub r14: usize, + pub r13: usize, + pub r12: usize, + pub rbp: usize, + pub rbx: usize, + pub r11: usize, + pub r10: usize, + pub r9: usize, + pub r8: usize, + pub rax: usize, + pub rcx: usize, + pub rdx: usize, + pub rsi: usize, + pub rdi: usize, + // pub orig_rax: usize, + pub rip: usize, + pub cs: usize, + pub eflags: usize, + pub rsp: usize, + pub ss: usize, + pub fs_base: usize, + pub gs_base: usize, + pub ds: usize, + pub es: usize, + pub fs: usize, + pub gs: usize +} + +impl Deref for IntRegisters { + type Target = [u8]; + fn deref(&self) -> &[u8] { + unsafe { + slice::from_raw_parts(self as *const IntRegisters as *const u8, mem::size_of::()) as &[u8] + } + } +} + +impl DerefMut for IntRegisters { + fn deref_mut(&mut self) -> &mut [u8] { + unsafe { + slice::from_raw_parts_mut(self as *mut IntRegisters as *mut u8, mem::size_of::()) as &mut [u8] + } + } +} + +#[derive(Clone, Copy)] +#[repr(C)] +pub struct FloatRegisters { + pub cwd: u16, + pub swd: u16, + pub ftw: u16, + pub fop: u16, + pub rip: u64, + pub rdp: u64, + pub mxcsr: u32, + pub mxcr_mask: u32, + pub st_space: [u32; 32], + pub xmm_space: [u32; 64] +} + +impl Default for FloatRegisters { + fn default() -> Self { + // xmm_space is not Default until const generics + unsafe { mem::zeroed() } + } +} + +impl Deref for FloatRegisters { + type Target = [u8]; + fn deref(&self) -> &[u8] { + unsafe { + slice::from_raw_parts(self as *const FloatRegisters as *const u8, mem::size_of::()) as &[u8] + } + } +} + +impl DerefMut for FloatRegisters { + fn deref_mut(&mut self) -> &mut [u8] { + unsafe { + slice::from_raw_parts_mut(self as *mut FloatRegisters as *mut u8, mem::size_of::()) as &mut [u8] + } + } +} diff --git a/src/flag.rs b/src/flag.rs index 6a03793..3268ceb 100644 --- a/src/flag.rs +++ b/src/flag.rs @@ -65,6 +65,12 @@ pub const PROT_EXEC: usize = 0x0001_0000; pub const PROT_WRITE: usize = 0x0002_0000; pub const PROT_READ: usize = 0x0004_0000; +pub const PTRACE_CONT: u8 = 0b0000_0001; +pub const PTRACE_SINGLESTEP: u8 = 0b0000_0010; +pub const PTRACE_SYSCALL: u8 = 0b0000_0011; +pub const PTRACE_OPERATIONMASK: u8 = 0b0000_1111; +pub const PTRACE_SYSEMU: u8 = 0b0001_0000; + pub const SEEK_SET: usize = 0; pub const SEEK_CUR: usize = 1; pub const SEEK_END: usize = 2;