如何解决为什么Kernel32 OpenProcess函数返回null?
我正在尝试制作一个使用JNA读取另一个(非Java和32bit)应用程序的内存的应用程序。到目前为止,我知道如何找到模块的process ID
和base 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 举报,一经查实,本站将立刻删除。