进程
进程内存空间的地址划分
| 分区 |
x86 |
| 空指针赋值区 |
0x00000000 - 0x0000FFFF |
| 用户模式区 |
0x00010000 - 0x7FFEFFFF |
| 64KB禁入区 |
0x7FFF0000 - 0x7FFFFFFF |
| 内核 |
0x80000000 - 0xFFFFFFFF |
进程的创建
任何进程都是其他进程创建的:CreateProcess()
进程的创建过程
映射EXE文件
创建内核对象EPROCESS
映射系统DLL(ntdll.dll)
创建线程内核对象ETHREAD
系统启动线程
- 映射DLL(ntdll.Ldrlnitialize Thunk)
- 线程开始执行
函数原型
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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 );
|
执行完毕后将信息储存到pi,
STRATUPINFO
每个进程都必须有一个STARTUPINFO结构体,由它的父进程创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| typedef struct _STARTUPINFOA { DWORD cb; LPSTR lpReserved; LPSTR lpDesktop; LPSTR lpTitle; DWORD dwX; DWORD dwY; DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD wShowWindow; WORD cbReserved2; LPBYTE lpReserved2; HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; } STARTUPINFOA, *LPSTARTUPINFOA;
|
使用C语言创建进程
在vs环境调试模式下执行需要先设置管理员限权,在项目属性里找到Linker>Manifest File>UAC Execution Level设置
,否则会返回740.
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 44 45 46 47 48 49
| #include<stdio.h> #include<Windows.h> #include<stdlib.h>
BOOL createChildProcess(PTCHAR szApplicationName, PTCHAR szCommandLine) {
STARTUPINFO si; PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si)); ZeroMemory(&pi, sizeof(pi));
si.cb = sizeof(si);
if (!CreateProcess( szApplicationName, szCommandLine, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi ) ) { DWORD err = GetLastError(); printf("createChildProcess err %d\n", err); return FALSE; }
CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return TRUE; }
int main() {
TCHAR szApplicationName[] = TEXT("D://脚本//ww//生成//ww.exe"); TCHAR szCommandLine[] = TEXT("test string");
createChildProcess(szApplicationName, NULL); system("pause"); }
|