Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javajna-基址查找_Java_Memory_Jna_Psapi - Fatal编程技术网

javajna-基址查找

javajna-基址查找,java,memory,jna,psapi,Java,Memory,Jna,Psapi,我目前正试图通过使用JNA for Java来读/写内存。在过去的一周里,我尝试了很多解决方案,主要是从我在网上找到的,但都没有解决我的问题 我知道我正在接收程序的正确进程ID,然后我使用openProcess方法创建了一个指针。然后我使用新创建的指针调用getBaseAddress。我认为问题在于EnumProcessModules/Psapi方法/类 说实话,我有点不知所措,但这是我在这个项目中遇到的最后一个问题之一。我的总体目标是找到程序的基址,使用各种偏移量访问我试图修改的信息,然后适当

我目前正试图通过使用JNA for Java来读/写内存。在过去的一周里,我尝试了很多解决方案,主要是从我在网上找到的,但都没有解决我的问题

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

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

任何帮助都将不胜感激


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

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

/**
*启用此进程的调试权限,这是OpenProcess()获取
*当前用户以外的进程
*
*@return{@code true}如果调试权限已成功启用。
*/
私有静态布尔enableDebugPrivilege(){
HANDLEByReference hToken=新的HANDLEByReference();
布尔成功=Advapi32.INSTANCE.OpenProcessToken(Kernel32.INSTANCE.GetCurrentProcess(),
WinNT.TOKEN_QUERY | WinNT.TOKEN_ADJUST_PRIVILEGES,hToken);
如果(!成功){
错误(“OpenProcessToken失败。错误:{}”,Native.getLastError());
返回false;
}
试一试{
WinNT.LUID LUID=新的WinNT.LUID();
success=Advapi32.INSTANCE.LookupPrivilegeValue(null,WinNT.SE_DEBUG_NAME,luid);
如果(!成功){
LOG.error(“LookupPrivilegeValue失败。错误:{}”,Native.getLastError());
返回false;
}
WinNT.TOKEN_特权tkp=新的WinNT.TOKEN_特权(1);
tkp.Privileges[0]=新的WinNT.LUID_和_属性(LUID,新的DWORD(WinNT.SE_PRIVILEGE_启用));
success=Advapi32.INSTANCE.AdjustTokenPrivileges(hToken.getValue(),false,tkp,0,null,null);
int err=Native.getLastError();
如果(!成功){
LOG.error(“AdjustTokenPrivileges失败。错误:{}”,err);
返回false;
}else if(err==WinError.ERROR\u未\u分配全部\u){
debug(“未启用调试权限”);
返回false;
}
}最后{
CloseHandle(hToken.getValue());
}
返回true;
}
通过查看您的代码,我不确定您是否也拥有
OpenProcess
的正确权限。请确保您具有
VM\u READ
权限。这是我使用的,你的里程数可能会有所不同(我想你也需要写权限)


你对自己的问题和症状/错误有点模糊。您能否更具体地说明您正在尝试使用的特殊命令/函数/方法,以及哪些不适用?我已经开始在我自己的项目上走这条路了,您需要做的第一件事是启用调试权限,但在随机回答之前,我想看看您正在尝试做什么。目前,Editor.java中的getBaseAddress方法开始使用EnumProcessModules方法(来自PsapiTools)创建模块列表基于给定的指针。我相信我提供了正确的指针,这样就不会有问题了。跳转到EnumProcessModules方法,它似乎在Psapi.INSTANCE.EnumProcessModules(…)处失败;行,然后将Success设置为false,最后在整个链中抛出一个错误。我不知道这是为什么。抛出了什么错误?这是访问冲突吗?EnumProcessModules抛出错误,因为“success”不是true。错误显示为“EnumProcessModules失败。错误:5”。我查看的错误代码列表显示错误5为“拒绝访问”。我将特权设置为所有访问权限(这样可以吗?),它不再抛出该错误。但是,它在getBaseAddress下返回0,这表示它找不到文件名包含游戏名称的模块。在debug中,我可以看到整个列表的大小为10,但它们的所有LPBaseOfDell变量都为null,这一定是由EnumProcessModules引起的?我刚刚提交了一些对github repo的更改,其中包括您建议的更改。我通过更改所有访问权限(我不确定是否应该这样做)来阻止错误。还包括你的安全措施。现在的问题是getBaseAddress返回0,这表示它无法找到包含我提供的内容的文件名。在调试中,我可以看到模块列表“hModules”是空的(?),所有条目看起来都类似于此:我假设EnumProcessModules存在一些问题?这开始从问答转到调试帮助:)查看您的
EnumProcessModules
代码,我发现当Windows签名为
DWORDByReference
时,您有一个
IntByReference
用于
LPCBneeds
。不知道这是否会导致问题。另外,当数组长度需要为整个数组的字节大小时,您正在传递数组长度
lphModule.length
,因此将该长度乘以
指针的大小。这看起来直接相关。非常感谢你!你发布的那个链接在如何获得基础a方面提供了非常有用的github repo
final HANDLE pHandle = Kernel32.INSTANCE.OpenProcess(
    WinNT.PROCESS_QUERY_INFORMATION | WinNT.PROCESS_VM_READ, 
    false, processID);