使用ptrace_attach时。您如何知道您所附加的进程是以32位还是64位运行?
我编码类似于strace,我需要知道它是32位还是64位,因为RAX(EAX)中系统调用的数量不一样。
当你跟踪一个cmd(strace ls)时,它很简单,你可以对二进制进行mmap,然后用Elf执行一些检查。
但我找不到任何关于现有流程的内容?
谢谢!
答案 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 = ®s,
.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变体都需要自定义处理。