18

OllyDbg / SoftICE for javaに似たユーティリティはありますか?つまり、クラスを実行し(jarから/クラスパスを使用)、ソースコードなしで、中間コードの逆アセンブルを示し、ステップスルー/ステップオーバー/参照の検索/メモリ内の特定の中間コードの編集/ファイルへの編集の適用を行います。 。

そうでない場合は、このようなものを書くことさえ可能ですか(デバッグ期間中はホットスポットなしで生きることをいとわないと仮定します)?

編集:私はJADまたはJDまたはCavajについて話していません。これらは優れた逆コンパイラですが、いくつかの理由で逆コンパイラは必要ありません。最も注目すべきは、出力が正しくないことです(せいぜい、場合によってはまったく間違っていることもあります)。私は魔法の「Javaコードにコンパイルされたバイト」を探していません-実行されようとしている実際のバイトを見たいのです。また、(アセンブリデバッガーの場合と同様に)これらのバイトを変更し、できれば変更した部分をクラスファイルに書き戻す機能が必要です。

Edit2:javapが存在することは知っていますが、それは1つの方法しか実行しません(そして、いかなる種類の分析も行いません)。例(vmspecドキュメントから取得したコード):javaコードから、「javac」を使用してこれをコンパイルします。

void setIt(int value) {
    i = value;
}
int getIt() {
    return i;
}

java.classファイルに。javap -cを使用すると、次の出力を取得できます。

    Method void setIt(int)
   0    aload_0
   1    iload_1
   2    putfield #4
   5    return
    Method int getIt()
   0    aload_0
   1    getfield #4
   4    ireturn

これは逆アセンブル部分では問題ありませんが(分析なしではあまり良くありません-「フィールド#4はExample.i」です)、他の2つの「ツール」が見つかりません。

  1. 命令自体(スタック、メモリダンプなど)を調べて、実際のコードと環境を調べることができるデバッガー。
  2. プロセスを逆にする方法-分解されたコードを編集し、(編集されたコードを使用して).classファイルを再作成します。
4

2 に答える 2

12

これは本当に完全な答えではないと思いますが、何か実行可能なものを提供する可能性のあるいくつかのポインタ:

(1)バイトコードを表示して直接操作するという点では、古いBCELクラス構築キットが便利です(これは、私が知っているバイトコード用の唯一のGUIエディターです)。

(2)デバッグとバイトコードのステップスルーに関しては、 Eclipseのデバッガーと統合されたこのEclipseプラグインがニーズを満たす可能性があります。

これらの機能を組み合わせて、コードの実行中にバイトコードを操作できるようにするユーティリティを私は知りません(少なくともOllyDbgなどでできるのと同じ方法で)。ただし、JavaデバッガーAPIは、実行時のコード操作をサポートできる必要があります(ただし、HotSpotとJITの性質を考えると、命令が呼び出される直前に命令を書き直すことができるかどうかはわかりません。 -現在実行中のバイトコードオペコードは、実際には、逆アセンブルされたオペコードが実際にCPUに送信される命令であるネイティブコードとは異なり、インタプリタがopの実装を選択する方法を抽象化したものです。または、実行時にバイトコードを再定義する方法を提供するJavaInstrumentationAPIを調べることもできます。そしてもちろん、さまざまなオープンソースのバイトコード操作ライブラリのいずれかが、インスピレーションを助けたり提供したりできる可能性があります。

そしてもちろん、JVMインフラストラクチャ全体を回避し、JVMプロセスにデバッガーを接続するというオプションは常にあります。この質問その質問からリンクされているこのページで、これに関するいくつかの議論があります。

ただし、肝心なのは、ネイティブコードの世界では当たり前のことですが、Javaの世界ではそれほど一般的な慣習ではないということです(Javaを使用する理由の一部は抽象化です)。すべての残酷な詳細から)。これと、バイトコードの逆コンパイルの比較的些細な性質(たとえばC ++と比較して)は、このタイプの要件が不足している状況につながり、このタイプのツールも同様です。

于 2010-04-02T02:34:37.923 に答える
2

Javaコードを逆コンパイルするためのJADDecomplierを見てください。次に、生成されたソースを使用してIDEの組み込みデバッガーを実行できます。IDEは、IntelliJ、Eclipse、またはNetBeansにすることができます。このアプローチは完全に自動ではありませんが、それでうまくいくはずです。

于 2010-03-31T06:27:38.390 に答える