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;
}
Win32之创建进程的更多相关文章
- Win32 OpenProcess打开进程失败,返回5无权限操作
Win32 OpenProcess打开进程失败,返回5无权限操作,相信你会碰到这样的事,在IDE中可以,单独却不可以了,其实这时就需要提权了,否则是无法打开的,OpenProcess提权至Debug即 ...
- win32进程名查找进程PID
1. #include <Psapi.h> #pragma comment(lib, "Psapi.lib") DWORD GetProcIDFromName(LPCT ...
- linux创建进程fork的方法步骤
fork创建进程 函数原型如下 #include// 必须引入头文件,使用fork函数的时候,必须包含这个头文件,否则,系统找不到fork函数 pid_t fork(void); //void代表没有 ...
- CE创建进程和线程
创建进程: HWND hWnd = NULL; PROCESS_INFORMATION pi = {}; if(NULL==hWnd) { hWnd=FindWindow(NULL,_T(" ...
- Delphi 使用CreateProcess创建进程并弹出进程PID值 (转)
var ExeName:PChar; StartupInfo:TStartupInfo; ProcessInfo:TProcessInformation;begin FillChar(Proc ...
- 【转载】详解CreateProcess调用内核创建进程的过程
原文:详解CreateProcess调用内核创建进程的过程 昨天同学接到了腾讯的电面,有一题问到了CreateProcess创建进程的具体实现过程,他答得不怎么好吧应该是, 为了以防万一,也为了深入学 ...
- 详解CreateProcess调用内核创建进程的过程
昨天同学接到了腾讯的电面,有一题问到了CreateProcess创建进程的具体实现过程,他答得不怎么好吧应该是, 为了以防万一,也为了深入学习一下,今天我翻阅了好多资料,整理了一下,写篇博客,也算是加 ...
- android,JNI创建进程,使用fork()
long add(long x,long y) { pid_t fpid; //fpid表示fork函数返回的值 int count=0; fpid=fork(); if (fpid < 0) ...
- Windows平台下的session0创建进程的问题与解决办法
很多博客都有记载如何在session0下创建进程的办法,也就是使用CreateProcessAsUser.但是这个要求服务的进程有SE_INCREASE_QUOTA_NAME和SE_ASSIGNPRI ...
随机推荐
- Linux初步了解
文件系统类型:swap分区:用于内存扩充,用磁盘兑换,磁盘是内存的两倍,便于替换 / 分区:容纳根文件系统 文件名:由字母,数字,下划线,圆点组成 文件类型:显示在每一行的左边第一个字符 普通文件 ...
- Node.js文件上传
Node.js express使用Multer实现文件上传html部分 <div> <h3>文件上传:</h3> 选择一个文件上传: <br/> < ...
- vue+less换肤,主题切换方案
新的项目对于客户自定义要求很高,然后换肤是其中一个很小的模块,经过了一段时间的摸索,看了许多文章,找到了几种方案. https://www.cnblogs.com/leiting/p/11203383 ...
- 二维数组,column可以从后往前循环
- 软件定义网络实验记录①--Mininet 源码安装和可视化拓扑工具
第一步: 在 Ubuntu 系统的 home 目录下创建一个目录,目录名为自己的标识,包括但 不限于学号.姓名拼音等,目录不要包含中文. 第二步: 在创建的目录下,完成 Mininet 的源码安装. ...
- 中部:执具 | R语言数据分析(北京邮电大学)自整理笔记
第5章工欲善其事.必先利其器 代码,是延伸我们思想最好的工具. 第6章基础编程--用别人的包和函数讲述自己的故事 6.1编程环境 1.R语言的三段论 大前提:计算机语言程序=算法+数据结构 小前提:R ...
- Java知识系统回顾整理01基础02面向对象03方法
一.根据实例给出"方法"的定义 在LOL中,一个英雄可以做很多事情,比如超神,超鬼,坑队友 能做什么在类里面就叫做方法 比如队友残血正在逃跑,你过去把路给别人挡住了,导致他被杀掉. ...
- 【代码审计】JAVA代码审计
分享一些Java安全相关文章,其中大部分都涉及到代码的分析与审计. 大家总是在找Java的代码审计的文章,但好像很多人选择性失明. 其实Java没有和PHP一样的简单,所以你觉得你看到的文章不是入门级 ...
- Centos7安装Java8
centos7 用yum安装java8
- shell-整数测试多范例多生产案例举例
1. 整数测试举例范例1:整数条件测试举例 root@test-1 ~]# a1=10;a2=13 [root@test-1 ~]# echo $a1 $a2 10 13 [root@test-1 ~ ...