• 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;
        }
    }
  • 相关阅读:
    7maven依赖排除
    5maven生命周期
    4maven依赖范围、依赖有效性
    3maven常用命令和配置依赖
    1maven概念作用
    6在Eclipse中创建maven和修改默认配置
    2maven下载与配置
    Class 'org.apache.tomcat.jdbc.pool.DataSource' not found
    17 alternatives to your default image viewer on Fedora
    zip压缩包解压后的文件名是乱码?
  • 原文地址:https://www.cnblogs.com/amwuau/p/10027893.html
Copyright © 2020-2023  润新知