• 查看进程权限


    仿PwoerTool的查看进程权限功能。

      1 #include <iostream>
      2 #include <Windows.h>
      3 #include <TlHelp32.h>
      4 
      5 using namespace std;
      6 
      7 DWORD Pro_NameGetPid(char *pName, BOOL isCase);
      8 
      9 DWORD Pro_GetPrivileges(HANDLE hPro, char ***pPowers);
     10 
     11 int main(void)
     12 {
     13     HANDLE hPro = NULL;
     14     char **a = NULL;
     15 
     16     hPro = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pro_NameGetPid("测试程序.exe", FALSE));
     17     if (!hPro)
     18     {
     19         printf("进程打开失败:%d
    ", GetLastError());
     20         return 1;
     21     }
     22     DWORD dwLen = Pro_GetPrivileges(hPro, &a);
     23     for (DWORD i = 0; i < dwLen; i++)
     24     {
     25         cout << a[i] << endl;
     26     }
     27     CloseHandle(hPro);
     28     return 0;
     29 }
     30 
     31 DWORD Pro_NameGetPid(char *pName, BOOL isCase)
     32 {
     33     PROCESSENTRY32 proInfo = { 0 };
     34     HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
     35     BOOL bOk = FALSE;
     36     DWORD dwPid = 0;
     37 
     38     proInfo.dwSize = sizeof(proInfo);
     39     if (!hSnap)
     40         return 0;
     41     bOk = Process32First(hSnap, &proInfo);
     42     if (isCase)
     43     {
     44         while (bOk)
     45         {
     46             if (!strcmp(proInfo.szExeFile, pName))
     47             {
     48                 dwPid = proInfo.th32ProcessID;
     49                 break;
     50             }
     51             bOk = Process32Next(hSnap, &proInfo);
     52         }
     53     }
     54     else {
     55         while (bOk)
     56         {
     57             char s1[MAX_PATH] = { 0 }, s2[MAX_PATH] = { 0 };
     58             lstrcpyn(s1, proInfo.szExeFile, strlen(proInfo.szExeFile));
     59             lstrcpyn(s2, pName, strlen(pName));
     60             _strupr_s(s1, strlen(s1) + 1);
     61             _strupr_s(s2, strlen(s2) + 1);
     62 
     63             if (!strcmp(s1, s2))
     64             {
     65                 dwPid = proInfo.th32ProcessID;
     66                 break;
     67             }
     68             bOk = Process32Next(hSnap, &proInfo);
     69         }
     70     }
     71     CloseHandle(hSnap);
     72     return dwPid;
     73 }
     74 
     75 DWORD Pro_GetPrivileges(HANDLE hPro, char ***pPowers)
     76 {
     77     HANDLE hToken = NULL;
     78     PTOKEN_PRIVILEGES pTp = NULL;
     79     DWORD dwNeededSize = 0, dwI = 0;
     80 
     81     if (!OpenProcessToken(hPro, TOKEN_ALL_ACCESS, &hToken))
     82     {
     83         printf("进程Token提取失败:%d
    ", GetLastError());
     84         return -1;
     85     }
     86     // 试探一下需要分配多少内存
     87     GetTokenInformation(hToken, TokenPrivileges, NULL, dwNeededSize, &dwNeededSize);
     88     // 分配所需内存大小
     89     pTp = (PTOKEN_PRIVILEGES)malloc(dwNeededSize);
     90     if (!GetTokenInformation(hToken, TokenPrivileges, pTp, dwNeededSize, &dwNeededSize))
     91     {
     92         free(pTp);
     93         printf("获取进程权限失败!");
     94         return -2;
     95     }
     96     else
     97     {
     98         // 先计数权限
     99         for (DWORD i = 0; i < pTp->PrivilegeCount; i++)
    100         {
    101             if (pTp->Privileges[i].Attributes == SE_PRIVILEGE_ENABLED)
    102             {
    103                 dwI++;
    104                 break;
    105             }
    106         }
    107         /////////////////////////////////////////////////////////
    108         // 枚举进程权限
    109         /////////////////////////////////////////////////////////
    110         *pPowers = (char **)malloc(dwI);
    111         for (DWORD i = 0; i < pTp->PrivilegeCount; i++)
    112         {
    113             char *pUidName = NULL;    // 存权限名的指针
    114             DWORD dwNameLen = 0;    // 权限名字长度
    115 
    116             // 试探uidName所需内存大小
    117             LookupPrivilegeName(NULL, &pTp->Privileges[i].Luid, NULL, &dwNameLen);
    118             // 分配需要的内存
    119             pUidName = (char *)malloc(dwNameLen);
    120             // 获取权限名
    121             LookupPrivilegeName(NULL, &pTp->Privileges[i].Luid, pUidName, &dwNameLen);
    122             // 如果该权限是启用状态就记录
    123             if (pTp->Privileges[i].Attributes == SE_PRIVILEGE_ENABLED)
    124             {
    125                 *(*pPowers++) = pUidName;
    126                 pUidName = NULL;
    127                 break;
    128             }
    129             free(pUidName);
    130         }
    131     }
    132     free(pTp);
    133     CloseHandle(hToken);
    134     return dwI;
    135 }

    给测试程序提权到Debug后的测试效果图:

  • 相关阅读:
    dremio docker 镜像版本
    jdk 11 更新内容
    自定义 maven 插件
    PC端响应式设置
    windows服务器事件查看器 日志查看
    我的小程序之旅六:微信公众号授权登录(适用于H5小程序)
    我的小程序之旅二:如何创建一个微信小程序
    我的小程序之旅九:微信开放平台unionId机制介绍
    我的小程序之旅五:微信公众号扫码登录PC端网页
    我的小程序之旅七:微信公众号设置IP白名单
  • 原文地址:https://www.cnblogs.com/biaoge140/p/9189648.html
Copyright © 2020-2023  润新知