JNA - EnumProcessModules()没有返回所有的DLL?

时间:2015-02-08 14:18:59

标签: java java-native-interface jna cheat-engine

我试图从游戏中读取坐标。当我在通过OpenProcess接收的HANDLE上使用ReadProcessMemory时,这可以很好地工作,我在CheatEngine中找到了内存。例如,如果我知道正在运行的进程中的浮点值是0x5AB38F68,我可以读这个。

但是,每次游戏重启时地址都会改变。它取决于一个名为AkSoundEngine.dll的模块。所以基本上地址是AkSoundEngine.dll + 0x168F68。但是,我不能为我的生活找到所说DLL的baseaddress。它在CE中显示:Click for Image

但是,在与以前相同的HANDLE上使用EnumProcessModules()时,结果如下:

[2015-02-08 09:26:09][INFO][Game:59] - C:\Windows\SYSTEM32\ntdll.dll
[2015-02-08 09:26:09][INFO][Game:59] - C:\Windows\SYSTEM32\wow64.dll
[2015-02-08 09:26:09][INFO][Game:59] - C:\Windows\SYSTEM32\wow64win.dll
[2015-02-08 09:26:09][INFO][Game:59] - C:\Windows\SYSTEM32\wow64cpu.dll
[2015-02-08 09:26:09][INFO][Game:59] - F:\Steam\steamapps\common\TheLongDark\tld.exe
[2015-02-08 09:26:09][INFO][Game:59] - F:\Steam\steamapps\common\TheLongDark\tld.exe
[2015-02-08 09:26:09][INFO][Game:59] - F:\Steam\steamapps\common\TheLongDark\tld.exe
[2015-02-08 09:26:09][INFO][Game:59] - F:\Steam\steamapps\common\TheLongDark\tld.exe
[2015-02-08 09:26:09][INFO][Game:59] - F:\Steam\steamapps\common\TheLongDark\tld.exe

DLL未显示。因此我的假设是,它可能位于其中一个tld.exe模块中。如果是这种情况,我将如何迭代模块的模块然后接收其基地址?我是否可以假设我还必须添加tld.exe的基址,如下所示: tld.exe+AkSoundEngine.dll+0x168F68

您可能还会注意到,它将tld.exe显示为模块的5倍,但只有2个返回BaseOfDll,作为GetModuleInformation()返回的LPMODULEINFO的一部分。

可能是,我刚刚遇到JNA中可行的事情(我怀疑,因为我只是在调用C代码)?

我不确定如何更具体地询问,但您可以在my GitHub看到整个代码。其中大部分都发生在Game.java的updatePosition()方法中。

1 个答案:

答案 0 :(得分:3)

解决方案是使用带有32位标志的EnumProcessModulesEx()。 我还被告知,如果Java是64位,则每个HMODULE长度为8个字节。 此外,在较新的系统上使用EnumProcessModulesEx()时,PROCESS_ALL_ACCESS标志存在一些问题。