C++ 获取进程启动参数

博客参考:获取进程的信息

下面代码为获取进程启动参数代码:ProcUtils.h

#pragma once

#define NT_SUCCESS(x) ((x) >= 0)
#define ProcessBasicInformation 0

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

typedef LONG(WINAPI* pfnNtReadVirtualMemory)(
			HANDLE ProcessHandle, PVOID BaseAddress,
			PVOID Buffer,
			ULONG NumberOfBytesToRead,
			PULONG NumberOfBytesReaded);
			
typedef NTSTATUS(NTAPI *pfnNtWow64ReadVirtualMemory64)(
	IN HANDLE ProcessHandle,
	IN PVOID64 BaseAddress,
	OUT PVOID Buffer,
	IN ULONG64 Size,
	OUT PULONG64 NumberOfBytesRead
	);

typedef
NTSTATUS(WINAPI *pfnNtQueryInformationProcess)
(HANDLE ProcessHandle, ULONG ProcessInformationClass,
PVOID ProcessInformation, UINT32 ProcessInformationLength,
UINT32* ReturnLength);

typedef struct _PROCESS_BASIC_INFORMATION32 {
	NTSTATUS ExitStatus;
	UINT32 PebBaseAddress;
	UINT32 AffinityMask;
	UINT32 BasePriority;
	UINT32 UniqueProcessId;
	UINT32 InheritedFromUniqueProcessId;
} PROCESS_BASIC_INFORMATION32;

typedef struct _UNICODE_STRING32
{
	USHORT Length;
	USHORT MaximumLength;
	PWSTR Buffer;
} UNICODE_STRING32, *PUNICODE_STRING32;

typedef struct _PEB32
{
	UCHAR InheritedAddressSpace;
	UCHAR ReadImageFileExecOptions;
	UCHAR BeingDebugged;
	UCHAR BitField;
	ULONG Mutant;
	ULONG ImageBaseAddress;
	ULONG Ldr;
	ULONG ProcessParameters;
	ULONG SubSystemData;
	ULONG ProcessHeap;
	ULONG FastPebLock;
	ULONG AtlThunkSListPtr;
	ULONG IFEOKey;
	ULONG CrossProcessFlags;
	ULONG UserSharedInfoPtr;
	ULONG SystemReserved;
	ULONG AtlThunkSListPtr32;
	ULONG ApiSetMap;
} PEB32, *PPEB32;

typedef struct _RTL_USER_PROCESS_PARAMETERS32 {
	BYTE Reserved1[16];
	ULONG Reserved2[10];
	UNICODE_STRING32 ImagePathName;
	UNICODE_STRING32 CommandLine;
} RTL_USER_PROCESS_PARAMETERS32, *PRTL_USER_PROCESS_PARAMETERS32;

typedef struct _PEB_LDR_DATA32
{
	ULONG Length;
	BOOLEAN Initialized;
	ULONG SsHandle;
	LIST_ENTRY32 InLoadOrderModuleList;
	LIST_ENTRY32 InMemoryOrderModuleList;
	LIST_ENTRY32 InInitializationOrderModuleList;
	ULONG EntryInProgress;
} PEB_LDR_DATA32, *PPEB_LDR_DATA32;

typedef struct _LDR_DATA_TABLE_ENTRY32
{
	LIST_ENTRY32 InLoadOrderLinks;
	LIST_ENTRY32 InMemoryOrderModuleList;
	LIST_ENTRY32 InInitializationOrderModuleList;
	ULONG DllBase;
	ULONG EntryPoint;
	ULONG SizeOfImage;
	UNICODE_STRING32 FullDllName;
	UNICODE_STRING32 BaseDllName;
	ULONG Flags;
	USHORT LoadCount;
	USHORT TlsIndex;
	union
	{
		LIST_ENTRY32 HashLinks;
		ULONG SectionPointer;
	};
	ULONG CheckSum;
	union
	{
		ULONG TimeDateStamp;
		ULONG LoadedImports;
	};
	ULONG EntryPointActivationContext;
	ULONG PatchInformation;
} LDR_DATA_TABLE_ENTRY32, *PLDR_DATA_TABLE_ENTRY32;

