进程/线程

  1. 程序只是一个起点,他打开的进程,线程才是真正工作的地方
  2. 进程是不会自动退出的,某个进程结束时会自动结束线程
  3. 每个程序最起码有一个进程
  4. 每个进程最起码有一个线程
  5. 多进程 允许多个任务同时运行
  6. 多线程 允许单个任务分成不同的部分运行
  7. 每个进程都拥有自己的独立的环境变量
  8. 进程之间的内存是隔离的
  9. frida可以跨平台操作内存
  10. 每个进程/线程 结束时都会发送信号

    1. WaitForMultiObjects 或者 WaitForSingleObject 来等待关闭

处理器
      ->运行程序
                ->进程
                      ->线程
                      

winapi创建进程

winapi 创建的进程不会占用主进程

WinExec

  1. 打开一个程序/创建一个进程
  2. 只能指定 程序的 窗口状态
  3. 无法进行额外的操作

函数原型

    UINT WinExec(
      LPCSTR lpCmdLine,
      UINT   uCmdShow
    );

ShellExecute

  1. 打开一个程序/创建一个进程
  2. 可以对打开的程序进行具体操作

    1. 窗口状态
    2. 程序目录
    3. 传递参数
    4. 父窗口
    5. 程序状态

函数原型

    HINSTANCE ShellExecuteA(
      HWND   hwnd,
      LPCSTR lpOperation,
      LPCSTR lpFile,
      LPCSTR lpParameters,
      LPCSTR lpDirectory,
      INT    nShowCmd
    );

CreateProcess

  1. 功能最强大的 进程创建工具
  2. 推荐使用

函数原型

  1. 在计划中 lpApplicationName 用来描述程序的路径,lpCommandLine描述 程序打开后输入的命令行
  2. 实际我们的习惯是 c:\\bin\ex.exe -key word 这种混杂在一起的启动方式
  3. 所以建议的方式是 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);
    }
Last modification:November 19, 2020
如果觉得我的文章对你有用,请随意赞赏