我想创建将在后台运行的c ++程序或bash脚本,每当我使用所选命令时
pwd
它将捕获该命令的输出,这将是~Desktop/folder1
,它会将输出更改为You are in ~Desktop/folder1
。因此,结果是该用户在使用命令pwd
后将只看到You are in ~Desktop/folder1
。
Pwd命令只是示例,我想修改其他命令的输出,如ls,ps等。
我希望脚本在所有终端中工作,我的意思是,如果我打开另一个终端,它仍然会捕获该终端中所选命令的输出。
问题:
甚至可以做c ++程序或bash脚本来做这样的事情吗?
答案 0 :(得分:1)
您可以将shell函数定义放入bash环境配置脚本中,这些脚本将具有您描述的效果。例如,
# ...
pwd() {
echo You are in $(command pwd)
}
export -f pwd
请注意使用command
命令来避免shell函数pwd
中的递归。另请注意export -f
将函数导出到子进程。对于你想要覆盖的每个命令,你需要一个这样的代码片段。
根据您的系统和配置,将它们放在~/.bashrc
中可能更合适。或者,如果您希望它应用于每个用户,那么您可以将它们放在一个系统范围的bash配置脚本中。但请注意,用户可以覆盖它。
答案 1 :(得分:1)
首先,你的问题遗漏了两个重要参数。首先是哪些炮弹需要受此影响。这是应该是系统范围的吗?只有一个用户?只是特定用户的一些特定shell?
第二个缺少的参数是需要什么权限。这是root应该做的事情吗?非特权用户?
您希望拦截的每个此类命令都是系统调用。通常它是execve
,但有时它更具体(pwd
,例如,根据定义,是一个内部shell命令)。假设您不想编写内核模块(唯一真正的方法来做您想做的事情),您将需要更具创造性。
一种选择是将文件系统上的所有相关文件替换为您想要的替代版本。当然,如果你不是root用户,这是不可能的。
使用非特权用户更有可能的另一个选项是使用ptrace
接口来控制您希望控制的shell进程。但是,请注意,这非常复杂,性能较慢,并且只能与运行C ++程序的用户在同一用户上工作。此外,最近的内核可以进一步防止作为调试器简单地附加到随机进程,这意味着您需要禁用它(需要root),或者通过程序运行受影响的shell。
已经执行类似操作的一个程序是< shameless_plug> fakeroot-ng
&lt; / shameless_plug&gt;。它设置了一个调试器,并附加到一个shell,以便为它提供与真实系统不同的系统运行视图。您可以尝试破解代码以执行您想要的操作。 <{1}}分支可能会更容易,但那个分支仍然不太稳定。
答案 2 :(得分:1)
你提出了错误的问题。
如果你要做的是隐藏一组进程和文件,/etc/ld.so.preload
就是你的朋友。
您需要做的是编写一个共享对象文件,该文件重新实现readdir
和readdir_r
(两个函数应该或多或少地执行它),以确保if有人试图获取“隐藏”文件所在目录的内容,从答复中省略您的文件。同时,如果有人试图获取/ proc /目录的内容,则省略与您试图隐藏的进程相对应的目录。
您可以通过缓存其inode / dev对并检查它来轻松查看这是否是您希望更改响应的目录。这对于重命名,符号链接等具有弹性。
在网上搜索如何编写LD_PRELOAD模块,以获取有关如何以菊花链形式连接函数的说明。与修改每个二进制文件相比,这是相当更少的工作。如果你知道自己在做什么,可以用大约200行代码完成。
现在是踢球者了。您不需要将LD_PRELOAD环境变量放入每个进程。只需在/etc/ld.so.preload
和中提琴中列出您的共享对象(在使用LD_PRELOAD测试之后)!系统中的所有进程都会向其注入您的库。
不要忽视测试建议。在/etc/ld.so.preload中列出错误的文件可能会导致系统完全无法使用。
为了获得额外的奖励,一旦完成,请安装chkrootkit
并运行它,并观看它抱怨您的系统已被入侵。这是rootkit用于隐藏自身的(许多)技术之一。