【问题标题】:How to find the platform of a running process如何找到正在运行的进程的平台
【发布时间】:2015-05-27 02:03:23
【问题描述】:

我有一台x86_64 机器,它可以运行IA32 进程,因为我安装了一个32 位库。现在我想知道正在运行的进程使用的平台是什么? 64位还是32位?

我可以访问该进程的唯一方法是ptrace 系统调用;我没有可执行文件(就像我可以执行文件但我没有读写权限),所以我无法获取 ELF 标头。

我使用的操作系统是 Ubuntu 14.04 LTS。

我不想得到可执行文件,然后分析ELF格式。我可以访问该进程的唯一途径ptrace,或者与ptrace 相同的其他系统调用,如果您知道,请告诉我。因为我想在一个C程序中分析这个过程。

【问题讨论】:

  • ldd 有效吗? (它实际上执行文件,带有一些隐藏选项)
  • @BenVoigt nop,实际上它是一个正在运行的进程。我通过ptrace附上它。
  • 你可以访问 lsof 吗?

标签: c linux operating-system x86-64


【解决方案1】:

尝试使用xocopy 创建相关可执行文件的副本,并从创建的副本中转储 ELF 标头。

此工具和您所描述的问题已在elsewhere 进行了讨论,该讨论也可能对您有所帮助。

【讨论】:

  • 感谢您的回复。我正在做的工作与xocopy 部分相同。我不想获取可执行文件。我只是想通过ptrace系统调用来分析进程使用的平台。
  • @litao3rd:xocopy 的 C 源代码以编程方式定位并使用 ptrace 读取 ELF 标头 - 这似乎满足您从 C 程序执行此分析的需要(GPL 适用)。
  • 是的,我阅读了xocopy的源代码,它通过在内存中搜索ELF头来工作。但这不是我想要的。再次感谢您的回复。 :P
【解决方案2】:

如果您可以查看/proc/<pid>/personality 的相关PID,我认为您想要的信息就在那里。 00000000 用于 64 位进程,00400000 用于 32 位进程。 (以及00440000 用于我在调试器中停止的 32 位。)

proc(5) 手册页说它告诉您由personality(2) 设置的个性。

内核来源:https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/personality.h

glibc 的副本:https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/sys/personality.h;hb=HEAD

我不确定发生了什么,但看起来正常运行的 32 位进程的唯一设置位是 READ_IMPLIES_EXEC。所以也许个性不是最好的方法。 64 位代码可以设置。

这也是在https://unix.stackexchange.com/questions/106234/determine-if-a-specific-process-is-32-or-64-bit 上提出的问题,除了在以各种方式到达 ELF 标头后检查 ELF 标头之外,检测方法的成功/可行性有限。不过,查看 /proc/<pid>/maps 的 64 位地址看起来是可行的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-04
    • 2012-07-12
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    相关资源
    最近更新 更多