linux - 如何隐藏/更改名称在 ps 的 Bash 脚本中调用的进程

标签 linux bash process hide

我是 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] 作为命令名称。通过内置的 bash exec,您可以使用 -a 标志提供任何您想要的值作为 argv[0] 的值。 (这是一个 bash 扩展。它可能不存在于其他 shell 中。)因此您可以简单地使用:

    exec -a SpoofedName RealCommandName arg...
    

    由于这是 ps 的默认信息源,因此它将隐藏命令名称(但不是参数),以防止随意使用 ps

  • /proc/PID/stat/proc/PID/status:显示 PID 的状态信息;第一个格式易于程序解析,第二个格式易于人类阅读。两者都显示进程可执行文件的实际文件名。这是 pscomm 选择器的信息来源,也是 top 中进程名称的信息来源。

    您可以通过创建可执行文件的符号链接(symbolic link)并执行该符号链接(symbolic link)而不是原始文件来欺骗此名称。这将处理 ps -ocommtop

  • /proc/PID/exe:这是实际可执行文件的符号链接(symbolic link)。我不认为有一种简单的方法可以欺骗这个值,除了将可执行文件实际复制到一个新文件并执行该文件(这并不是真正的欺骗)。但是,据我所知,任何显示进程信息的命令行实用程序都没有使用它。用户需要输入如下内容:

    ls -ld /proc/8325/exe
    

    readlink /proc/8325/exe
    

    查看可执行文件的文件名。

关于linux - 如何隐藏/更改名称在 ps 的 Bash 脚本中调用的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37641695/

相关文章:

Linux 内核构建编译错误 stringop-overflow 和 sizeof-pointer-memaccess

ruby-on-rails - 从图像列表中为视频添加 ken burn 效果

java - Bluecove 中的身份验证 - Linux x64 无法正常工作

linux - 验证文件的 SHA-256 总和,如果不符合预期则退出脚本

Python多线程两行代码

python - 在并发环境中追加到文件末尾

linux - 根据 SSID 停止 ssh 和 smbd 的 Bash 脚本

Python 脚本打开 bash 提示终止脚本

c# - 永远找不到正在运行的进程

C# Process.Start 参数被截断