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 ) ;