WIN32核心編程 - 進程操作(一) 進程基礎 - 創建進程 - 進程句柄

  • 公開視頻 ->?鏈接點擊跳轉公開課程
  • 博客首頁 ->?鏈接點擊跳轉博客主頁

目錄

進程基礎

進程的定義與概念

進程的組成

創建進程

可執行文件

CreateProces

執行流程

GetStartupInfo

進程終止?

進程句柄

創建進程

打開進程

進程提權

內核模擬

回溯對象

自身進程

?


  • 進程基礎

    • 進程的定義與概念

      • 什么是進程?

      • 進程可以被定義為一個執行中程序的實例。

      • 進程提供了程序執行所需的所有資源和環境。

      • 進程與程序的區別

      • 程序是一組指令和靜態數據的集合,它是存儲在磁盤或其他永久存儲設備上的一個文件。

      • 進程,與之相對,是程序的動態執行實例。程序本身不執行任何操作;當它被操作系統加載到內存并開始執行時,它變成一個或多個進程。

    • 進程的組成

      • 進程內存布局(代碼段、數據段、堆、棧等)

      • 代碼段(Text Segment)

        • 也稱為文本區域,包含程序的可執行代碼。

        • 通常是只讀的,以防止程序自我修改。

      • 數據段(Data Segment)

        • 存儲程序中的全局變量和靜態變量。

        • 根據變量是否初始化分為初始化的數據段和未初始化的數據段(BSS)。

      • 堆(Heap)

        • 用于動態內存分配,如C中的malloc或C++中的new操作。

        • 堆的大小可以在運行時動態擴展和收縮。

      • 棧(Stack)

        • 存儲函數的局部變量、函數參數、返回地址等。

        • 每當調用新函數時,系統會自動在棧上分配空間。函數返回時,相應的棧空間被釋放。

      • 進程上下文和環境

      • 包含了操作系統用于管理和調度進程的所有信息。這包括進程的狀態(運行、就緒、等待)、程序計數器、寄存器內容、打開的文件描述符、安全屬性、進程ID等。

創建進程

  • 可執行文件

    • Windows 平臺的可執行文包括exe、dll、sys 等擴展名的文件。

      • exe是指可執行(executable),創建進程必須使用exe 文件。

      • dll是動態鏈接庫,一些基礎、共用的代碼和數據存在于 d1l文件中。

      • sys 是內核驅動程序。

      • Windows 平臺的可執行文件基本都是PE格式的。

  • CreateProces

    • #include <iostream>
      #include <Windows.h>int main()
      {STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si, sizeof(si));ZeroMemory(&pi, sizeof(pi));si.cb = sizeof(si);TCHAR szCmd[] = TEXT("notepad.exe \"123.txt\"");CreateProcess(/*TEXT("C:\\Windows\\System32\\notepad.exe")*/NULL,szCmd,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);return 0;
      }
  • 執行流程

    • 進程的啟動過程

      • 進程的啟動通常是由用戶發起的一個事件,如雙擊應用程序圖標、從命令行運行可執行文件、系統啟動時自動運行等。

      • 用戶行為或觸發事件:用戶通過各種方式請求啟動一個程序,如通過用戶界面或命令行。

      • 操作系統響應:操作系統響應這一請求,調用相關系統函數例如 CreateProcessShellExecute 等。

      • 創建進程對象:操作系統分配進程標識符(PID),創建進程所需的內核對象和數據結構。

      • 分配資源:為新進程分配內存,打開必需的系統資源和文件。

      • 創建主線程:操作系統創建進程的主線程,并將其指向程序的入口點。

      • 開始執行:主線程開始執行,加載程序代碼到內存,初始化程序,開始執行程序指令。

      • 加載需要的動態鏈接庫:程序如果依賴于其他動態鏈接庫(DLLs),操作系統將它們加載到進程空間中。

      • 執行完成:主線程執行完成后,它將退出。如果是多線程程序,所有線程都結束后,進程才真正結束。

    • 主線程和工作線程

      • 當一個進程啟動時,操作系統會創建一個線程來執行程序代碼,這個線程被稱為主線程。在多線程程序中,除了主線程外,還可以創建額外的線程,這些線程稱為工作線程。

      • 主線程:

        • 是程序執行的入口點。

        • 負責執行程序初始化和調用其他線程。

        • 主線程結束時,通常意味著進程的結束。

      • 工作線程:

        • 是由主線程顯式創建的用于執行特定任務的線程。

        • 可以同時執行多個任務,與主線程并行工作。

        • 可以提高應用程序性能,尤其是在多核處理器上運行時。

  • GetStartupInfo

    • #include <iostream>
      #include <Windows.h>int main()
      {STARTUPINFO si = { sizeof(si) };GetStartupInfo(&si);return 0;
      }

