[00023]-[2015-09-19]-[01]-[Windows 平台基础知识1]

[进程,线程, 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);
  }    
}

 

posted @ 2015-09-19 16:02  Auris  阅读(191)  评论(0编辑  收藏  举报