typedef struct _PROCESS_BASIC_INFORMATION64 {
	NTSTATUS ExitStatus;
	UINT32 Reserved0;
	UINT64 PebBaseAddress;
	UINT64 AffinityMask;
	UINT32 BasePriority;
	UINT32 Reserved1;
	UINT64 UniqueProcessId;
	UINT64 InheritedFromUniqueProcessId;
} PROCESS_BASIC_INFORMATION64;

typedef struct _PEB64
{
	UCHAR InheritedAddressSpace;
	UCHAR ReadImageFileExecOptions;
	UCHAR BeingDebugged;
	UCHAR BitField;
	ULONG64 Mutant;
	ULONG64 ImageBaseAddress;
	ULONG64 Ldr;
	ULONG64 ProcessParameters;
	ULONG64 SubSystemData;
	ULONG64 ProcessHeap;
	ULONG64 FastPebLock;
	ULONG64 AtlThunkSListPtr;
	ULONG64 IFEOKey;
	ULONG64 CrossProcessFlags;
	ULONG64 UserSharedInfoPtr;
	ULONG SystemReserved;
	ULONG AtlThunkSListPtr32;
	ULONG64 ApiSetMap;
} PEB64, *PPEB64;

typedef struct _PEB_LDR_DATA64
{
	ULONG Length;
	BOOLEAN Initialized;
	ULONG64 SsHandle;
	LIST_ENTRY64 InLoadOrderModuleList;
	LIST_ENTRY64 InMemoryOrderModuleList;
	LIST_ENTRY64 InInitializationOrderModuleList;
	ULONG64 EntryInProgress;
} PEB_LDR_DATA64, *PPEB_LDR_DATA64;

typedef struct _UNICODE_STRING64
{
	USHORT Length;
	USHORT MaximumLength;
	ULONG64 Buffer;
} UNICODE_STRING64, *PUNICODE_STRING64;

typedef struct _LDR_DATA_TABLE_ENTRY64
{
	LIST_ENTRY64 InLoadOrderLinks;
	LIST_ENTRY64 InMemoryOrderModuleList;
	LIST_ENTRY64 InInitializationOrderModuleList;
	ULONG64 DllBase;
	ULONG64 EntryPoint;
	ULONG SizeOfImage;
	UNICODE_STRING64 FullDllName;
	UNICODE_STRING64 BaseDllName;
	ULONG Flags;
	USHORT LoadCount;
	USHORT TlsIndex;
	union
	{
		LIST_ENTRY64 HashLinks;
		ULONG64 SectionPointer;
	};
	ULONG CheckSum;
	union
	{
		ULONG TimeDateStamp;
		ULONG64 LoadedImports;
	};
	ULONG64 EntryPointActivationContext;
	ULONG64 PatchInformation;
} LDR_DATA_TABLE_ENTRY64, *PLDR_DATA_TABLE_ENTRY64;

typedef struct _RTL_USER_PROCESS_PARAMETERS64 {
	BYTE Reserved1[16];
	ULONG64 Reserved2[10];
	UNICODE_STRING64 ImagePathName;
	UNICODE_STRING64 CommandLine;
} RTL_USER_PROCESS_PARAMETERS64, *PRTL_USER_PROCESS_PARAMETERS64;

class ProcUtils
{
public:
	static bool get_proc_id(const std::string& proc_name, DWORD &pid);
	static int get_proc_command(DWORD pid, std::string& cmd_line);
};


ProcUtils.cpp

#include "stdafx.h"
#include "ProcUtils.h"
#include <algorithm>
#include <Tlhelp32.h>
#include "StringUtil.h"

