最近我不得不清理一个被黑的服务器。恶意进程会在“ps aux”输出中显示为“who”或“ifconfig eth0”或类似的东西,即使可执行文件也只是一堆字母,显示在 /proc/[pid]/status 中。
我很好奇这个过程是如何设法像这样掩饰自己的。
操作进程列表中的名称是一种常见的做法。例如,我在我的过程中列出了以下内容:
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[] 不可移植。在 Linux 上,您也不能简单地将 argv[0] 更改为指向更长的字符串。您必须覆盖现有参数并注意不要覆盖地址空间中的环境变量。
libbsd为 Linux提供了setproctitle(3)的实现,这使得这更容易。
有两种 Linux 标准方法可以做到这一点,其中一种来自 glibc 并且可能可以移植到其他非 Linux 系统:
pthread_setname_np()
可能是更好的方法prctl()
也可以更改argv[0]
过去可能有效,但至少在我当前的 Linux 系统上,它对ps
.
有关更多详细信息和代码示例,请参阅此答案:https : //stackoverflow.com/a/55584492/737303
归档时间: |
|
查看次数: |
22898 次 |
最近记录: |