標籤:
[進程,線程, DLL(動態連結程式庫)的枚舉]
[快照處理 CreateToolhelp32SnapShot()]
// THCS32_SNAPMODULE// THCS32_SNAPPROCESS// THCS32_SNAPTHREADHANDLE hSnap = CreateToolhelp32SnapShot( DWORD dwFlags, // 建立快照系統的類型 進程? 線程? DLL? DWORD dwProcssId, // NULL OR ProcessId);
[***32First() / ***32Next()]
// PROCESSENTRY32/*typedef struct tagPROCESSENTRY32{DWORD dwSize; // 結構體大小DWORD cntUsage; // 該進程的引用計數DWORD th32ProcessID; // 該進程的ID ===> PIDULONG_PTR th32DefaultHeapID; // 進程預設堆的ID = 0DWORD th32ModuleID; // 進程模組ID = 0DWORD cntThreads; // 進程開啟的執行緒計數DWORD th32ParentProcessID; // 該進程的父進程的IDLONG pcPriClassBase; // 線程的優先權DWORD dwFlags; // == 0TCHAR szExeFile[MAX_PATH]; // 進程的可執行檔的名稱} PROCESSENTRY32, *PPROCESSENTRY32;*/// THREADENTRY32/*typedef struct tagTHREADENTRY32 { DWORD dwSize; // 結構體大小 DWORD cntUsage; // == 0 DWORD th32ThreadID; // .... DWORD th32OwnerProcessID; // 線程所屬進程的PID LONG tpBasePri; // 線程在核心中分配的優先順序 (0 - 31) 0 為最低優先順序 LONG tpDeltaPri; // = 0 DWORD dwFlags; // = 0 } THREADENTRY32, *PTHREADENTRY32;*/// MODULEENTRY32/*typedef struct tagMODULEENTRY32 {DWORD dwSize; // 結構體大小DWORD th32ModuleID; // = 1DWORD th32ProcessID; // 正在檢查的進程標識符DWORD GlblcntUsage; // 全域模組的使用計數 即模組的總載入次數 一般沒有意義 = 0xffffDWORD ProccntUsage; // 全域模組的使用計數 與GlblcntUsage相同)。通常這一項也是沒有意義的,被設定為0xFFFF。BYTE *modBaseAddr; // 模組的基址,在其所屬的進程範圍內。DWORD modBaseSize; // 模組的大小,單位位元組。HMODULE hModule; // 所屬進程的範圍內,模組控制代碼。TCHAR szModule[MAX_PATH]; // NULL結尾的字串,其中包含模組名。TCHAR szExePath[MAX_PATH]; // NULL結尾的字串,其中包含的位置,或模組的路徑。} MODULEENTRY32, *PMODULEENTRY32, *LPMODULEENTRY32;*/BOOL WINAPI Process32First(HANDLE hSnap, LPPROCESSENTRY32 lppe);BOOL WINAPI Process32Next(HANDLE hSnap, LPPROCESSENTRY32 lppe);BOOL WINAPI Thread32First(HANDLE hSnap, LPTHRADENTRY32 lpte);BOOL WINAPI Thread32Next(HANDLE hSnap, LPTHRADENTRY32 lpte);BOOL WINAPI Module32First(HANDLE hSnap, LPMODULEENTRY32 lpme);BOOL WINAPI Module32Next(HANDLE hSnap, LPMODULEENTRY32 lpme);
egcode:
HANDLE hSnap = CreateToolhelp32Snapshot(THCS32_SNAPPROCESS, NULL);// 給系統中的進程 進行一次快照 快照是一瞬間的動作,因為系統的進程,線程, DLL都是在動態
變化的
PROCESSENTRYY32 pe = {0};
pe.dwSize = sizeof(PROCESSENTRY32);
BOOL bRet = Process32First(hSnap, &pe);
while(bRet)
{
// now the pe do contain the content of a Process Entry
.......
bRet = Process32Next(hSnap, &pe);// get the next Process Entry content
}
[調整當前進程的許可權]
(1) 使用OpenProcessToken() 開啟當前進程的存取權杖
(2) 使用LookupPrivilegeValue() 擷取描述許可權的LUID
(3) 使用AdjustTokenPrivileges() 調整存取權杖的許可權 ---> [SeDebugPrivilege]
egcode:
/** 調整當前進程 具有 SeDebugPrivilege 許可權*/void SetDebugPrivilege(){ HANDLE hToken = NULL; BOOL bRet = OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken); if(bRet == TRUE) { TOKEN_PRIVILEGE tp; tp.PrivilegeCount = 1; LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid); tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLE; AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL); CloseHandle(hToken); } else { CloseHandle(hToken); } }
[00023]-[2015-09-19]-[01]-[Windows 平台基礎知識1]