Win32之创建进程
阅读原文时间:2023年07月08日阅读:2
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;
}