進程終止?

  • 進程終止是操作系統中進程生命周期的最后一個階段。
    • ExitProcess
      • #include <iostream>
        #include <Windows.h>/*void ExitProcess([in] UINT uExitCode //進程和所有線程的退出代碼);*/int main()
        {//結束自身ExitProcess(0/*GetExitCodeProcess*/);return 0;
        }
    • TerminateProcess
      • #include <iostream>
        #include <Windows.h>/*BOOL TerminateProcess([in] HANDLE hProcess,		//終止進程句柄[in] UINT   uExitCode		//進程退出代碼);*/int main()
        {STARTUPINFO si = { 0 };si.cb = sizeof(si);PROCESS_INFORMATION pi = { 0 };BOOL bRet = CreateProcess(TEXT("D:\\Debug\\PE_Die\\die.exe"),NULL,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);if (bRet == 0) return 0;system("pause");TerminateProcess(pi.hProcess, 0/*GetExitCodeProcess*/);return 0;
        }

進程句柄

  • 創建進程

    • CreateProcess - ProcessInformation - ProcessHandle

      typedef struct _PROCESS_INFORMATION {
      HANDLE hProcess;     //新創建進程的句柄。 
      HANDLE hThread;      //新創建的進程的主線程的句柄。 
      DWORD dwProcessId;   
      DWORD dwThreadId;
      } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
      
  • 打開進程

    • OpenProcess

      • 打開一個已經存在的進程并獲取對應進程句柄。
      • #include <iostream>
        #include <Windows.h>int main()
        {HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 2036/*進程ID*/);if (hProcess != NULL){if (!TerminateProcess(hProcess, 0)){std::cout << GetLastError() << std::endl;}}return 0;
        }

  • 進程提權

    • OpenProcessToken;

    • LookupPrivilegeValue;

    • AdjustTokenPrivileges;

    #include <iostream>
    #include <Windows.h>int main()
    {HANDLE hProcess = NULL;HANDLE hToken = NULL;LUID luid = { 0 };TOKEN_PRIVILEGES tp = { 0 };if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)){std::cout << "OpenProcessToken ErrorCode -> " << GetLastError() << std::endl;return 0;}if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)){std::cout << "LookupPrivilegeValue ErrorCode -> " << GetLastError() << std::endl;return 0;}tp.PrivilegeCount = 1;tp.Privileges[0].Luid = luid;tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);if (GetLastError() == ERROR_NOT_ALL_ASSIGNED){return 0;}return 0;
    }
    

????????

內核模擬

  • 示例代碼
#include <iostream>
#include <Windows.h>int main()
{HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 2576/*進程ID*/);if (hProcess != NULL){printf("%x \r\n", hProcess);system("pause");}return 0;
}
  • 定位進程

  • 查找句柄

????????

回溯對象

自身進程

  • GetCurrentProcess
    • #include <iostream>
      #include <Windows.h>int main()
      {HANDLE hProcess = GetCurrentProcess();TerminateProcess(hProcess, 0);return 0;
      }
  • GetCurrentProcessId
    • #include <iostream>
      #include <Windows.h>int main()
      {DWORD dwPid = GetCurrentProcessId();HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);TerminateProcess(hProcess, -1);return 0;
      }

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/39667.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/39667.shtml
英文地址,請注明出處:http://en.pswp.cn/web/39667.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SD NAND時序解析

