【问题标题】:C - How To Check If Traced Process Is 32 bits?C - 如何检查跟踪的进程是否为 32 位?
【发布时间】:2015-05-07 16:45:06
【问题描述】:

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

我正在编写一些类似 strace 的代码,我需要知道它是 32 位还是 64 位,因为 RAX(EAX) 中系统调用的数量不会具有相同的含义。

当您跟踪 cmd (strace ls) 时,它非常简单,您可以映射二进制文件并使用 Elf 执行一些检查。

但我找不到任何关于现有流程的信息?

谢谢!

【问题讨论】:

  • open() 然后mmap() /proc/<PID>/exe?
  • 是的,这就是我刚刚所做的,工作正常,谢谢大家!但这是完全便携的吗?我的意思是 /proc/pid/exe 它像 linux 系统上的通用路径吗?
  • @Lks 在 Linux 系统上足够接近,除非您需要使用一些运行 Linux 内核而没有 /proc 文件系统的嵌入式平台。不过,对于其他 *nixen 来说不是那么便携......

标签: c elf ptrace


【解决方案1】:

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

使用/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 变体都需要在这里进行自定义处理。

【讨论】:

  • 确实,即使进程已经跳转到具有其他位数的段,它也会继续报告原始位数。
猜你喜欢
  • 2016-02-02
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
相关资源
最近更新 更多