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之创建进程的更多相关文章

  1. Win32 OpenProcess打开进程失败,返回5无权限操作

    Win32 OpenProcess打开进程失败,返回5无权限操作,相信你会碰到这样的事,在IDE中可以,单独却不可以了,其实这时就需要提权了,否则是无法打开的,OpenProcess提权至Debug即 ...

  2. win32进程名查找进程PID

    1. #include <Psapi.h> #pragma comment(lib, "Psapi.lib") DWORD GetProcIDFromName(LPCT ...

  3. linux创建进程fork的方法步骤

    fork创建进程 函数原型如下 #include// 必须引入头文件,使用fork函数的时候,必须包含这个头文件,否则,系统找不到fork函数 pid_t fork(void); //void代表没有 ...

  4. CE创建进程和线程

    创建进程: HWND hWnd = NULL; PROCESS_INFORMATION pi = {}; if(NULL==hWnd) { hWnd=FindWindow(NULL,_T(" ...

  5. Delphi 使用CreateProcess创建进程并弹出进程PID值 (转)

    var  ExeName:PChar;  StartupInfo:TStartupInfo;  ProcessInfo:TProcessInformation;begin  FillChar(Proc ...

  6. 【转载】详解CreateProcess调用内核创建进程的过程

    原文:详解CreateProcess调用内核创建进程的过程 昨天同学接到了腾讯的电面,有一题问到了CreateProcess创建进程的具体实现过程,他答得不怎么好吧应该是, 为了以防万一,也为了深入学 ...

  7. 详解CreateProcess调用内核创建进程的过程

    昨天同学接到了腾讯的电面,有一题问到了CreateProcess创建进程的具体实现过程,他答得不怎么好吧应该是, 为了以防万一,也为了深入学习一下,今天我翻阅了好多资料,整理了一下,写篇博客,也算是加 ...

  8. android,JNI创建进程,使用fork()

    long add(long x,long y) { pid_t fpid; //fpid表示fork函数返回的值 int count=0; fpid=fork(); if (fpid < 0) ...

  9. Windows平台下的session0创建进程的问题与解决办法

    很多博客都有记载如何在session0下创建进程的办法,也就是使用CreateProcessAsUser.但是这个要求服务的进程有SE_INCREASE_QUOTA_NAME和SE_ASSIGNPRI ...

随机推荐

  1. Asp.Net Core SignalR 系列博客

    系列 SignalR+Vue SignalR+Vue 服务端向客户端发送信息 SignalR+Vue+Log4net 实时日志推送 待定...... 源码地址:https://github.com/Q ...

  2. 关于Linux软连接和硬链接

    (注:此文章仅为个人学习,研究,原创作者:iTech,原创文章网址:https://www.cnblogs.com/itech/archive/2009/04/10/1433052.html) 1.L ...

  3. burp suite 之 Decoder(解码) Comparer(比较器) Extender(扩展)

    Decoder模块 将原始数据转换成各种编码和哈希表的简单工具,它能够智能地识别多种编码格式 Decoder as..解码 Encode as...编码 Hash : 哈希值计算 Smart deco ...

  4. 与Bat脚本的故事

    因为工作时需要将定时处理的业务抽出来,废弃通过监听定时调用的这种方法,改为通过第三方软件定时执行bat脚本来实现,所以学习了一下bat脚本,整理出一些学习中的基础点和重点. 基础点: (1)bat脚本 ...

  5. 剑指offer-字符串&数字规律

    1. 表示数值的字符串 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123",&q ...

  6. 063 01 Android 零基础入门 01 Java基础语法 08 Java方法 01 无参无返回值方法

    063 01 Android 零基础入门 01 Java基础语法 08 Java方法 01 无参无返回值方法 本文知识点:无参无返回值方法 无参无返回值方法 案例 为什么使用方法?--方便复杂问题调用 ...

  7. 043 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 05 do-while循环介绍及应用

    043 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 05 do-while循环介绍及应用 本文知识点:do-while循环介绍及应用 do-while循 ...

  8. 019 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 13 数据类型转换的代码示例

    019 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 13 数据类型转换的代码示例 本文知识点:Java中的数据类型转换案例 学习视频有误,导致没法写文,文章内容 ...

  9. matlab中imfilter、conv2、imfilter2用法及区别

    来源 :https://blog.csdn.net/u013066730/article/details/56665308(比较详细) https://blog.csdn.net/yuanhuilin ...

  10. 九、Python+Selenium模拟登录

    研究QQ登录规则的话,得分析大量Javascript的加密解密,比较耗时间.自己也是练习很少,短时间成功不了.所以走了个捷径. Selenium是一个WEB自动化测试工具,它运行时会直接实例化出一个浏 ...