进程的创建

进程的启动过程

  1. 打开目标exe的映象文件
  2. 创建进程内核对象
  3. 映射NTDLL到内存
  4. 创建线程内核对象
  5. 通知子系统对进程进行管理
  6. 启动线程初始化空间和加载其他DLL
  7. 跳转到入口处开始执行

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

Q.E.D.