天天看点

创建进程-CreateProcess (二)

STARTUPINFO结构中的cb字段表示该结构的长度,表示子进程继承父进程的STARTUPINFO结构。

如果要修改子进程的启动信息,就要先获取到父进程的信息,然后再设置STARTUPINFO结构中的相应字段。

如下隐藏启动一个程序:

char lpPath[] = "notepad.exe" ;
	STARTUPINFO si = { sizeof(si) } ;
	// 设置STARTF_USESHOWWINDOW标记,使得STARTUPINFO结构的wShowWindow字段有效
	si.dwFlags |= STARTF_USESHOWWINDOW ;	
	// 设置窗口的显示方式,SW_HIDE表示隐藏方式
	si.wShowWindow = SW_HIDE ;

	PROCESS_INFORMATION pi ;
	BOOL bStatus = CreateProcess ( NULL, lpPath, NULL, NULL, FALSE, 0,NULL, NULL, &si, &pi ) ;
	if ( bStatus == FALSE )
	{
		MessageBox ( 0, "CreateProcess error, notepad.exe", 0, 0 ) ;
		return ;
	}
           

在创建子进程的时候使用CREATE_SUSPENDED标记使子进程挂起,此时子进程还没有初始化,然后就可以调用进程中处理子进程的数据和代码,比如:对子进程进行数据处理和模块注入(HOOK)等操作,最后再恢复执行。

WCHAR lpPath[] = L"notepad.exe" ;
	STARTUPINFO si = { sizeof(si) } ;
	PROCESS_INFORMATION pi ;
	// 步骤1:使用CREATE_SUSPENDED创建挂起进程
	BOOL bStatus = CreateProcess ( NULL, lpPath, NULL, NULL, FALSE, CREATE_SUSPENDED,NULL, NULL, &si, &pi ) ;
	if ( bStatus == FALSE )
	{
		MessageBox ( 0, L"CreateProcess error, notepad.exe", 0, 0 ) ;
		return ;
	}

	// 步骤2:在这里对子进程进行数据处理和模块注入等操作
	// ……
	// 步骤3:恢复执行
	ResumeThread ( pi.hThread ) ;