Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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
Java JNA内存读/写+;作弊引擎_Java_Jna_Cheat Engine_Memory Editing - Fatal编程技术网

Java JNA内存读/写+;作弊引擎

Java JNA内存读/写+;作弊引擎,java,jna,cheat-engine,memory-editing,Java,Jna,Cheat Engine,Memory Editing,我一直在做一个项目,涉及Java的JNA库和对游戏内存的读写,遇到了一些问题 首先,我试图找到游戏的基本地址(因为每次你重新打开它时它都会改变),然后我相信我应该能够添加我在作弊引擎中找到的偏移量,然后我得到我需要修改的地址。例如,作弊引擎为我提供了指针“Game.exe”+0170AFC0和49C的偏移量。我的理解是,如果我通过程序getBaseAddress方法获得Game.exe的基址,那么我可以将0170AFC0&49C添加到该基址,留下我想要修改的地址(至少,这是我的理解) 我相信我找

我一直在做一个项目,涉及Java的JNA库和对游戏内存的读写,遇到了一些问题

首先,我试图找到游戏的基本地址(因为每次你重新打开它时它都会改变),然后我相信我应该能够添加我在作弊引擎中找到的偏移量,然后我得到我需要修改的地址。例如,作弊引擎为我提供了指针“Game.exe”+0170AFC0和49C的偏移量。我的理解是,如果我通过程序getBaseAddress方法获得Game.exe的基址,那么我可以将0170AFC0&49C添加到该基址,留下我想要修改的地址(至少,这是我的理解)

我相信我找到了正确的基址(?),因为我在网上找到了一个有用的调试方法。该方法返回的基址是1BB5310,这正是我的getBaseAddress方法所找到的

问题是,当我遵循上述逻辑时,我的地址与我直接将其与作弊引擎进行比较时所查找的地址不匹配。例如:我找到1bb5310的基址,加上偏移量0170AFC0和49C,得到地址32C076C。然而,作弊引擎告诉我“Game.exe”+0170AFC0->18F8CA1C+49C->18F8CEB8

这给我留下了两个结论中的一个,我关于如何从基址到要修改的地址的逻辑不正确,或者我的getBaseAddress方法不正确

如果您能帮助解决这个问题,我们将不胜感激

对作弊引擎的澄清:
作弊引擎是一个程序,它将自身连接到正在运行的进程,并允许您查看/编辑与所述进程相关的内存。一个例子是。我们正在查看Calculator.exe程序的所有内存,其值为1000。由于内存的性质,每次重新启动程序时,内存地址都会发生变化。但是,您可以找到指向特定内存地址的指针,并为您提供类似的信息。最上面的地址是当前地址,然后偏移量是49c,最后是“Game.exe”+0170AFC0,我相信这是游戏的基址+偏移量。这样我就可以访问相同的信息,而不管我是否重新启动游戏(我相信它会离开游戏的基本地址)。不幸的是,作弊引擎似乎没有任何关于如何获取“Game.exe”地址的确切文档,但根据我的发现,它应该只是进程的基址。

我计算程序基址的代码以及查找动态地址的逻辑都被关闭。我的代码将很快在GitHub上更新,以供其他人使用

关于我的逻辑:

作弊引擎将为您提供一个指针,例如“Game.exe”+016F572C,您的偏移量为1D4。“Game.exe”实际上是基址。在我的情况下,“Game.exe”是使用getBaseAddress方法找到的。然后,您必须做的是将“016F572C”(或您的号码碰巧是什么)添加到您的基址,结果我将调用X。现在,读取位于X的内存,您将收到Y(对于32位应用程序读取为4字节,对于64位应用程序读取为8字节)。如果只有一个偏移量,请将偏移量添加到Y并完成


直接在此处发布所有相关代码。如果代码太多而不合理,您需要首先缩小问题的范围。我的文章中已经有了我的github repo,其中有非常明确的方向(getBaseAddress方法中的Editor/MemEdit.java)。我不想在这里复制它,因为这种方法依赖于其他方法,这只会使文章更加混乱。我觉得我很好地缩小了问题的范围,其中一个潜在的问题甚至不依赖于查看我的代码。我们大多数人都不熟悉作弊引擎,也不熟悉它如何为您提供这些偏移量,或者它们的含义。仅仅在十六进制上进行数学运算似乎证实了您的数学(我假设您的代码会这样做),但这似乎不是一个Java/JNA问题,而是一个关于解释作弊引擎输出的问题。因此,请在您的问题中提供更多关于作弊引擎如何以及为什么给出结果的详细信息,并提供文档链接或其他So帖子,显示您从何处获得这些补偿。我在帖子中添加了一些信息,希望对您有所帮助。这是一个有点作弊引擎的问题,我也会在他们的论坛上发布,也许有人能帮上忙。解决了这个问题,解释如下