我想隐藏从system()发出的系统命令

时间:2009-02-25 14:55:37

标签: c++ system

用c ++编写程序,我想从system()函数发出系统命令,但我不希望用户在可执行文件窗口中看到命令(因为命令包含一个pwd)。我需要将用户目录中的文件复制到服务器上,而不允许用户访问服务器或显示pwd。想象有一个执行此操作的.exe是最简单的方法。

例如:

system(“FILETRANSFER_SW.exe -pw helloWORLD11!@ C:/temp.txt F:/ tempfolder /”)

但可执行窗口显示此命令,因此无法尝试隐藏密码。

我试过发行 系统(“@ echo OFF”) 在程序开头,但不会抑制以下命令,它们仍然显示在可执行窗口中。

有什么建议吗?

...谢谢

4 个答案:

答案 0 :(得分:8)

在大多数操作系统中,运行进程的命令行被视为公共信息。

因此,在命令行上传递密码是一个非常糟糕的主意。

此问题有两种常见的解决方法,这两种方法都需要支持可执行文件:

  • 而不是在命令行上传递用户名/密码,传递包含用户名/密码的文件的名称
  • 从被调用的可执行文件中重新设置正在运行的进程的命令行。

第一个解决方案很容易且普遍可行,第二个解决方案具有竞争条件并且更难实现,因为没有跨平台的方法(在某些操作系统上,更改argv会有所帮助)。

答案 1 :(得分:2)

我假设您从命令行使用Windows。如果它不需要是可移植的,我建议您使用CreateProcess() API而不是调用system()。

CreateProcess()API可以使用命令行,您可以设置STARTUP_INFORMATION参数以隐藏新的流程窗口(wShowWindow = SW_HIDE)。

命令行将对临时用户隐藏,但正如其他人所指出的那样,检索并不困难。由于您正在创建一个新流程,我建议将敏感数据写入该流程的标准输入。这样,该过程就可以读取并正常进行。

答案 2 :(得分:0)

使用CreateProcess()API将隐藏用户的敏感数据,但超级用户可以使用免费的实用程序轻松获取与该进程关联的命令行,例如: Process Explorer

答案 3 :(得分:0)

另一种解决方案是在您的程序之间发送密码,使用3DES或AES加密。

您可以使用pipe在两个程序之间进行通信,并且根本不使用命令行。

但是这些方案中的任何一种都不是很安全,它们可以相当容易地规避。如果您想要更高的安全性,您应该在服务器上使用某种质询 - 响应协议。