0

私はJavaクラスファイルを持っています.3番目の部分です.ソースはありません.

私はそれを逆コンパイルしようとしましたが、ソースは使用に適していません。難読化されており、完全なものではないようです。

どうやってやるの?

4

4 に答える 4

1

おそらく難読化されています、完全ではないとは思いません。

このアプローチはお勧めしません。コードで例外をキャッチできないのはなぜですか? ただそれをして先に進んでください。

他の誰かのコードを編集するよりも好まれるもう 1 つの方法は、そのクラスを拡張する独自のラッパーを作成することです。気分を害するメソッドで例外をキャッチします。

どちらも、他人のコードを逆コンパイルして変更するよりも望ましい方法です。それは長期的な悲しみのレシピです。

このような:

public class BadLibrary {
    public void toast() { throw new IllegalArgumentException(); }
}

public class MyWrapper extends BadLibrary {
    public void toast() { 
       try {
          super.toast(); 
       } catch (Exception e) {
           // log, print, or ignore.
       }
    }
}
于 2012-10-04T02:40:35.787 に答える
1

私が提供できる最善の解決策は、AspectJを使用し、CTW (コンパイル時間織り) アスペクトを使用することです。アスペクトでメソッドを try/catch でラップできます。これを行う場合、コードを変更する必要はなく、アスペクトはコンパイル時に挿入されるだけです。

もちろん、AOP を使用するとアプリケーションが複雑になるため、アスペクトを快適に使用できる必要があります。それ以外の場合は、@duffymo のソリューションを強くお勧めし、try/catch を含む独自のクラスでサードパーティのライブラリをラップします。

于 2012-10-04T04:16:42.080 に答える
1

元のクラスの代わりにラップされたクラスをインスタンス化するように手配できないためにラッパーが機能しない場合は、難しい問題があります。

  • お気づきのように、難読化されたクラスを逆コンパイルすると、ソース コードがコンパイルされない可能性があります。そして、これが内部クラスであるという事実は、これをさらにトリッキーにする可能性があります。

  • バイトコード エンジニアリングが機能する可能性があります。たとえば、障害のあるクラスをインスタンス化している を見つけ、newそれを変更してラッパー クラスをインスタンス化します。しかし、内部クラスをリフレクティブにインスタンス化するためにラッパー クラスを作成する必要があります。難読化、アクセス制限、および非静的ネスト クラスがインスタンス化されるときに渡す必要がある隠しパラメータのために、面倒です。

上記のどちらもかなりの痛みを伴います。成功したとしても、サードパーティのライブラリを新しいバージョンにアップグレードする必要がある場合、将来の問題が残ります。

別の方法で問題に対処すると思います。例えば:

  • 例外の原因を特定し、例外をトリガーする条件を回避する回避策を実装してみてください。

  • 使用しようとしている製品のサポート チームに連絡し、修正または回避策を提供してもらいます。

  • ソースコードと、問題にパッチを当ててソースから再構築する手段を提供する別の製品に変更します。

于 2012-10-04T03:06:06.993 に答える
0

どの逆コンパイラを使用していますか? 私はJD GUIをうまく使いました

于 2012-10-04T02:40:22.457 に答える