我想从内部清除我的进程的命令行。例如,在任务管理器/进程资源管理器中查看我的进程时,命令行条目将为空。
我想在当前正在运行的流程中执行此操作,而不是在可能的情况下重新启动流程。
答案 0 :(得分:10)
我认为您必须修改流程RTL_USER_PROCESS_PARAMETERS的PEB部分(例如,请参阅http://en.wikipedia.org/wiki/Process_Environment_Block和http://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;
}
如果我们用一些参数启动程序,我们将看到
而不是之前见过的
答案 1 :(得分:2)
根据您上面的评论,您可能希望考虑通过环境变量传递密钥。如果在父进程环境中设置密钥,它将由子进程继承,并且对外部人员来说不会像命令行那样容易看到。
答案 2 :(得分:1)
您可以尝试调用GetCommandLine
API函数,然后将第一个字节设置为0.即:
LPTSTR cmdline = GetCommandLine();
*cmdline = '\0';
老实说,我不知道这是否有用或可能产生什么后果,但它可能值得一试。