首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从/proc/获取Linux中的可执行文件名,并检测它是否被截断

从/proc/获取Linux中的可执行文件名,并检测它是否被截断
EN

Unix & Linux用户
提问于 2021-01-19 12:59:58
回答 1查看 2K关注 0票数 3

可执行文件名为linux,可以以各种方式读取。

  1. 通过读取/proc//comm,其中包含在到达16个字符或TASK_COMM_LEN后被截断的字符串。
  2. 通过读取/proc//cmdline,其中包含与参数一起使用的命令行。

还有其他方法,如读取/proc//stat或/proc//status,但它们类似于1。

对于第1点,proc(5)手册页说:

括号中可执行文件的文件名。长度大于TASK_COMM_LEN (16)字符(包括终止空字节)的字符串将被静默截断。无论可执行文件是否被交换,这都是可见的。

我看到三个进程不匹配,并突出显示它们(现在在我的系统上):

  1. PID 7610
  2. PID 38193
  3. PID 37030

考虑以下情况:

  1. PID 7610:
  • /proc/7610/comm的含量为Web Content
  • /proc/7610/cmdline的含量为/opt/firefox-developer-edition/firefox-bin-contentproc-childID17-isForBrowser-prefsLen7837-prefMapSize238232-parentBuildID20201215185920-appdir/opt/firefox-developer-edition/browser4080truetab
  1. PID 38193:
  • /proc/38193/comm的含量为zyxwvutsrqponml
  • /proc/38193/cmdline的含量为/ramdisk/abcdefghijklmnopqrstuvwxyz./zyxwvutsrqponmlkjihgfedcba

ramdisk/abcdefghijklmnopqrstuvwxyz./zyxwvutsrqponmlkjihgfedcba之间有一个D46D47,我可以编程地看到它,我用\s替换它。

  1. PID 37030
  • /proc/37030/comm的含量为kworker/3:1-xfs-reclaim/sda2
  • /proc/37030/cmdline的内容是空的。
  • 在案例1中,我们看到cmdline和comm完全不同。
  • 在案例2中,我们看到cmdline显示了整个命令,但是comm被截断为15个字符。
  • 在第3种情况下,我们看到cmdline是空的,但是comm并没有像预期的那样被截断。

文件通信如何包含“kworker/3:1-xfs-reclaim/sda2 2”而不被截断为15位(+ \n为16位)?

我怎么知道它是否真的被截断了,就像第2点的情况一样?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2021-01-19 13:16:47

唯一可靠的方法是通过/proc/PID/exe,即使可执行文件已经被删除,或者它从一开始就不存在(比如在通过fexecve()execveat(AT_EMPTY_PATH)执行用memfd_create()创建的文件时)。

进程本身可以很容易地伪造/proc/PID/comm/proc/PID/cmdline (前者通过prctl(PR_SET_NAME),后者仅通过覆盖argv[]字符串)。

文件comm如何包含kworker/3:1-xfs-reclaim/sda2而不被截断为15位(+ \n为16)?

这是一个内核线程,而不是用户进程,不同的规则应用;-)

票数 7
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/629869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档