用CreateProcess函数可以创建一个进程;
正常情况下CreateProcess做以下事情:创建一个进程的内核对象、给进程分配一个4GB的空间、加载pe:包括exe、dll、修复dll、创建主线程,把程序入口地址交给EIP
如果参数dwCreationFlags传入CREATE_SUSPENDED将以挂起的方式创建进程;
以这种方式创建的进程只有一个壳;也就是进程的主线程没有开始运行;
需要调用函数让进程的主线程恢复执行:
ResumeThread(ie_pi.hThread);
1)已挂起方式打开进程实例
例如:以挂起方式打开notpad++
#include<stdio.h>
#include<windows.h>
int main(int argc, char* argv[]){
TCHAR szAppName[256] = TEXT("D:\\Program Files\\Notepad++\\notepad++.exe");
STARTUPINFO si = {0}; //程序启动设置
si.cb = sizeof(si); //只需要传递结构大小即可
PROCESS_INFORMATION pi; //记录进程句柄信息等
::CreateProcess(
NULL,
szAppName,
NULL,
NULL,
FALSE,
CREATE_SUSPENDED,
NULL,
NULL,
&si,
&pi
);
//恢复主进程
//::ResumeThread(pi.hThread);
return 0;
}
当没有恢复主进程时,notepad++没有运行;
但任务管理器中可以看到notpad++的进程,只不过占内存比正常运行小,因为主线程根本没运行;