一、SD NAND時序的重要性 在SD NAND的數據傳輸過程中&#xff0c;時序起著至關重要的作用。正確的時序確保了數據能夠準確無誤地在主機和SD NAND之間傳輸。 二、命令與讀寫時序 SD NAND的通信基于命令和數據傳輸&#xff0c;遵循以下時序規則&#xff1a; 命令與響應交互&…

安卓常用的控件

人不走空 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌賦&#xff1a;斯是陋室&#xff0c;惟吾德馨 在Android開發中&#xff0c;控件&#xff08;也稱為視圖或控件組件&#xff09;是構建用戶界面的基本元素。它們…

MySQL之備份與恢復(三)

備份與恢復 邏輯備份還是物理備份 物理備份 物理備份有如下好處: 1.基于文件的物理備份&#xff0c;只需要將需要的文件復制到其他地方即可完成備份。不需要其他額外的工作來生成原始文件。2.物理備份的恢復可能就更簡單了&#xff0c;這取決于存儲引擎。對于MyISAM&#x…

C++_04

1、繼承 1.1 基本概念 繼承是面向對象編程&#xff08;OOP&#xff09;中的一個核心概念&#xff0c;特別是在C中。它允許一個類&#xff08;稱為派生類或子類&#xff09;繼承另一個類&#xff08;稱為基類或父類&#xff09;的屬性和方法。繼承的主要目的是實現代碼重用&…

康姿百德磁性床墊好不好,效果怎么樣靠譜嗎

康姿百德典雅款床墊&#xff0c;打造舒適睡眠新體驗 康姿百德床墊是打造舒適睡眠新體驗的首選&#xff0c;其設計能夠保護脊椎健康&#xff0c;舒展脊椎&#xff0c;讓您享受一夜好眠。康姿百德床墊的面料選擇也非常重要&#xff0c;其細膩親膚的針織面料給您帶來柔軟舒適的觸…

如何在操作使用ufw設置防火墻

UFW&#xff08;簡單防火墻&#xff09;是用于管理iptables防火墻規則的用戶友好型前端。它的主要目標是使iptables的管理更容易。 在學習Linux的時候大家一般都會關心命令&#xff0c;Posix API和桌面等&#xff0c;很少會去了解防護墻。其實除了一些網絡安全廠商提供的付費防…

交互案例:5大經典交互效果

文件格式&#xff1a;.rp&#xff08;請與班主任聯系獲取原型文檔&#xff09; 文件名稱&#xff1a;Axure交互案例&#xff1a;5大經典交互實現 文件大小&#xff1a;78.5 MB 文檔內容介紹 五大經典交互包括&#xff1a; 圖片手風琴 圖片懸浮放大 詳細說明切換 圖片全屏查…

【Ubuntu noble】apt 無法安裝軟件 Unable to locate package vim

宿主機以及 docker 無法定位軟件包 將 /etc/apt/sources.list.d/ubuntu.sources 修改為以下內容&#xff08;主要是 Suites 字段增加了noble noble-updates&#xff09; Types: deb URIs: http://archive.ubuntu.com/ubuntu/ Suites: noble noble-updates noble-backports Com…

無需啟動工程造價司法鑒定的情形

第一&#xff0c;當事人在訴訟前已經對建設工程價款結算達成協議。如果當事人在訴訟前已經對建設工程價款結算已經達成協議&#xff0c;意味著工程價款的結算金額在訴訟前已經確定&#xff0c;按照上述歸納的關于工程造價司法鑒定程序的啟動標準&#xff0c;則此時已無啟動工程…

--7.4

7.4 Springboot 1、什么是 SpringBoot Starters 是一系列依賴關系的集合&#xff0c;因為它的存在&#xff0c;項目的依賴之間的關系對我們來說變得簡單了。 2、SpringBootApplication 復合注解&#xff1a; EnableAutoConfigurationComponentScanConfiguration 3、Rest…

上位機GUI 第三彈

