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 ...
随机推荐
- 使用springboot方式配置监听器
//2.配置监听器 @Bean public ServletListenerRegistrationBean<DataInitializeListener> getDataInitiali ...
- Java8 新特性lambda表达式(一)初始
本篇参考Richard Warburton的 java8 Lambdas :Functional Programming for the Masses 学习lambda表达式之前,需要知道什么是函数式 ...
- 本地保存cookie
原文https://blog.csdn.net/qq_29663071/article/details/73826642 https://www.cnblogs.com/webcome/p/54709 ...
- throw throws try catch finally return
throw throw 语句用于抛出异常,例如 throw new EOFException(). throws 当使用throw 语句抛出checked 异常后,可以不用捕获异常并处理,而是使用 ...
- c#数据处理总结(分组、交并差与递归)
前言:最近项目比较忙,完全没有时间写下总结笔记,今天抽出时间来写下笔记,供写后台的你来做数据处理后台代码编写的参考. 一.分组 var GroupForList = numberList.GroupB ...
- Python练习题 010:分解质因数
[Python练习题 010]将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. -------------------------------------------------- ...
- (转)DBC文件格式解析
Dbc是描述CAN通信报文和信号信息的文件,用Vector Candb++打开. 用记事本打开后,可以看到固定格式,下面的博客做了详细的解析: https://blog.csdn.net/weixin ...
- 轻轻松松学CSS:Flex布局
Flex布局就是"弹性布局",它可以简便.完整.响应式地实现各种页面布局.引入弹性布局的目的,当页面需要适应不同的屏幕大小确保元素拥有恰当的布局方式,对一个容器中的子元素进行排列 ...
- minikube dashboard报503的错误
minikube start之后,minikube dashboard启动web界面报503错误 解决方案,删除掉c盘用户目录下的.kube和.minikube目录,重新启动,具体什么原因导致的呢,也 ...
- shell-的特殊变量-难点理论
一:shell的特殊变量-难点理论 1. $*和$@的区别例子 $* 将所有的命令行所有参数视为单个字符串,等同于"$1$2$3" $@ 将命令行每个参数视为单独 ...