5

そのため、コンパイル済みの Java プログラムにわずかな有効な法的変更を加えようとしています。JD-GUI for Mac を使用して逆コンパイルしています。ほとんどの場合、逆コンパイルされたコードにはエラーがありませんが、宣言されていない変数、複数の同一の変数宣言、すぐにコンパイルできない奇妙なステートメントなど、奇妙なことがいくつかあります。逆コンパイルされたコードの奇妙なステートメントのいくつかは、本当に不可解です。特に 1 つの switch ステートメントで問題が発生しました。

    switch ($SWITCH_TABLE$PackageName$ClassName$InnerEnumName()[getPlatform().ordinal()])

PackageName.ClassName はこのステートメントが含まれるクラスであり、InnerEnumName は ClassName 内の内部列挙型です。getPlatform() は ClassName のメソッドであり、InnerEnumName 型の列挙型を返すことにも注意してください。

奇妙な部分は、このクラスから問題のあるステートメントを取り除いてコンパイルし、プログラムに挿入し直したところ、動作し始めましたが、いくつかの奇妙なバグがありました。たとえば、switchステートメントを次のように変更した場合

    switch (getPlatform().ordinal())

ケース 4 にヒットするはずのときに、ケース 3 (3 番目のケースと値 3 のケース) にヒットし始めました (再び 4 番目のケースと値 4 のケース)。

4

3 に答える 3

3

逆コンパイルは常に不完全になります。デコンパイラーはバイトコードを取得し、元のソースをリバースエンジニアリングして、ループがどこにあるか、ループ制御が何であるかなどを把握する必要があります。重要なプログラムで完璧であるとは決して期待できません。

$名の場合、これらは内部クラスを「偽造」するプロセスで内部的に生成される名前です(JVMは実際には内部クラスをサポートしていないため)。逆コンパイラーは、内部クラスが何であるかを理解し、それらとコンパイラーが作成したオブジェクトに適切な名前を付けて、物事を偽造するという不完全な仕事をしているようです。バイトコード形式に精通している人は、おそらくかなり迅速に物事を整理することができますが、他の人と同様に、それは簡単ではありません。

(この特定のケースでは、コンパイラーが何らかの理由で、内部列挙値から他の値へのマッピングテーブルを作成し、ステートメントを「削除」すると、そのマッピングが失われたようです。)

[逆コンパイラーが抱える大きな問題の1つは、javacがそのような動くターゲットであるということです。特に、内部クラスの実装などは絶えず調整されているため、ある週に機能したものが次のバージョンのコンパイラで失敗する可能性があります。]

于 2011-08-03T21:47:06.827 に答える
1

JD-GUI (JD?) には問題があるようです。より良い逆コンパイラを見つけてみませんか? 残念なことに、jad's Ancient は以前は良かったのです。

于 2011-08-03T21:33:32.553 に答える