Изменить строку в байт-коде Java (jar) - PullRequest
3 голосов
/ 09 ноября 2009

Я хочу изменить строку подключения, которая жестко запрограммирована в приложении Java (jar без источника).

Полагаю, можно декомпилировать банку, затем сменить источник и перекомпилировать на новую банку, но есть ли более быстрый способ сделать это?

EDIT:

  • Это отдельное приложение, а не баночка, которую я загружаю из собственного кода
  • Я сомневаюсь, что это будет запутано: нишевое научное приложение, автор AWOL.
  • Решение, которое влечет за собой изменение строки «в памяти» во время работы приложения, также будет достаточным, но не идеальным

Ответы [ 5 ]

10 голосов
/ 09 ноября 2009

В вашем приложении, которое использует эту банку, вы можете использовать отражение , чтобы установить строку подключения. (Отражение можно использовать даже с частными сеттерами).

Очевидно, что если сеттер общедоступен, вы можете просто вызвать его без отражения.

4 голосов
/ 09 ноября 2009

Я думаю, что декомпиляция, вероятно, самый быстрый способ, при условии, что код не был запутан таким образом, что обратная декомпиляция / компиляция невозможна. Вы собираетесь иметь , чтобы все равно декомпилировать код, чтобы найти строку подключения, так что вы уже на полпути.

Что еще более важно, вы можете воспользоваться этим методом, чтобы вытащить строку подключения в файл свойств и, следовательно (надеюсь) выполнить декомпиляцию только один раз!

0 голосов
/ 11 ноября 2009

Полагаю, вы уже подумали об этом, но, возможно, вы могли бы просто использовать наследование, если скомпилированный метод в файле .jar выглядит примерно так:

public String getConnectionString () {...

затем просто расширьте класс, переопределите метод для возврата новой строки и используйте вместо этого ваш класс. Очевидно, это работает только в том случае, если суперкласс не является финальным, метод не является финальным, а также общедоступным или защищенным (если вы можете использовать то же имя пакета).

0 голосов
/ 09 ноября 2009

Поскольку jar-файлы - это просто ZIP-файлы с определенной структурой, вы можете использовать zip-инструмент (WinZip и т. Д.) Для извлечения файлов классов; затем вы используете шестнадцатеричный редактор для изменения файлов классов (это не должно быть слишком сложно, если новая строка подключения имеет ту же длину, что и старая); после этого вы заархивируете его обратно в файл jar.

Конечно, это должна быть ваша последняя попытка, когда все остальные возможности, описанные выше, не работают.

0 голосов
/ 09 ноября 2009

Поскольку Jar-файлы часто не сжимаются, существует небольшая вероятность того, что адрес будет виден в виде простого текста в Jar-файле. Вы можете попробовать отредактировать Jar с помощью редактора, который не боится двоичных данных (я использую vim), и просто найдите и измените текст при условии, что старый адрес и новый используют одинаковое количество символов. Это примитивно, но очень просто.

Если это не сработает, вам понадобится другой подход.

Конечно, вы захотите сохранить резервную копию банки на случай, если этот подход не удастся.

...