繁体   English   中英

如何在 64 位进程中使用 ptrace 修改 32 位进程中的寄存器并使其进行系统调用?

[英]How to use ptrace in 64 bit process to modify registers in a 32-bit process and make it do a system-call?

我正在开发一个需要让 32 位进程调用系统调用的程序。 我希望保持我的程序架构独立,但目标始终是 32 位。

要设置寄存器,我将ptracePTRACE_SETREGS使用,它将 regs 结构指针作为其数据参数。

x86_64 和 x86 对struct user_regs_struct user_regs_struct 有不同的定义,所以我尝试简单地使用 x86_64 on,它正确传递了系统调用号,但没有传递 arguments,我已经通过传递1 (x86 上的 __NR_exit)作为系统调用号和21来验证这一点作为第一个参数,但进程仅以 0 退出。

我还尝试复制struct user_regs_struct的 x86 定义,这只会导致段错误。

由于结构的两个定义使用完全不同的数据类型(x86_64 上的unsigned long long int和 x86 上的long int )我怀疑它隐式访问正确的数据,但它似乎没有使用与 x86_64 相同的寄存器arguments(rdi、rsi、rdx、r10、r8 和 r9)。

幸运的是,我好几天都想不通,但一旦你问出这个问题,你就会意识到你应该做什么。

您只需要使用寄存器的 x86_64 等价物。 因此,例如eaxebxecxedxesiedirbx变成raxedprcxrdxrsirdirdp

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM