如何清除进程命令行?

时间:2010-10-21 23:24:37

标签: c++ windows winapi command-line command-line-arguments

我想从内部清除我的进程的命令行。例如,在任务管理器/进程资源管理器中查看我的进程时,命令行条目将为空。

我想在当前正在运行的流程中执行此操作,而不是在可能的情况下重新启动流程。

3 个答案:

答案 0 :(得分:10)

我认为您必须修改流程RTL_USER_PROCESS_PARAMETERSPEB部分(例如,请参阅http://en.wikipedia.org/wiki/Process_Environment_Blockhttp://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Process/PEB.html)。您可以尝试使用NtQueryInformationProcess获取PEB。然后,您可以修改ProcessParameters.CommandLine。我希望它能奏效。

更新:我验证了我的建议。有用。以下测试程序证明了这一点:

#include <Windows.h>
#include <Winternl.h> // for PROCESS_BASIC_INFORMATION and ProcessBasicInformation
#include <stdio.h>
#include <tchar.h>

typedef NTSTATUS (NTAPI *PFN_NT_QUERY_INFORMATION_PROCESS) (
    IN HANDLE ProcessHandle,
    IN PROCESSINFOCLASS ProcessInformationClass,
    OUT PVOID ProcessInformation,
    IN ULONG ProcessInformationLength,
    OUT PULONG ReturnLength OPTIONAL);

int main()
{
    HANDLE hProcess = OpenProcess (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
                                   FALSE, GetCurrentProcessId());
    PROCESS_BASIC_INFORMATION pbi;
    ULONG ReturnLength;
    PFN_NT_QUERY_INFORMATION_PROCESS pfnNtQueryInformationProcess =
        (PFN_NT_QUERY_INFORMATION_PROCESS) GetProcAddress (
            GetModuleHandle(TEXT("ntdll.dll")), "NtQueryInformationProcess");
    NTSTATUS status = pfnNtQueryInformationProcess (
        hProcess, ProcessBasicInformation,
        (PVOID)&pbi, sizeof(pbi), &ReturnLength);
    // remove full information about my command line
    pbi.PebBaseAddress->ProcessParameters->CommandLine.Length = 0;

    getchar(); // wait till we can verify the results
    return 0;
}

如果我们用一些参数启动程序,我们将看到

alt text

而不是之前见过的

alt text

答案 1 :(得分:2)

根据您上面的评论,您可能希望考虑通过环境变量传递密钥。如果在父进程环境中设置密钥,它将由子进程继承,并且对外部人员来说不会像命令行那样容易看到。

答案 2 :(得分:1)

您可以尝试调用GetCommandLine API函数,然后将第一个字节设置为0.即:

LPTSTR cmdline = GetCommandLine();
*cmdline = '\0';

老实说,我不知道这是否有用或可能产生什么后果,但它可能值得一试。