我目前正在尝试通过使用Java JNA来对内存进行读/写。在过去的一周中,我尝试了多种解决方案,主要是通过similar projects在网上找到的,但没有任何解决方案能够解决我的问题。
我知道我收到了正确的程序进程ID,然后使用openProcess方法创建了一个Pointer。然后,我使用新创建的Pointer调用getBaseAddress。我认为问题在于EnumProcessModules / Psapi方法/类。
说实话,我有点不高兴,但这是我对该程序遇到的最后问题之一。我的总体目标是找到程序的基地址,使用各种偏移量来访问我要修改的信息,然后进行适当的修改。该程序是32位的,我见过其他人说您需要使用EnumProcessModulesEx方法吗?但说实话,我不确定如何/在哪里实现。
任何帮助,将不胜感激!
Here is a link to a github of the majority of my project
最佳答案
您收到一个Access Denied
错误,因为Windows要求您在当前进程上enable Debug privilege才能访问另一个进程的内存。因此,您既需要以管理员身份运行程序,又需要在调用OpenProcess代码之前启用调试特权。
这是我的应用程序中执行此操作的JNA代码。这是一个静态方法,因为我只为整个应用程序调用一次:
/**
* Enables debug privileges for this process, required for OpenProcess() to
* get processes other than the current user
*/
private static void 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;
}
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;
}
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, 0, null, null);
if (!success) {
LOG.error("AdjustTokenPrivileges failed. Error: {}" + Native.getLastError());
}
Kernel32.INSTANCE.CloseHandle(hToken.getValue());
}
通过查看您的代码,我不确定您是否也具有
OpenProcess
的正确权限。确保您具有VM_READ
权限。这是我使用的方法,您的行程可能会有所不同(我假设您也需要写权限)。final HANDLE pHandle = Kernel32.INSTANCE.OpenProcess(
WinNT.PROCESS_QUERY_INFORMATION | WinNT.PROCESS_VM_READ,
false, processID);