进程/线程
- 程序只是一个起点,他打开的进程,线程才是真正工作的地方
- 进程是不会自动退出的,某个进程结束时会自动结束线程
- 每个
程序
最起码有一个进程
- 每个
进程
最起码有一个线程
- 多进程 允许多个任务同时运行
- 多线程 允许单个任务分成不同的部分运行
- 每个进程都拥有自己的独立的环境变量
- 进程之间的内存是隔离的
frida
可以跨平台操作内存每个
进程/线程
结束时都会发送信号WaitForMultiObjects
或者WaitForSingleObject
来等待关闭
处理器
->运行程序
->进程
->线程
winapi创建进程
winapi 创建的进程不会占用主进程
WinExec
- 打开一个程序/创建一个进程
- 只能指定 程序的 窗口状态
- 无法进行额外的操作
函数原型
UINT WinExec(
LPCSTR lpCmdLine,
UINT uCmdShow
);
ShellExecute
- 打开一个程序/创建一个进程
可以对打开的程序进行具体操作
- 窗口状态
- 程序目录
- 传递参数
- 父窗口
- 程序状态
- 等
函数原型
HINSTANCE ShellExecuteA(
HWND hwnd,
LPCSTR lpOperation,
LPCSTR lpFile,
LPCSTR lpParameters,
LPCSTR lpDirectory,
INT nShowCmd
);
CreateProcess
- 功能最强大的 进程创建工具
- 推荐使用
函数原型
- 在计划中
lpApplicationName
用来描述程序的路径,lpCommandLine
描述 程序打开后输入的命令行 - 实际我们的习惯是
c:\\bin\ex.exe -key word
这种混杂在一起的启动方式 - 所以建议的方式是
lpApplicationName=NULL
,lpCommandLine
直接写运行命令+参数
BOOL CreateProcessA(
//这里建议为NULL
LPCSTR lpApplicationName,
//这里不建议直接写参数,可能会有bug。建议把程序路径保存在 数组中,这里填写指针
LPSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFOA lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
安全退出进程
//结束调用的进程及其所有的线程
ExitProcess();
或
/*
杀死其他进程,这个很危险
它不会留给进程及其所有线程清理的时间
系统会马上终止(杀死)这个进程的所有线程,致使进程终止
*/
TerminateProcess(HANDLE hProcess,UINT uExitCode);
参考代码
三种创建进程的方法
// 1. winexec
WinExec("calc.exe", SW_SHOW);
// 2. ShellExecute
ShellExecuteA(NULL, "edit", "D:\\123.txt", NULL, NULL, SW_SHOWNORMAL);
ShellExecuteExA(NULL, "open", "www.baidu.com", NULL, NULL, SW_SHOWNORMAL);
ShellExecuteA(NULL, "explore", "D:\\", NULL, NULL, SW_SHOWNORMAL);
// 3 CreateProcess
char szCmdline[256] = {0};
strcpy_s(szCmdline, 256, "H:\\CR31\\windows\\03process\\planet\\game.exe");
STARTUPINFOA si = {0};
si.cb = sizeof(STARTUPINFOA);
PROCESS_INFORMATION pi;
BOOL bRet = CreateProcessA(NULL,
szCmdline,
NULL,
NULL,
FALSE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi);
// 退出进程
ExitProcess(0);
进程遍历
BOOL GetProcessList()
{
HANDLE hProcessSnap = NULL;
BOOL bRet = FALSE;
PROCESSENTRY32 pe32 = { 0 };
// Take a snapshot of all processes in the system.
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
return (FALSE);
// Fill in the size of the structure before using it.
pe32.dwSize = sizeof(PROCESSENTRY32);
// Walk the snapshot of the processes, and for each process,
// display information.
if (Process32First(hProcessSnap, &pe32))
{
DWORD dwPriorityClass;
BOOL bGotModule = FALSE;
MODULEENTRY32 me32 = { 0 };
do
{
OutputDebugString(pe32.szExeFile);
} while (Process32Next(hProcessSnap, &pe32));
bRet = TRUE;
}
else
bRet = FALSE; // could not walk the list of processes
// Do not forget to clean up the snapshot object.
CloseHandle(hProcessSnap);
return (bRet);
}