C - 如何检查跟踪进程是否为32位?

时间:2015-05-07 16:45:06

标签: c elf ptrace

使用ptrace_attach时。您如何知道您所附加的进程是以32位还是64位运行?

我编码类似于strace,我需要知道它是32位还是64位,因为RAX(EAX)中系统调用的数量不一样。

当你跟踪一个cmd(strace ls)时,它很简单,你可以对二进制进行mmap,然后用Elf执行一些检查。

但我找不到任何关于现有流程的内容?

谢谢!

1 个答案:

答案 0 :(得分:2)

这是一个非常有趣的问题。

使用/proc/<PID>/exe很简单,但不太可靠:/proc文件系统可能未安装,或者进程可能在chroot中执行。

我看了strace做了什么。它执行以下操作:

union {
  struct user_regs_struct x86_64_r;
  struct i386_user_regs_struct i386_r;
} regs;

struct iovec {
  .iov_base = &regs,
  .iov_len = sizeof(regs)
} x86_io;

ptrace(PTRACE_GETREGSET, pid, NT_PRSTATUS, &x86_io);
if (regs.iov_len == sizeof(i386_user_regs_struct) {
  // this is a 32-bit process
} else {
  // this is either x86_64, or x32 process
}
  

但这是完全便携的

关于ptrace的任何都是完全可移植的。几乎每个UNIX变体都需要自定义处理。