我目前正在尝试通过使用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);

10-02 02:38
查看更多