&#x1f60a; &#x1f60a; &#x1f60a; 從協議層面講&#xff0c;地質單元相當重要&#xff0c;調試模式,我只能義命令發送的索引碼作為,每個設備的區分方式,調試的情況&#xff0c;不在設備上設置任何東西&#xff0c;開機訪問地址和端口就能用 因為懶&#xff0c;直接將…

【代碼隨想錄】【算法訓練營】【第55天】 [42]接雨水 [84]柱狀圖中最大的矩形

前言 思路及算法思維&#xff0c;指路 代碼隨想錄。 題目來自 LeetCode。 day 55&#xff0c;又是一個周一&#xff0c;不能再堅持~ 題目詳情 [42] 接雨水 題目描述 42 接雨水 解題思路 前提&#xff1a;雨水形成的情況是凹的, 需要前中后3個元素&#xff0c;計算該元…

分治求解最大子數組

分治求解最大子數組 分治求解步驟 分&#xff1a;將數組分成左右兩部分治&#xff1a;遞歸地求解左半部分和右半部分的最大子數組合&#xff1a;計算跨越中點的最大子數組&#xff0c;并取三者中的最大值 具體實現 分&#xff1a; 將數組A分成兩部分 左半部分&#xff1a;從…

專業的TPM管理咨詢公司有哪些特點?

專業的TPM管理咨詢公司&#xff0c;作為現代企業管理和設備維護的重要合作伙伴&#xff0c;其特點不僅體現在技術能力和服務質量上&#xff0c;更在于其獨特的經營理念和方法論。以下是專業TPM管理咨詢公司所具備的顯著特點&#xff1a; 一、全面的技術實力與深厚的行業經驗 專…

迎接AI時代的新篇章:GPT-5 技術突破與未來展望

GPT-5 一年半後發布&#xff1f;對此你有何期待&#xff1f; 前言 在美國達特茅斯工程學院的一次採訪中&#xff0c;OpenAI 首席技術官米拉穆拉蒂透露&#xff0c;GPT-5 將在一年半後發布&#xff0c;並將其描述為從高中生智力水平躍升到博士生水平的飛躍。這一消息在科技界引…

Lambda表達式講解

簡介: Lambda表達式的使用場景非常廣泛,主要包括函數式編程、集合操作、排序、線程編程、GUI事件處理、數據處理、Web開發等。 函數式編程:Lambda表達式是函數式編程的重要特性,可以用于替代傳統的匿名內部類,簡化代碼,提高可讀性。 集合操作:Lambda表達式可以與集合…

word 轉pdf 中圖片不被壓縮的方法

word 轉pdf 中圖片不被壓縮的方法 法1&#xff1a; 調節word 選項中的圖片格式為不壓縮、高保真 法2&#xff1a; 1: word 中的圖片盡可能使用高的分辨率&#xff0c;圖片存為pnd或者 tif 格式&#xff08;最高清&#xff09; 2: 轉化為pdf使用打印機器&#xff0c;參數如下…

展開說說:Android四大組件之Service使用

Service一定要開啟子線程才可以執行耗時任務嗎&#xff1f;不完全是吧。 Service是Android系統中的四大組件之一&#xff0c;它是一種沒有可視化界面&#xff0c;運行于后臺的一種服務程序。屬于計算型組件&#xff0c;用來在后臺執行持續性的計算任務&#xff0c;重要性僅次于…

分子AI預測賽筆記

#AI夏令營 #Datawhale #夏令營 Taks1 跑通baseline 根據task1跑通baseline 注冊賬號 直接注冊或登錄百度賬號&#xff0c;etc fork 項目 零基礎入門 Ai 數據挖掘競賽-速通 Baseline - 飛槳AI Studio星河社區 啟動項目 選擇運行環境&#xff0c;并點擊確定&#xff0c;沒…

臺燈學生用哪個牌子最好?學生用臺燈品牌排行榜分析

臺燈學生用哪個牌子最好&#xff1f;護眼臺燈在近年來成為家長和長時間使用電子設備人群關注的家電/學生產品。對于家中有孩子或經常面對電子屏幕的人士來說&#xff0c;很多人可能已經對這類產品有所了解并進行了購買。然而&#xff0c;部分家長對護眼臺燈的認識還不夠深入&am…