我是 bash 脚本新手,正在编写 bash 来执行一些命令, 示例:
#!/bin/bash
var1=$1
var2=$2
var3="$(~/ourCcompiledprogram -c check -v error -f syn)"
$var3 $var1 $var2
当我们运行 bash 脚本时,它运行得很好, 但问题是如果有人登录服务器并执行 ps aux、top、htop 等... 将看到进程像这样运行:/home/user/ourCcompiledprogram -c check -v error -f force ~/input.file ~/output.file
如何防止这种情况发生?或者添加到 bash 脚本中以运行 bash 中以指定名称调用的所有外部命令!?
最佳答案
Linux 提供了有关 /proc
文件系统中各个位置正在运行的进程的信息。其中大多数都很难欺骗,不需要做很多工作。一般来说,你必须修改系统执行环境,即使这样你也可能无法完全隐藏信息。
在评论中,@sjsam提供a link to an article它展示了如何使用预加载机制来拦截将打开 /proc
文件系统的调用,并使用它来隐藏有关特定进程的信息。然而,正如该文章还指出的那样,还有其他机制可以获取进程信息。
有四个 /proc
条目保存相关信息:(在以下所有内容中,PID
应替换为进程的数字 PID。)
/proc/PID/cmdline
:这是最容易欺骗的,因为它显示了argv
数组(或者更准确地说,前 4,096 个字节)argv
数组的一部分),其中argv[0]
作为命令名称。通过内置的 bashexec
,您可以使用-a
标志提供任何您想要的值作为argv[0]
的值。 (这是一个 bash 扩展。它可能不存在于其他 shell 中。)因此您可以简单地使用:exec -a SpoofedName RealCommandName arg...
由于这是
ps
的默认信息源,因此它将隐藏命令名称(但不是参数),以防止随意使用ps
。/proc/PID/stat
和/proc/PID/status
:显示PID
的状态信息;第一个格式易于程序解析,第二个格式易于人类阅读。两者都显示进程可执行文件的实际文件名。这是ps
中comm
选择器的信息来源,也是top
中进程名称的信息来源。您可以通过创建可执行文件的符号链接(symbolic link)并执行该符号链接(symbolic link)而不是原始文件来欺骗此名称。这将处理
ps -ocomm
和top
/proc/PID/exe
:这是实际可执行文件的符号链接(symbolic link)。我不认为有一种简单的方法可以欺骗这个值,除了将可执行文件实际复制到一个新文件并执行该文件(这并不是真正的欺骗)。但是,据我所知,任何显示进程信息的命令行实用程序都没有使用它。用户需要输入如下内容:ls -ld /proc/8325/exe
或
readlink /proc/8325/exe
查看可执行文件的文件名。
关于linux - 如何隐藏/更改名称在 ps 的 Bash 脚本中调用的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37641695/