0

だからここに私の状況があります:

CPU 使用率の高い Java クライアント/サーバー アーキテクチャを実行しており、メインの「サーバー」スレッドの遅延時間を短縮しようとしています。CPU を占有するコードを特定するために、YourKit を使用してサーバーのプロファイリングを行っています。

問題は:

私は他人のコードを使用していますが、その書き方のせいで、私がアクセスできない特別な難読化ツールを使用せずに逆コンパイルしてから再コンパイルすることは不可能です (いいえ、私は著作権などに違反していません)。

私が現在していること:

難読化を心配せずにクラス ファイルを変更するために、Storyyeller のすばらしい Krakatau 逆コンパイラ ( https://github.com/Storyyeller/Krakatau ) を使用して、クラス ファイルをアセンブリ ファイルに逆アセンブルしました。

Jasmin のリファレンス ページを見ながら手動で .j アセンブリ ファイルを編集し (これには永遠に時間がかかり、よく失敗します)、それらをクラス ファイルに再アセンブルし、再度実行します。

私がしたいこと:

アセンブリを入念に編集するのではなく、.java ソース コードを .j アセンブリ コードに変換する方法を知っている人はいますか?

また、.class ファイルを単純に逆コンパイルした場合、インポート用のパッケージが存在しない場合でも単純に再コンパイルすることはできますか?

import com.bazinga.*;
public class MainThread{}//compile this even though package com.bazinga doesn't exist?

誰かが私がこれを行うことができる方法を知っていれば、本当に感謝しています!

4

1 に答える 1

1

アセンブリを入念に編集するのではなく、.java ソース コードを .j アセンブリ コードに変換する方法を知っている人はいますか?

はいといいえ。明らかな答えは、コードをコンパイルしてから、結果のクラスを逆アセンブルできるということです。ただし、コンパイルはコンテキストに依存する可能性があるため (静的な最終定数のインライン化、ネストされたクラスの処理など)、これが常に役立つとは限りません。さらに、コードを既存のメソッドに追加する場合は、既存のローカル変数スロットを使用したり、オペランド スタックを壊したりしないように注意する必要があります。

私の最善のアドバイスは、変更を可能な限り分離することです。たとえば、jar にコードを追加する場合は、既存のクラスに挿入するのではなく、追加するコードを Java で記述し、コンパイルしてクラスファイルを追加します。次に、ターゲット クラスを変更して、自分のクラス。

インポートに関しては、スタブに対してコンパイルできます。必要な名前でダミー クラスを作成し、必要に応じて呼び出す必要のあるダミー メソッドを作成します。実装は{throw null;}、実際に実行することはないため、コンパイル中にコンパイラを満足させるために存在する必要があるだけです。

于 2016-11-05T22:10:31.780 に答える