zoukankan      html  css  js  c++  java
  • Windows 调用OpenProcess失败

    OpenProcess 打开|获得进程句柄

    函数原型:
    HANDLE OpenProcess(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId)
    
    参数说明:
    1、dwDesiredAccess:想拥有的该进程访问权限
    PROCESS_ALL_ACCESS  //所有能获得的权限
    PROCESS_CREATE_PROCESS  //需要创建一个进程
    PROCESS_CREATE_THREAD   //需要创建一个线程
    PROCESS_DUP_HANDLE      //重复使用DuplicateHandle句柄
    PROCESS_QUERY_INFORMATION   //获得进程信息的权限,如它的退出代码、优先级
    PROCESS_QUERY_LIMITED_INFORMATION  /*获得某些信息的权限,如果获得了PROCESS_QUERY_INFORMATION,也拥有PROCESS_QUERY_LIMITED_INFORMATION权限*/
    PROCESS_SET_INFORMATION    //设置某些信息的权限,如进程优先级
    PROCESS_SET_QUOTA          //设置内存限制的权限,使用SetProcessWorkingSetSize
    PROCESS_SUSPEND_RESUME     //暂停或恢复进程的权限
    PROCESS_TERMINATE          //终止一个进程的权限,使用TerminateProcess
    PROCESS_VM_OPERATION       //操作进程内存空间的权限(可用VirtualProtectEx和WriteProcessMemory) 
    PROCESS_VM_READ            //读取进程内存空间的权限,可使用ReadProcessMemory
    PROCESS_VM_WRITE           //读取进程内存空间的权限,可使用WriteProcessMemory
    SYNCHRONIZE                //等待进程终止
    
    2、bInheritHandle:表示所得到的进程句柄是否可以被继承
    
    3、dwProcessId:被打开进程的PID
    
    返回值:
    如果函数调用成功将返回一个进程句柄值,否则将返回NULL
    
    注意:在使用完所获得的进程句柄后一定要调用CloseHandle(handle)来关闭进程的句柄。
    
          使用的例子在前面的文章中已经写出了。在使用此函数时会发现不能成功获得有些系统进程的句柄,原因是没有权限。解决办法是在调用此函数前让我们的进程得到SeDebugPrivilege权限。
    

      

    服务方式程序时,程序的创建者为SYSTEM用户;非SYSTEM用户调用OpenProcess访问该服务程序时,调用失败,GetLastError返回5

    调用下面的函数提权,即可解决。(若有其他方案,欢迎补充)

    void enableDebugPriv()
    {
        HANDLE hToken;
        LUID sedebugnameValue;
        TOKEN_PRIVILEGES tkp;
    
        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
        {
            return;
        }
    
        if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue))
        {
            CloseHandle(hToken);
            return;
        }
        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Luid = sedebugnameValue;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL))
        {
            CloseHandle(hToken);
            return;
        }
    }
  • 相关阅读:
    记录ICallbackEventHandler 同时并发访问容易引发的问题
    IIS 属性
    Solaris10 安装
    VerifyRenderingInServerForm和EnableEventValidation引发的两个问题
    Solaris 上网配置
    动态数据类型转换
    RDLC 折线图
    codesmith复制中文乱码解决
    关于手机等品牌型号搜索与采集的中文分词分离
    说点包租公限制共享上网的破事
  • 原文地址:https://www.cnblogs.com/amwuau/p/10027893.html
Copyright © 2011-2022 走看看