Win32之创建进程

CreateProcess函数介绍

BOOL CreateProcessA(
		LPCSTR lpApplicationName,                   //可执行文件的名称完整的路径+程序名字)
		LPSTR lpCommandLine,                        //指定了要传递给执行模块的参数
		LPSECURITY_ATTRIBUTES lpProcessAttributes,  //进程安全性
		LPSECURITY_ATTRIBUTES lpThreadAttributes,   //线程安全性
		BOOL bInheritHandles,                       //指定了当前进程中可继承句柄是否可被新进程继承
		DWORD dwCreationFlags,                      //指定进程优先级和其它创建标志
		LPVOID lpEnvironment,                       //指定新进程使用的环境变量
		LPCSTR lpCurrentDirectory,                  //新进程使用的当前目录
		LPSTARTUPINFOA lpStartupInfo,               //指定新进程中主窗口的位置、大小和标准句柄等
		LPPROCESS_INFORMATION lpProcessInformation  //返回新建进程的标志信息,如ID号、句柄等
	);


typedef struct _STARTUPINFO {
	DWORD cb;                //本结构的长度 
	LPTSTR lpReserved;       //保留字段 
	LPTSTR lpDesktop;        //指定一个字符串,包括该进程的桌面名或窗口位置名
	LPTSTR lpTitle;          //指定控制台进程创建的新控制台窗口标题 
	DWORD dwX;               //指定新窗口的左上角的 x 和 y 的偏移量(以像素为单位)
	DWORD dwY; 
	DWORD dwXSize;           //指定新窗口的宽度和高度
	DWORD dwYSize; 
	DWORD dwXCountChars;     //指定新窗口的屏幕缓冲区宽度和高度
	DWORD dwYCountChars; 
	DWORD dwFillAttribute;   //指定新窗口的初始文字和背景颜色
	DWORD dwFlags;           //创建窗口标志
	WORD wShowWindow;        //新窗口显示状态 
	WORD cbReserved2;        //保留,必须为0 
	LPBYTE lpReserved2;      //保留,必须为NULL 
	HANDLE hStdInput;        //指定一个句柄,该句柄用作进程的标准输入句柄
	HANDLE hStdOutput;       //指定一个句柄,改句柄作为进程的标准输出句柄
	HANDLE hStdError;        //指定一个句柄,该句柄用作进程的标准错误句柄
} STARTUPINFO, *LPSTARTUPINFO;

typedef struct _PROCESS_INFORMATION {
    HANDLE hProcess;           //进程句柄
    HANDLE hThread;            //线程句柄
    DWORD dwProcessId;         //进程id
    DWORD dwThreadId;          //线程id
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;

什么是命令行?

#include <stdio.h>

int main(int argc, char* argv[])
{
	printf("%s - %s", argv[0], argv[1]);
	return 0;
}

说明把参数传了进去,这就是命令行
创建新的控制台 :

CreateProcess(
	NULL,
	TEXT("cmd"),
	NULL,
	NULL,
	FALSE,
	CREATE_NEW_CONSOLE,
	NULL,
	NULL, 
	&si,
	&pi); 

创建非控制台进程 :

CreateProcess(NULL,
	"notepad.exe", 
	NULL,
	NULL,
	FALSE,
	NULL,
	NULL,
	NULL,
	&si, 
	&pi); 

创建自定义程序的进程 :

CreateProcess(
	NULL,
	"child.exe", 
	NULL, 
	NULL, 
	FALSE, 
	CREATE_NEW_CONSOLE,   ////指定进程优先级和其它创建标志
	NULL, 
	NULL, 
	&si, 
	&pi);

创建进程

#include <stdio.h>
#include <windows.h>

BOOL CreateChildProcess(PTCHAR szChildProcessName, PTCHAR szCommandLine)
{
	STARTUPINFO si;
	PROCESS_INFORMATION pi;

	ZeroMemory(&pi, sizeof(pi));
	ZeroMemory(&si, sizeof(si));
	si.cb = sizeof(si);

	//创建子进程 返回成功与失败
	if (!CreateProcess(
		szChildProcessName,  //对象名称(完整的路径+exe)
		szCommandLine,		 //命令行
		NULL,				 //不继承进程句柄
		NULL,				 //不继承线程句柄
		FALSE,				 //不继承句柄
		0,				     //没有创建标志
		NULL,                //使用父进程环境变量
		NULL,				 //使用父进程目录作为当前目录,可以自己设置目录
		&si,				 //STARTUPINFOW结构体详细信息
		&pi)				 //PROCESS_INFOMATION结构体进程信息
	) 
	{
		printf("CreateChildProces Error: %d\n", GetLastError());
		return FALSE;
	}
	//打印进程
	printf("进程ID:%d\n", pi.dwProcessId);
	printf("线程ID:%d\n", pi.dwThreadId);
	printf("进程句柄:%d\n", pi.hProcess);
	printf("线程句柄:%d\n", pi.hThread);

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


int main(int argc, char* argv[])
{
	TCHAR szApplicationName[] = TEXT("C:/Users/86183/Desktop/shellcode.exe");
	//TCHAR szCmdline[] = TEXT("ipconfig");
	CreateChildProcess(szApplicationName, NULL);

	getchar();
	return 0;
}
posted @ 2020-10-15 10:51  0X7e  阅读(218)  评论(0编辑  收藏  举报