微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么Kernel32 OpenProcess函数返回null?

如何解决为什么Kernel32 OpenProcess函数返回null?

我正在尝试制作一个使用JNA读取另一个(非Java和32bit)应用程序的内存的应用程序。到目前为止,我知道如何找到模块的process IDbase address。在读取内存之前,我需要打开进程,而OpenProcess函数只是返回null。另外,我正在使用Windows 10。

    // process id (pid) is kNown

    final int PROCESS_VM_READ=0x0010;
    final int PROCESS_QUERY_informatION=0x0400;
      
    WinNT.HANDLE processHandle = Kernel32.INSTANCE.OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_informatION,true,pid);

如何获取流程句柄?

解决方法

您需要为当前进程启用debug privilege,以便查询当前用户以外的任何人拥有的进程的信息。该链接显示了C语言中的代码,但是您可以将该代码移植到JNA。

这是程序启动时的一次性方法调用。

这是我的操作方式(向@RbMm致谢,以进行改进):

/**
 * Enables debug privileges for this process,required for OpenProcess() to get
 * processes other than the current user
 *
 * @return {@code true} if debug privileges were successfully enabled.
 */
private static boolean enableDebugPrivilege() {
    HANDLEByReference hToken = new HANDLEByReference();
    boolean success = Advapi32.INSTANCE.OpenProcessToken(Kernel32.INSTANCE.GetCurrentProcess(),WinNT.TOKEN_QUERY | WinNT.TOKEN_ADJUST_PRIVILEGES,hToken);
    if (!success) {
        LOG.error("OpenProcessToken failed. Error: {}",Native.getLastError());
        return false;
    }
    try {
        WinNT.LUID luid = new WinNT.LUID();
        success = Advapi32.INSTANCE.LookupPrivilegeValue(null,WinNT.SE_DEBUG_NAME,luid);
        if (!success) {
            LOG.error("LookupPrivilegeValue failed. Error: {}",Native.getLastError());
            return false;
        }
        WinNT.TOKEN_PRIVILEGES tkp = new WinNT.TOKEN_PRIVILEGES(1);
        tkp.Privileges[0] = new WinNT.LUID_AND_ATTRIBUTES(luid,new DWORD(WinNT.SE_PRIVILEGE_ENABLED));
        success = Advapi32.INSTANCE.AdjustTokenPrivileges(hToken.getValue(),false,tkp,null,null);
        int err = Native.getLastError();
        if (!success) {
            LOG.error("AdjustTokenPrivileges failed. Error: {}",err);
            return false;
        } else if (err == WinError.ERROR_NOT_ALL_ASSIGNED) {
            LOG.debug("Debug privileges not enabled.");
            return false;
        }
    } finally {
        Kernel32.INSTANCE.CloseHandle(hToken.getValue());
    }
    return true;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。