JNA - EnumProcessModules() не возвращает все библиотеки DLL?

Я пытаюсь прочитать координаты из игры. Это прекрасно работает при использовании ReadProcessMemory для РУЧКИ, которую я получаю через OpenProcess, с памятью, которую я нахожу в CheatEngine. Например, если я знаю, что значение с плавающей запятой в запущенном процессе равно 0x5AB38F68, я могу прочитать это.

Однако адрес меняется каждый раз при перезапуске игры. Это зависит от модуля AkSoundEngine.dll. Таким образом, в основном адрес будет в AkSoundEngine.dll+0x168F68. Тем не менее, я не могу на всю жизнь найти базовый адрес указанной DLL. Это показывает в CE: Нажмите для изображения

Однако при использовании EnumProcessModules() на том же HANDLE, что и раньше, это приводит к следующим результатам:

[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. Большая часть этого происходит в методе updatePosition() Game.java.

1 ответ

Решение

Решением было использовать EnumProcessModulesEx() с флагом для 32-битного. Мне также сказали, что если Java является 64-битной, каждый HMODULE имеет длину 8 байт. Кроме того, есть некоторые проблемы с флагом PROCESS_ALL_ACCESS при использовании EnumProcessModulesEx() в более новых системах.

Другие вопросы по тегам