我试图从游戏中读取坐标。当在我通过 OpenProcess 接收的 HANDLE 上使用 ReadProcessMemory 时,这工作得非常好,我在 CheatEngine 中找到了内存。例如,如果我知道正在运行的进程中的浮点值是 0x5AB38F68,我可以读取这个。
但是,每次重新启动游戏时,地址都会更改。它依赖于一个名为 AkSoundEngine.dll 的模块。所以基本上地址是 AkSoundEngine.dll+0x168F68。但是,我终生无法找到所述 DLL 的基地址。它在 CE 中显示:点击查看图片
但是,当在与以前相同的 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,作为LPMODULEINFO
GetModuleInformation() 返回的一部分。
是不是我刚刚遇到了 JNA 中可行的方法(我对此表示怀疑,因为我只是在调用 C 代码)?
我不知道如何更具体地问,但你可以在我的 GitHub 上看到整个代码。其中大部分发生在 Game.java 的 updatePosition() 方法中。