- 公開視頻 ->?鏈接點擊跳轉公開課程
- 博客首頁 ->?鏈接點擊跳轉博客主頁
目錄
進程基礎
進程的定義與概念
進程的組成
創建進程
可執行文件
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; }
-
-
執行流程
-
進程的啟動過程
-
進程的啟動通常是由用戶發起的一個事件,如雙擊應用程序圖標、從命令行運行可執行文件、系統啟動時自動運行等。
-
用戶行為或觸發事件:用戶通過各種方式請求啟動一個程序,如通過用戶界面或命令行。
-
操作系統響應:操作系統響應這一請求,調用相關系統函數例如
CreateProcess
,ShellExecute
等。 -
創建進程對象:操作系統分配進程標識符(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; }
-
- ExitProcess
進程句柄
-
創建進程
-
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; }
-