Win32ASM-进程学习【2】
獲取運行中的句柄
?
1.從窗口句柄中獲取進程句柄
要對進程進行某種操作,就必須首先知道該進程的句柄或者進程ID
對于自己創(chuàng)建的子進程來說CreateProcess函數(shù)返回了子進程句柄和進程的ID
但是如果如果要對系統(tǒng)中運行的某個進程進行操作,那么首先獲取他們的句柄才行
?
如果知道某個進程的ID
那么可以通過GetWindowThreadProcessID hWnd,lpdwProcessID
該函數(shù)可以從一個窗口句柄中獲取創(chuàng)建該窗口的進程的進程ID
hWnd指明一個窗口句柄--可以通過FIndWindow來獲得這個窗口句柄
lpdwProcessID指向一個雙字節(jié)的變量,函數(shù)在這里返回創(chuàng)建窗口進程的ID
函數(shù)的返回值是目標進程中創(chuàng)建該窗口的線程的線程ID
?
得到進程ID后,就可以通過OpenProcess函數(shù)來獲取該進程的句柄了
OpenProcess dwDesiredAccess,bInheritHandle,dwProcessID
dwDesireAccess 指定需要對該進程進行的操作,要對目標進程進行某種操作
一般來說,除了系統(tǒng)進程以外,可以對其他函數(shù)進行任何操作,操作碼可以取以下取值的組合
PROCESS_ALL_ACCESS? 等于下面全部操作的組合
PROCESS_CREATE_THREAD 允許創(chuàng)建遠程線程
PROCESS_DUP_HANDLE 允許進程句柄被復制
PROCESS_QUERY_INFORMATION 允許使用GetExitCodeProcess查詢進程退出碼和使用GetPriorityClass函數(shù)查詢進程的優(yōu)先級
PROCESS_SET_INFORMATION? 允許使用SetPriorityClass函數(shù)設置進程優(yōu)先級
PROCESS_VM_OPERATION 允許使用WriteProcessMemory 和 VirtualProtectEx函數(shù)修改進程的地址空間
PROCESS_VM_READ 允許對進程空間進行讀操作
PROCESS_WRITE 允許對進程地址空間進行寫操作
?
bInheritHandle 指明返回的進程句柄是否可以被當前進程的子進程繼承,如果參數(shù)指定為TRUE,則進程句柄可以被繼承
dwProcessID指明目標進程的ID
如果函數(shù)成功執(zhí)行,返回的是被打開的進程句柄,如果函數(shù)執(zhí)行失敗則返回NULL.一般打開失敗的原因是由于權(quán)限不夠引起的,當完成對目標進程的操作之后,必須使用CloseHandle將獲得的句柄關(guān)閉
?
2.從快照函數(shù)獲取進程句柄
(1)
使用GetWindowThreadProcessID獲取進程的先決條件是必須創(chuàng)建了窗口,對于在后臺運行的沒有窗口的進程該如何處理呢?
這就可以通過枚舉系統(tǒng)中運行的進程來解決了,這個功能可以由CreateToolHelp32Snapshot函數(shù)來實現(xiàn)
CreateToolHelp32Snapshot dwFlags,th32ProcessID
dwFlags 用來指定快照中需要返回的對象,本函數(shù)不僅可以獲取進程列表,也可以用來獲取線程和模塊等對象的列表,參數(shù)可以指定的值是:
TH32CS_SNAPHEAPLIST 對指定進程中的堆進行枚舉
TH32CS_SNAPMODULE 對指定進程中的模塊進行枚舉
TH32CS_SNAPPROCESS 對系統(tǒng)范圍中的進程進行枚舉
TH32CS_SNAPTHREAD 對系統(tǒng)范圍中的線程進行枚舉
th32ProcessID參數(shù)用來指定一個進程ID? 對于TH32CS_SNAPPROCESS 和TH32CS_SNAPTHREAD這個參數(shù)可以為0
因為后2者是對系統(tǒng)范圍內(nèi)的枚舉
?
如果函數(shù)執(zhí)行成功返回一個快照句柄,否則返回-1
?
(2)從快照句柄中獲取進程參數(shù)使用Process32First和Process32Next函數(shù)
Process32Next函數(shù)循環(huán)獲取快照句柄中的進程信息,當不在有剩余信息時,函數(shù)返回FALSE
Process32First和Process32Next的第一參數(shù)指向一個快照句柄,第2個參數(shù)指向一個PROCESSENTRY32結(jié)構(gòu)
Process32Next hSnapshot,lpProcessEntry32
結(jié)構(gòu)定義如下
<span style="font-family:Microsoft YaHei;font-size:13px;">typedef struct tagPROCESSENTRY32 { DWORD dwSize; 結(jié)構(gòu)的長度 DWORD cntUsage; 進程的引用計數(shù) DWORD th32ProcessID; 進程ID ULONG_PTR th32DefaultHeapID; 進程默認堆的ID DWORD th32ModuleID; 進程模塊的ID DWORD cntThreads; 被進程創(chuàng)建的線程數(shù) DWORD th32ParentProcessID; 進程的父進程ID LONG pcPriClassBase; 被進程創(chuàng)建的線程的基本優(yōu)先級 DWORD dwFlags; 內(nèi)部使用 TCHAR szExeFile[MAX_PATH]; 進程對應的可執(zhí)行文件名稱 } PROCESSENTRY32, *PPROCESSENTRY32;</span>在返回所有進程信息之后,需要使用CloseHandle將快照句柄關(guān)閉
在結(jié)構(gòu)體中返回的進程ID(th32ProcessID)和可執(zhí)行的文件名(szExeFile)是我們最關(guān)心的
這樣我們就可以通過OpenProcess來對進程進行各種操作了
?
另外在ListBox能夠為每一項自定義一個32位的自定義數(shù)據(jù)
LB_SETITEMDATA? 和 LB_GETITEMDATA可以設置和獲取自定義數(shù)據(jù)
正好可以把th32ProcessID設置進去......
總結(jié)
以上是生活随笔為你收集整理的Win32ASM-进程学习【2】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《绝密543》电视剧全集1
- 下一篇: 周口治疗女性卵巢多囊最好的医院推荐