[进程,线程, DLL(动态链接库)的枚举]
[快照处理 CreateToolhelp32SnapShot()]
// THCS32_SNAPMODULE // THCS32_SNAPPROCESS // THCS32_SNAPTHREAD HANDLE hSnap = CreateToolhelp32SnapShot( DWORD dwFlags, // 建立快照系统的类型 进程? 线程? DLL? DWORD dwProcssId, // NULL OR ProcessId );
[***32First() / ***32Next()]
// PROCESSENTRY32 /* typedef struct tagPROCESSENTRY32 { DWORD dwSize; // 结构体大小 DWORD cntUsage; // 该进程的引用计数 DWORD th32ProcessID; // 该进程的ID ===> PID ULONG_PTR th32DefaultHeapID; // 进程默认堆的ID = 0 DWORD th32ModuleID; // 进程模块ID = 0 DWORD cntThreads; // 进程开启的线程计数 DWORD th32ParentProcessID; // 该进程的父进程的ID LONG pcPriClassBase; // 线程的优先权 DWORD dwFlags; // == 0 TCHAR 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; // = 1 DWORD th32ProcessID; // 正在检查的进程标识符 DWORD GlblcntUsage; // 全局模块的使用计数 即模块的总载入次数 一般没有意义 = 0xffff DWORD 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); } }
时间: 2024-11-07 23:12:18