进程的创建
进程的启动过程
- 打开目标exe的映象文件
- 创建进程内核对象
- 映射NTDLL到内存
- 创建线程内核对象
- 通知子系统对进程进行管理
- 启动线程初始化空间和加载其他DLL
- 跳转到入口处开始执行
CreateProcess api
BOOL CreateProcess(
LPCTSTR lpApplicationName, // name of executable module
LPTSTR lpCommandLine, // command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
BOOL bInheritHandles, // handle inheritance option
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCTSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFO lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInformation // process information
);
//中文版注释
BOOL CreateProcess(
LPCTSTR lpApplicationName, // 可执行模块名称 (全路径 必须是const字符串
LPTSTR lpCommandLine, // 命令行(字符串 可以不是const字符串
LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程安全描述符
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程描述符
BOOL bInheritHandles, // 继承标志位
DWORD dwCreationFlags, // 创建标志位 (指定控制优先级和创建过程的额外标志,除了如前说,可以在任何组合中指定下列创建标标志
LPVOID lpEnvironment, // 进程环境块
LPCTSTR lpCurrentDirectory, // 驱动目录
LPSTARTUPINFO lpStartupInfo, // 启动信息 指向一个窗体结构,该接口体表示新进程的窗口应该如何出现
LPPROCESS_INFORMATION lpProcessInformation // 进程信息
);
//启动信息参数的结构体
typedef struct _STARTUPINFO {
DWORD cb; //记录指定结构体大小,以字节为单位
LPTSTR lpReserved;
LPTSTR lpDesktop;
LPTSTR lpTitle; //对于控制台进程,日过创建了新的控制欲窗口,则会显示标题栏中的标题,如果NULL。可执行文件额名称将会用作窗口标题, This parameter must be NULL for GUI or console processes that do not create a new console window.
DWORD dwX; //控制窗口位置x
DWORD dwY; //控制窗口位置y
DWORD dwXSize; //控制窗口宽度
DWORD dwYSize; //控制窗口高度
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow; //窗口显示方式
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
//进程信息结构体
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess; //进程句柄
HANDLE hThread; //主线程句柄
DWORD dwProcessId; //被创建的进程id
DWORD dwThreadId; //被创建的主线程ID
} PROCESS_INFORMATION;
exp: 启动qq
#include "stdafx.h"
#include
int main()
{
STARTUPINFO start_info = { 0 };
start_info.cb = sizeof STARTUPINFO;
PROCESS_INFORMATION process_info = { 0 };
CreateProcess(
L"C:\\Windows\\System32\\notepad.exe",
NULL,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&start_info,
&process_info
);
return 0;
}