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

Я пытаюсь прочитать координаты из игры. Это отлично работает при использовании ReadProcessMemory для HANDLE, который я получаю через 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.


person Schaka    schedule 08.02.2015    source источник


Ответы (1)


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

person Schaka    schedule 13.02.2015