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