3

Java アプリケーション (ソースのない jar) でハードコーディングされている接続文字列を変更したいと考えています。

jar を逆コンパイルしてから、ソースを変更して新しい jar に再​​コンパイルすることは可能だと思いますが、これを行うより迅速な方法はありますか?

編集:

  • これはスタンドアロン アプリケーションであり、独自のコードからロードしている jar ではありません
  • 難読化されているとは思えません。ニッチな科学的アプリケーション、作者AWOL.
  • アプリの実行中に「メモリ内」の文字列を変更することを伴うソリューションでも十分ですが、理想的ではありません
4

5 に答える 5

10

そのjarを使用するアプリケーションでは、リフレクションを使用して接続文字列を設定できます。(リフレクションはプライベートセッターでも使用できます)。

明らかに、セッターが公開されている場合は、反省せずに呼び出すことができます。

于 2009-11-09T11:41:50.637 に答える
4

逆コンパイル/コンパイルのラウンドトリップが不可能になるようにコードが難読化されていない場合は、逆コンパイルがおそらく最も速い方法だと思います。とにかく接続文字列を見つけるためにコードを逆コンパイルする必要があるので、すでに途中です。

さらに重要なことに、このメソッドを利用して接続文字列をプロパティファイルに引き出すことができるため、(うまくいけば)逆コンパイルを1回だけ実行できます。

于 2009-11-09T11:41:18.777 に答える
0

jarファイルは特定の構造を持つ単なるZIPファイルであるため、zipツール(WinZipなど)を使用してクラスファイルを抽出できます。次に、16進エディタを使用してクラスファイルを変更します(新しい接続文字列の長さが古い接続文字列と同じであれば、それほど難しくはありません)。その後、それをjarファイルに圧縮して戻します。

もちろん、これは、上記の他のすべての可能性が機能しない場合にのみ、最後の試みである必要があります。

于 2009-11-09T12:14:36.933 に答える
0

すでに考えていると思いますが、.jar ファイルのコンパイル済みメソッドが次のようになっている場合は、単純に継承を使用することもできます。

public String getConnectionString(){...

次に、クラスを拡張し、メソッドをオーバーライドして新しい文字列を返し、代わりにクラスを使用します。明らかに、これはスーパークラスが最終的ではなく、メソッドが最終的ではなく、パブリックまたは保護されている場合にのみ機能します (同じパッケージ名を使用できる場合)。

于 2009-11-11T12:13:09.547 に答える
0

Jar は多くの場合圧縮されていないため、Jar 内でアドレスがプレーン テキストとして表示される可能性がわずかにあります。古いアドレスと新しいアドレスが同じ文字数を使用していれば、バイナリ データを恐れないエディタ (私は vim を使用) で Jar を編集し、テキストを検索して変更することができます。これは原始的ですが、非常に単純です。

うまくいかない場合は、他のアプローチのいずれかが必要になります。

もちろん、このアプローチが失敗した場合に備えて、jar のバックアップ コピーを保持しておく必要があります。

于 2009-11-09T12:09:21.123 に答える