跳至主要内容

5.创建进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <errhandlingapi.h>
#include <handleapi.h>
#include <minwindef.h>
#include <processthreadsapi.h>
#include <stdio.h>
#include <winnt.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,//对象名称
szCommandLine,//命令行
NULL,//不继承进程句柄
NULL,//不继承线程句柄
FALSE,//不继承句柄
0,//没有创建标志
NULL,//使用父进程环境变量
NULL,//使用父进程目录作为当前环境,可以自己设置目录
&si,//STARTUPINFO结构体详细信息
&pi//PROCESS_INFROMATION结构体进程信息
)){

printf(TEXT("CreateProcess 失败,错误码: %lu\n"), GetLastError());
return FALSE;
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return TRUE;
}


int main(int argc, char *argv[]) {
TCHAR szApplicationName[] = TEXT("C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe");
TCHAR szCmdline[] = TEXT("");
CreateChildProcess(szApplicationName,szCmdline);
getchar();
return 0;
}

  • 以上是利用win32创建进程的例子
  • 可以利用GetStartupInfo()函数来做一些反调试
1
2
3
4
5
void AntiDebug(){
STARTUPINFO si;
GetStartupInfo(&si);
printf("%x %x %x %x",si.dwX,si.dwY,si.dwXCountChars,si.dwFlags);
}

关于本文

由 GuQing 撰写,采用 CC BY-NC 4.0 许可协议。