bool ProcUtils::get_proc_id(const std::string& proc_name, DWORD& pid)
{
	pid = 0;
	HANDLE proc_snap = INVALID_HANDLE_VALUE;
	bool ret_value = false;
	do {
		if (!proc_name.length()) break;
		std::string proc_name_tmp = proc_name;
		std::transform(proc_name_tmp.begin(), proc_name_tmp.end(), proc_name_tmp.begin(), ::tolower);
		proc_snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
		if (INVALID_HANDLE_VALUE == proc_snap) break;
		PROCESSENTRY32 pe32;
		pe32.dwSize = sizeof(pe32);
		BOOL flag = ::Process32First(proc_snap, &pe32);
		while (flag)
		{
			std::string exe_name = pe32.szExeFile;
			std::transform(exe_name.begin(), exe_name.end(), exe_name.begin(), ::tolower);
			if (exe_name == proc_name_tmp)
			{
				ret_value = true;
				pid = pe32.th32ProcessID;
				break;
			}
			flag = ::Process32Next(proc_snap, &pe32);
		}
	} while (0);

	if (INVALID_HANDLE_VALUE != proc_snap)
	{
		CloseHandle(proc_snap);
		proc_snap = INVALID_HANDLE_VALUE;
	}
	return ret_value;
}

