Java JNA Память чтения / записи + чит-движок
Я работал над проектом, включающим библиотеку Java JNA и чтение / запись в память игры, и столкнулся с несколькими проблемами.
Чтобы предварить все, я пытаюсь найти базовый адрес игры (так как он будет меняться каждый раз, когда вы снова его открываете), затем я думаю, что я смогу добавить смещения, которые я нахожу в Cheat Engine, и затем я получаю адрес которого мне нужно изменить. Например, Cheat Engine предоставляет мне указатель "Game.exe"+0170AFC0 и смещение 49C. Насколько я понимаю, если я получу базовый адрес Game.exe с помощью метода getBaseAddress своих программ, я смогу добавить 0170AFC0 & 49C к этому базовому адресу, оставив мне адрес, который я хочу изменить (по крайней мере, это мое понимание).
Я считаю, что я правильно нашел базовый адрес (?), Так как я нашел полезный метод для отладки в Интернете. Этот метод возвращает базовый адрес 1BB5310, который является именно тем, что находит мой метод getBaseAddress.
Проблема в том, что когда я следую вышеупомянутой логике, мои адреса не совпадают с теми, которые я ищу, когда я сравниваю его с Cheat Engine напрямую. Пример: я нахожу базовый адрес 1bb5310, добавляю свои смещения 0170AFC0 и 49C и получаю адрес 32C076C. Однако Cheat Engine говорит мне "Game.exe"+0170AFC0 -> 18F8CA1C +49C -> 18F8CEB8
Это оставляет меня с одним из двух выводов: моя логика о том, как получить от базового адреса до адреса, который я хочу изменить, неверна, или мой метод getBaseAddress неверен.
Вот github моего текущего проекта (основной класс - Editor/MemEdit.java)
Любая помощь в выяснении, которая является проблемой, была бы очень признательна.
Пояснение к Cheat Engine: Cheat Engine - это программа, которая присоединяется к запущенному процессу и позволяет просматривать / редактировать память, связанную с указанным процессом. Пример здесь. Мы смотрим на всю память со значением 1000 для программы Calculator.exe. Из-за особенностей памяти, каждый раз, когда вы перезапускаете программу, адреса памяти меняются. Однако вы можете найти указатель, который указывает на определенный адрес памяти и предоставляет вам информацию, аналогичную этой. Верхним адресом является текущий адрес, затем он имеет смещение 49c и, наконец, "Game.exe"+0170AFC0, который, как я считаю, является базовым адресом игры + смещение. То, что тогда позволяет мне сделать, - это получить доступ к той же информации, независимо от того, перезапускаю ли я игру (я думаю, что она идет с базового адреса игры). К сожалению, у Cheat Engine нет точной документации о том, как он получает адрес "Game.exe", но из того, что я нашел, он должен быть просто базовым адресом процесса.
1 ответ
И мой код для расчета базового адреса программы, и логика для определения динамического адреса были отключены. Мой код будет обновлен на GitHub в ближайшее время для тех, кто также хочет это сделать.
Что касается моей логики:
Cheat Engine предоставит вам указатель "Game.exe"+016F572C, и у вас будет смещение 1D4, например. "Game.exe" является эффективным базовым адресом. В моей ситуации "Game.exe" находится с помощью метода getBaseAddress. Тогда вам нужно добавить "016F572C" (или каким бы ни был ваш номер) к вашему базовому адресу, в результате я назову X. Теперь прочитайте память, расположенную в X, и вы получите Y (читается как 4 байт для 32-битных приложений, 8 байт для 64-битных). Если у вас есть только одно смещение, добавьте смещение к Y и все готово!