自从我调用Linux内核(现在是Mac用户)以来,已经有很长一段时间了。如果我记得正确那么...
用类似的东西安装内核头文件 sudo apt-get install linux-headers-$(uname -r) 。让我们说你在 x86_64-linux-gnu (基于你的猜测 rax 利益)。
sudo apt-get install linux-headers-$(uname -r)
x86_64-linux-gnu
rax
打开 /usr/include/x86_64-linux-gnu/sys/reg.h 标题:
/usr/include/x86_64-linux-gnu/sys/reg.h
... #ifdef __x86_64__ /* Index into an array of 8 byte longs returned from ptrace for location of the users' stored general purpose registers. */ # define R15 0 # define R14 1 # define R13 2 # define R12 3 # define RBP 4 # define RBX 5 # define R11 6 # define R10 7 # define R9 8 # define R8 9 # define RAX 10 ...
评论说:
索引到从ptrace返回的8字节长的数组,用于存储用户存储的通用寄存器的位置。
所有这些宏( RAX , RCX ,...)定义 的 索引 强> 特别寄存器。因为每个都是8字节长( x86_64 只有),偏移是 8 * $index 。的情况下 rax 寄存器,偏移量计算为 8 * RAX = 8 * 10 = 80 。 80 你应该用什么 addr 论证 ptrace 功能调用。这是它的工作原理。请注意,它与其他架构等不同。
RAX
RCX
x86_64
8 * $index
8 * RAX = 8 * 10 = 80
80
addr
ptrace
PTRACE_PEEKUSER - 用于寄存器和其他调试信息。
PTRACE_PEEKUSER
PTRACE_PEEKDATA - 用于节目数据&码。
PTRACE_PEEKDATA
PTRACE_PEEKTEXT - man ptrace (Linux)说 - 将word数据复制到tracee内存中的地址addr。至于 PTRACE_PEEKTEXT 和 PTRACE_PEEKDATA ,这两个请求目前是等价的。 那是因为Linux没有单独的文本和数据地址空间。
PTRACE_PEEKTEXT
man ptrace
该 nix 箱子提供 getregs 功能阅读所有这些。它回来了 libc user_regs_struct 。仅支持Linux:
nix
libc
libc crate也包含那些索引:
如果您只对一个寄存器感兴趣,可以使用此索引计算偏移量/地址 ptrace的 功能。乘以它 8 ( #[cfg(target_arch = "x86_64")] )/ 4 ( #[cfg(target_arch = "x86")] )并使用 PTRACE_PEEKUSER 读它(见 请求 )。
8
#[cfg(target_arch = "x86_64")]
4
#[cfg(target_arch = "x86")]
读 UNIX&的调用约定是什么? Linux系统调用i386和x86-64 。换句话说,你对此很感兴趣 rdi , rsi , rdx ,...寄存器。该 nix 箱子提供专业 读 功能,哪个 内部呼叫 ptrace 功能 PTRACE_PEEKDATA 。
rdi
rsi
rdx
ptrace 函数已弃用。文档说明:
从0.10.0开始不推荐使用:ptrace()的用法应该用专用的辅助函数替换代替
你应该使用像这样的专门功能 getregs &安培; read 。你可以找到它们的列表 在文档中 。
getregs
read