C 应用程序:Clear Commandline参数

C++ application: clear commandline arguments?

本文关键字:Commandline 参数 Clear 应用程序      更新时间:2023-10-16

我有一个使用CCommandLineInfo来解析命令行参数的C 应用程序。

这些参数之一是应用程序启动后使用CryptProtectMemory加密内存中的密码。

那时,我想摆脱存储器中仍然可用的纯文本的密码(当我创建内存转储时,可以检索它)。

有没有办法清除命令行参数?我尝试清除(用空字符串覆盖)__argv,但在内存转储中仍然可见参数。

[编辑]我尝试清除这样的命令行论证,但这无效。参数仍在记忆中。

for (int i=0; i<__argc; i++)
    __argv[i] = "----------------------";
TCHAR* cmdLine = GetCommandLine();
SecureZeroMemory(cmdLine, strlen(cmdLine));

那里是从过程内存中清除命令行的众所周知的技巧/hack(请参阅此答案),但是即使您应用了它,也可以仍然可以轻松从例如Process Explorer由于它在启动过程时会制作复制。因此,无法防止这样的工具显示命令行。

将密码作为命令行参数只是一个禁忌。我唯一能想到的解决方案是将密码加密/哈希(或最坏情况;未加密)存储在文件中,然后将该文件加载为参数。

我恐怕清理argv还不够,因为argv的来源仍然可以使用GetCommandLine()。最终,此信息存储在RTL_USER_PROCESS_PARAMETERS中的CC_7中。C运行时将将此信息缓存到argv。其他一些库也可以缓存此信息。

您最好使用其他IPC-共享内存或管道传递敏感数据。然后,您只需要清洁内存。

如果您仍然想找到原始命令行,这里有大概的方向:NtCurrentTeb()获取TEB,则将有指向PEB的指针,并且将有指向RTL_USER_PROCESS_PARAMETERS的指针,该指针最终包含命令行的指针。