gpt4 book ai didi

Java JNA - 基址查找

转载 作者:行者123 更新时间:2023-11-30 06:49:38 25 4
gpt4 key购买 nike

我目前正在尝试通过使用 JNA for Java 来读取/写入内存。在过去的一周里,我尝试了多种解决方案,大部分来 self 在网上找到的[类似项目][1],但没有任何解决方案可以解决我的问题。

我知道我收到了程序的正确进程 ID,然后我使用 openProcess 方法创建了一个指针。然后我使用新创建的指针调用 getBaseAddress。我认为问题出在 EnumProcessModules/Psapi 方法/类中。

说实话,我有点不知所措,但这是我在这个程序中遇到的最后问题之一。我的总体目标是找到程序的基地址,使用各种偏移量来访问我试图修改的信息,然后进行适当的修改。该程序是32位的,我看到其他人说你需要使用EnumProcessModulesEx方法?但说实话,我不确定如何/在哪里实现它。

如有任何帮助,我们将不胜感激!

最佳答案

您收到拒绝访问错误,因为 Windows 要求您enable Debug privilege在访问另一个进程的内存之前先访问当前进程。因此,您需要以管理员身份运行程序,并且在调用 OpenProcess 代码之前启用调试权限。

这是我的应用程序中执行此操作的 JNA 代码。这是一个静态方法,因为我只为整个应用程序调用一次:

/**
* 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, 0, 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;
}

通过查看您的代码,我不确定您是否也拥有 OpenProcess 的正确权限。确保您拥有 VM_READ 权限。这是我使用的,您的情况可能会有所不同(我假设您也需要写入权限)。

final HANDLE pHandle = Kernel32.INSTANCE.OpenProcess(
WinNT.PROCESS_QUERY_INFORMATION | WinNT.PROCESS_VM_READ,
false, processID);

关于Java JNA - 基址查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43079931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com