进程

进程内存空间的地址划分

分区 x86
空指针赋值区 0x00000000 - 0x0000FFFF
用户模式区 0x00010000 - 0x7FFEFFFF
64KB禁入区 0x7FFF0000 - 0x7FFFFFFF
内核 0x80000000 - 0xFFFFFFFF

进程的创建

  1. 任何进程都是其他进程创建的:CreateProcess()

  2. 进程的创建过程

  3. 映射EXE文件

  4. 创建内核对象EPROCESS

  5. 映射系统DLL(ntdll.dll)

  6. 创建线程内核对象ETHREAD

  7. 系统启动线程

    • 映射DLL(ntdll.Ldrlnitialize Thunk)
    • 线程开始执行

函数原型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
BOOL CreateProcessA(
LPCSTR lpApplicationName, //进程名称
LPSTR lpCommandLine, //命令行参数
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags, //标志位,创建进程的方式
/*如果标志位为CREATE_SUSPENDED,
进程启动将暂停在启动线程*/
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFOA lpStartupInfo, //STARTUPINFO结构体的指针类型,必须
LPPROCESS_INFORMATION lpProcessInformation //PROCESS_INFOMATION的指针类型,必须
);

执行完毕后将信息储存到pi,

STRATUPINFO

每个进程都必须有一个STARTUPINFO结构体,由它的父进程创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
typedef struct _STARTUPINFOA {
DWORD cb; //The size of the structure, in bytes.
LPSTR lpReserved;
LPSTR lpDesktop;
LPSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFOA, *LPSTARTUPINFOA;

使用C语言创建进程

在vs环境调试模式下执行需要先设置管理员限权,在项目属性里找到Linker>Manifest File>UAC Execution Level设置
,否则会返回740.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>

BOOL createChildProcess(PTCHAR szApplicationName, PTCHAR szCommandLine) {

STARTUPINFO si;
PROCESS_INFORMATION pi;

/*内存清零*/
ZeroMemory(&si, sizeof(si));
ZeroMemory(&pi, sizeof(pi));

/*The size of the structure, in bytes.*/
si.cb = sizeof(si);

if (!CreateProcess(
szApplicationName,
szCommandLine,
NULL,
NULL,
FALSE,
NULL,
NULL,
NULL,
&si, /*注意这两个参数是指针类型*/
&pi /*返回进程信息*/
)
) {
DWORD err = GetLastError();
printf("createChildProcess err %d\n", err);
return FALSE;
}

/*释放句柄*/
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return TRUE;
}

int main() {

TCHAR szApplicationName[] = TEXT("D://脚本//ww//生成//ww.exe");
TCHAR szCommandLine[] = TEXT("test string");

createChildProcess(szApplicationName, NULL);
system("pause");
}