zoukankan      html  css  js  c++  java
  • 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
    ", GetLastError());
    		return FALSE;
    	}
    	//打印进程
    	printf("进程ID:%d
    ", pi.dwProcessId);
    	printf("线程ID:%d
    ", pi.dwThreadId);
    	printf("进程句柄:%d
    ", pi.hProcess);
    	printf("线程句柄:%d
    ", 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;
    }
    
  • 相关阅读:
    在Android studio中使用“.jpg”图片
    杨辉三角形简便代码
    Java中对象的理解
    对数据库的简单操作
    通过分析周榜前100名专家的博客文章 手把手教你写出爆款文章
    【Spring】4.助你跟面试官侃一个小时的IOC
    【Spring】3.助你跟面试官侃一个小时的AOP
    【Spring】2.如何给面试官讲SpringBean的声明周期
    【Spring】1. Spring概要综述
    【Java并发编程】8.面试不扯点JMM怎么显得专业呢
  • 原文地址:https://www.cnblogs.com/0x7e/p/13814951.html
Copyright © 2011-2022 走看看