2011-08-04 7 views
1

カスタムクラスローダーによって読み込まれたJavaクラスをリバースエンジニアリングしようとしています。Javaクラスオブジェクトをクラスファイルにシリアル化できますか?

私はバイナリの内容を保存しようとしましたが、後でデコンパイルしようとしましたが、デコンパイラは通常のJavaクラスではないと苦情を言いました。

実行時に私はクラスオブジェクトを持っています。 sun javaクラスと同じ規約に従うクラスファイルにシリアライズすることは可能ですか?

追加:代わりに、Javaクラスオブジェクトで動作できるデコンパイラAPIがありますか?

+0

デコンパイラAPIはありませんが、バイトコードを取得できます。クラスオブジェクトを持っていれば、JVMバイトコードで処理されているだけです。バイトコード自体は「一般的に」使用できません。 – bestsss

+0

私はあなたの質問を誤解しているかもしれませんが、クラスの「バイナリコンテンツ」を持っている場合は、低レベルの[Solum](https://github.com/TkTech/Solum)ライブラリがあなたを助けることができますより高いレベルの逆コンパイラが失敗します。 'solum.bytecode.Disassembler'を使って、有効なクラスを持たずに直接バイトコードを逆コンパイルすることができます。 – TkTech

答えて

0

エー。なぜデコンパイラは文句を言うのですか?いくつかのコードは単純に逆コンパイルできません。たとえば、バイトコードがプッシュしてもポップしない場合は、それに対応するJavaコードはありません。

バイトコードを試してみてください。 javapを使ったクイックピークはすでに明らかになっているかもしれません。

+1

1.何らかの理由で、バイナリエディタを使用して手動で編集されたクラスファイルを私に渡しますが、ロードするクラスローダを提供します。典型的なクラスのすべての逆コンパイラが失敗するようになりました。 2.オリジナルのクラスファイルを構築できたら、バイトコードについて心配する必要はありません。 –

+0

ああ、私はそれを得ています。しかし、その後、オブジェクトのインスタンスを忘れてしまいます。あなたが欲しいのは、クラスに対する反省です。クラスローダをバイパスして、クラスのバイトコード表現を反映させたいとします。 – nes1983

2

ケースを回避する最も簡単な方法(imo)は、java.lang.ClassLoaderを直接ハッキングし、ロードされたクラスの外観を確認してprotected final Class<?> defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain)を追跡し、自分のバージョンとフックで置き換えます。独自のバージョンのjava.lang.ClassLoaderをコンパイルするときは、java - -Xbootclasspath/p

のいずれかをインストールすると、同様の効果が得られます。

ハッピーハッキング!

+0

したがって、クラスがClassLoaderから放出される前に実行時に計測されていても、結果はここに表示されますか?それは役に立つかもしれない。 –

+0

かなり可。実際のバイトコードは「JVMのもの」になります。 – bestsss

関連する問題