int ProcUtils::get_proc_command(DWORD pid, std::wstring& cmd_line) 
{
	
	commandline.clear();
			DWORD dwProcessId = -1;
			GetProcessId(szProcessName, dwProcessId);
			if (dwProcessId == -1) return -1;
			HANDLE proc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_ALL_ACCESS, false, dwProcessId);
			int err = GetLastError();
			if (NULL == proc) return err;

			BOOL bTarget = FALSE;
			BOOL bSource = FALSE;
			IsWow64Process(GetCurrentProcess(), &bSource);
			IsWow64Process(proc, &bTarget);

			//self x64
			if (!bSource)
			{
				HMODULE NtdllModule = GetModuleHandle(_T("ntdll.dll"));
				pfnNtQueryInformationProcess NtQueryInformationProcess = (pfnNtQueryInformationProcess)GetProcAddress(NtdllModule, "NtQueryInformationProcess");
				pfnNtReadVirtualMemory NtReadVirtualMemory = (pfnNtReadVirtualMemory)GetProcAddress(GetModuleHandle(_T("ntdll.dll")), "NtReadVirtualMemory");
				PROCESS_BASIC_INFORMATION64 pbi64 = { 0 };
				if (NT_SUCCESS(NtQueryInformationProcess(proc, ProcessBasicInformation, &pbi64, sizeof(pbi64), NULL)))
				{
					PEB64 peb = { 0 };
					if (NT_SUCCESS(NtReadVirtualMemory(proc, (PVOID64)(pbi64.PebBaseAddress), &peb, sizeof(peb), NULL)))
					{
						RTL_USER_PROCESS_PARAMETERS64 user_proc_params = { 0 };
						if (NT_SUCCESS(NtReadVirtualMemory(proc, (PVOID64)(peb.ProcessParameters), &user_proc_params, sizeof(user_proc_params), NULL)))
						{
							wchar_t buf[4096] = { 0 };
							DWORD data_size = user_proc_params.CommandLine.Length > 4090 ? 4090 : user_proc_params.CommandLine.Length;
							if (NT_SUCCESS(NtReadVirtualMemory(proc, (PVOID64)(user_proc_params.CommandLine.Buffer), &buf, data_size, NULL)))
							{
								commandline = std::wstring(buf + 1);
							}
						}
					}
				}
			}
			//self x86
			else
			{
				//target x86
				if (bTarget)
				{
					HMODULE NtdllModule = GetModuleHandle(_T("ntdll.dll"));
					pfnNtQueryInformationProcess NtQueryInformationProcess = (pfnNtQueryInformationProcess)GetProcAddress(NtdllModule, "NtQueryInformationProcess");
					PROCESS_BASIC_INFORMATION32 pbi32 = { 0 };
					if (NT_SUCCESS(NtQueryInformationProcess(proc, ProcessBasicInformation, &pbi32, sizeof(pbi32), NULL)))
					{
						PEB32 peb = { 0 };
						if (ReadProcessMemory(proc, (PVOID)(pbi32.PebBaseAddress), &peb, sizeof(peb), NULL))
						{
							RTL_USER_PROCESS_PARAMETERS32 user_proc_params = { 0 };
							if (ReadProcessMemory(proc, (PVOID)(peb.ProcessParameters), &user_proc_params, sizeof(user_proc_params), NULL))
							{
								wchar_t buf[4096] = { 0 };
								DWORD data_size = user_proc_params.CommandLine.Length > 4090 ? 4090 : user_proc_params.CommandLine.Length;
								if (ReadProcessMemory(proc, (PVOID)(user_proc_params.CommandLine.Buffer), &buf, data_size, NULL))
								{
									commandline = std::wstring(buf + 1);
								}
							}
						}
					}
				}
				//target x64
				else
				{
					HMODULE NtdllModule = GetModuleHandle(_T("ntdll.dll"));
					pfnNtWow64QueryInformationProcess64 NtWow64QueryInformationProcess64 = (pfnNtWow64QueryInformationProcess64)GetProcAddress(NtdllModule, "NtWow64QueryInformationProcess64");
					pfnNtWow64ReadVirtualMemory64 NtWow64ReadVirtualMemory64 = (pfnNtWow64ReadVirtualMemory64)GetProcAddress(NtdllModule, "NtWow64ReadVirtualMemory64");
					PROCESS_BASIC_INFORMATION64 pbi64 = { 0 };
					if (NT_SUCCESS(NtWow64QueryInformationProcess64(proc, ProcessBasicInformation, &pbi64, sizeof(pbi64), NULL)))
					{
						PEB64 peb = { 0 };
						if (NT_SUCCESS(NtWow64ReadVirtualMemory64(proc, (PVOID64)(pbi64.PebBaseAddress), &peb, sizeof(peb), NULL)))
						{
							RTL_USER_PROCESS_PARAMETERS64 user_proc_params = { 0 };
							if (NT_SUCCESS(NtWow64ReadVirtualMemory64(proc, (PVOID64)(peb.ProcessParameters), &user_proc_params, sizeof(user_proc_params), NULL)))
							{
								wchar_t buf[4096] = { 0 };
								DWORD data_size = user_proc_params.CommandLine.Length > 4090 ? 4090 : user_proc_params.CommandLine.Length;
								if (NT_SUCCESS(NtWow64ReadVirtualMemory64(proc, (PVOID64)(user_proc_params.CommandLine.Buffer), &buf, data_size, NULL)))
								{
									commandline = std::wstring(buf + 1);
								}
							}
						}
					}
				}
			}
			CloseHandle(proc);
			return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Linux 平台上,可以使用 `fork()` 系统调用创建子进程,并使用 `getpid()` 函数获取进程的 PID 和获取进程的 PID。如果要在进程 XXX 中启动进程 YYY,可以使用 `fork()` 创建子进程,然后在子进程中使用 `execvp()` 函数启动进程 YYY。以下是一个示例代码: ```c++ #include <iostream> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main() { pid_t pid = fork(); if (pid == 0) { // 子进程 char* args[] = {"./YYY", NULL}; execvp(args[0], args); // 如果 execvp() 返回,则启动进程 YYY 失败 std::cerr << "启动进程 YYY 失败" << std::endl; return 1; } else if (pid > 0) { // 父进程 std::cout << "父进程的 PID: " << getpid() << std::endl; std::cout << "子进程的 PID: " << pid << std::endl; int status; waitpid(pid, &status, 0); std::cout << "子进程退出状态: " << WEXITSTATUS(status) << std::endl; } else { // fork() 失败 std::cerr << "fork() 失败" << std::endl; return 1; } return 0; } ``` 在上述代码中,我们使用 `fork()` 创建了一个子进程。在子进程中,我们使用 `execvp()` 函数启动进程 YYY;在父进程中,我们使用 `waitpid()` 函数等待子进程退出,并使用 `WEXITSTATUS()` 函数获取进程的退出状态并输出到控制台。需要注意的是,`execvp()` 函数如果返回则启动进程 YYY 失败,因此需要在子进程中处理启动失败的情况。在调用 `waitpid()` 函数时,第三个参数为 0 表示等待子进程退出,如果传入 WNOHANG 则表示非阻塞等待,即如果子进程没有退出,则立即返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值