进程如何在 ps 输出中显示不同的名称?

Pen*_*100 12 linux process

最近我不得不清理一个被黑的服务器。恶意进程会在“ps aux”输出中显示为“who”或“ifconfig eth0”或类似的东西,即使可执行文件也只是一堆字母,显示在 /proc/[pid]/status 中。

我很好奇这个过程是如何设法像这样掩饰自己的。

wur*_*tel 6

操作进程列表中的名称是一种常见的做法。例如,我在我的过程中列出了以下内容:

root      9847  0.0  0.0  42216  1560 ?        Ss   Aug13   8:27 /usr/sbin/dovecot -c /etc/dovecot/d
root     20186  0.0  0.0  78880  2672 ?        S    Aug13   2:44  \_ dovecot-auth
dovecot  13371  0.0  0.0  39440  2208 ?        S    Oct09   0:00  \_ pop3-login
dovecot   9698  0.0  0.0  39452  2640 ?        S    Nov07   0:00  \_ imap-login
ericb     9026  0.0  0.0  48196  7496 ?        S    Nov11   0:00  \_ imap [ericb 192.168.170.186]
Run Code Online (Sandbox Code Playgroud)

Dovecot 使用这种机制来轻松显示每个进程在做什么。

它基本上就像argv[0]在 C 中操作参数一样简单。argv是一个指向参数的指针数组,进程已启动。所以一个命令ls -l /some/directory将具有:

argv[0] -> "ls"
argv[1] -> "-l"
argv[2] -> "/some/directory"
argv[3] -> null
Run Code Online (Sandbox Code Playgroud)

通过分配一些内存,将一些文本放入该内存中,然后将该内存的地址放入argv[0]显示的进程名称中,将被修改为新文本。

  • 它不是那样工作的。将 `argv[0]` 指向不同的位置不会改变进程在 `ps` 中的显示方式。内核不关心 `argv` 中的指针。相反,内核会记住实际参数所在的内存范围,并使其对 `ps` 和其他工具可见。然后,这些工具必须通过查找每个参数之间的 NUL 终止来识别参数之间的边界。 (3认同)

Ale*_*min 5

更改 argv[] 不可移植。在 Linux 上,您也不能简单地将 argv[0] 更改为指向更长的字符串。您必须覆盖现有参数并注意不要覆盖地址空间中的环境变量。

libbsd为 Linux提供了setproctitle(3)的实现,这使得这更容易。


nit*_*gen 5

有两种 Linux 标准方法可以做到这一点,其中一种来自 glibc 并且可能可以移植到其他非 Linux 系统:

更改argv[0]过去可能有效,但至少在我当前的 Linux 系统上,它对ps.

有关更多详细信息和代码示例,请参阅此答案:https : //stackoverflow.com/a/55584492/737303