一、什么是进程
进程提供程序所需的资源,如:数据、代码等等。
二、进程内存空间的地址划分
三、进程的组成部分:模块
在OD中查看进程所包含的模块。
每个模块都是一个可执行文件,遵守相同的格式,即PE结构
四、进程的创建:
任何进程都是别的进程创建的:CreateProcess()
进程的创建过程
1、映射EXE文件
2、创建内核对象EPROCESS
3、映射系统DLL(ntdll.dll)
4、创建线程内核对象ETHREAD
5、系统启动线程
映射DLL(ntdll.LdrInitializeThunk)
线程开始执行
五、创建一个子进程
1、定义一个创建子进程的函数CreateProcess
,需要两个参数,一个要运行的程序路径,一个是命令行参数(命令行参数可以为空)
BOOL CreateProcess(PTCHAR route,PTCHAR szCommandLine)
{
}
2、定义两个结构体,因为下面判断创建子进程是否成功,根据返回句柄和id来进行判断
定义两个结构体
STARTUPINFO si;
PROCESS_INFORMATION pi ;
//初始化结构体
ZeroMemory(&pi,sizeof(pi));
ZeroMemory(&si,sizeof(si));
//si结构体的cb 必须要赋值
si.cb = sizeof(si);
3、判断创建子进程是否成功,如果没成功打印错误编号
//创建子程序 返回成功与失败
if(!CreateProcess(
route, //打开程序的路径
szCommandLine, //命令行参数
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si, //创建子进程的详细信息(只需要赋值大下,其余可以不用管)
&pi) //存储的是进程ID,线程ID,进程句柄,线程句柄
)
{//打印错误信息
printf("Error:%d\n",GetLastError());
return FALSE;
}
4、释放句柄
释放句柄
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return TRUE;
5、调用函数
int main(int argc, char* argv[])
{
TCHAR route[] = TEXT("C://Program Files//Tools//DTDebug//DTDebug.exe");
CreateProcess(route,NULL); //程序路径,命令行参数
return 0;
}
6、完整代码
#include "stdafx.h"
#include "windows.h"
//打开子进程函数
BOOL CreateProcess(PTCHAR route,PTCHAR szCommandLine)
{
//定义两个结构体
STARTUPINFO si;
PROCESS_INFORMATION pi ;
//初始化结构体
ZeroMemory(&pi,sizeof(pi));
ZeroMemory(&si,sizeof(si));
//si结构体的cb 必须要赋值
si.cb = sizeof(si);
//创建子程序 返回成功与失败
if(!CreateProcess(
route, //打开程序的路径
szCommandLine, //命令行参数
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si, //创建子进程的详细信息
&pi) //存储的是进程ID,线程ID,进程句柄,线程句柄
)
{//打印错误信息
printf("Error:%d\n",GetLastError());
return FALSE;
}
//释放句柄
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return TRUE;
}
int main(int argc, char* argv[])
{
TCHAR route[] = TEXT("C://Program Files//Tools//DTDebug//DTDebug.exe");
//TCHAR szCmdLine[] = TEXT("https://www.ifeng.com");
CreateProcess(route,NULL); //程序路径,命令行参数
return 0;
}