
Krakatauは、Javaバイトコード用のアセンブラと逆アセンブラを提供します。これにより、バイナリクラスファイルを人間が読み取り可能なテキスト形式に変換し、変更を加え、難読化されたコードであってもクラスファイルに戻すことができます。また、手動でバイトコードを記述してゼロから独自のクラスファイルを作成したり、Javaバイナリの低レベルの詳細を調べたり比較したりすることもできます。javapとは異なり、Krakatauの逆アセンブラは高度に難読化されたコードも処理でき、逆アセンブルされた出力はクラスファイルに再アセンブルできます。
Krakatauはまた、Javaバイナリを読み取り可能なソースコードに変換するためのデコンパイラも提供します。他のデコンパイラとは異なり、Krakatauのデコンパイラは難読化されたコードを扱うために特別に設計されており、他のデコンパイラを破壊するようなトリックも簡単に処理できます。ただし、Krakatauのデコンパイラはラムダ式などの一部のJava 8以降の機能をサポートしていないため、古いコードで最も効果的に動作します。
Krakatauのアセンブラ構文は、いくつかの小さな非互換性を除いて、ほとんどの場合Jasmin構文のスーパーセットです。ただし、Jasminとは異なり、KrakatauはJava 19バイトコード仕様を完全にサポートし、古いバージョンのJVMに見られるいくつかの文書化されていない機能もサポートしています。アセンブラ構文の概要については、チュートリアルまたは完全な仕様を参照してください。
まず、RustとCargoをインストールする必要があります。次に、このリポジトリをクローンし、cargo build --releaseを実行します。これにより、target/release/krak2にバイナリが生成されます。これは直接呼び出したり、PATHに追加したり、シンボリックリンクを作成したりできます。
逆アセンブラには、デフォルトモードとラウンドトリップモードの2つのモードがあります。デフォルトモードは、結果のアセンブリファイルの可読性と変更の容易さに最適化されています。出力を再アセンブルすると、JVM仕様の観点からは元のクラスファイルと動作的に同等ですが、必ずしもビット単位で同一ではありません(例えば、定数プールエントリの順序が変わることがあります)。ラウンドトリップモードでは、元のクラスファイルとビット単位で同一のクラスファイルに再アセンブルされる出力が生成されますが、これはアセンブリファイルが定数プールエントリの正確な順序など、読み取りにくくする低レベルのエンコーディング情報を保持することを意味します。CLDCコードやScalaコードなど、非標準の属性に依存するコードを扱う場合は、ラウンドトリップモードを使用することをお勧めします。
使用例:
krak2 dis --out temp RecordTest.class
krak2 dis --out disassembled.zip --roundtrip r0lling-challenge.jar
個々のクラスファイルまたはjarファイル全体を逆アセンブルできます。入力ファイル名が.jarまたは.zipで終わる場合、jarファイルとして扱われ、jar内のすべての.classファイルが逆アセンブルされます。
--outオプションは出力先を制御します。--outの値がディレクトリの場合、出力はそのディレクトリ内の個別のファイルに配置されます。そうでない場合、--outの値が.jarまたは.zipで終わる場合、出力はその場所の単一のzipファイルに配置されます。--outの値が.jで終わる場合、出力はそのファイルに書き込まれます(単一の.jファイルには複数のクラスを含めることができ、すべてのクラスが逆アセンブルされて同じファイルに次々に書き込まれます)。--outオプションが完全に省略された場合、逆アセンブルされたクラスは標準出力に書き込まれます。
上記のようにラウンドトリップモードで逆アセンブルするには、--roundtripオプション(または短縮形の-r)を渡します。
Krakatauのアセンブラを使用すると、人間に優しいテキストベースの形式でJavaバイトコードを記述し、バイナリのJavaクラスファイルに変換できます。
krak2 asm --out temp Krakatau/tests/assembler/good/strictfp.j
個々の.jファイルまたはjarファイル全体をアセンブルできます。入力ファイル名が.jarまたは.zipで終わる場合、zipアーカイブとして扱われ、内部のすべての.jファイルがアセンブルされます。
--outオプションは出力先を制御します。--outの値がディレクトリの場合、出力はそのディレクトリ内の個別のファイルに配置されます。そうでない場合、--outの値が.jarまたは.zipで終わる場合、出力はその場所の単一のzipファイルに配置されます。--outの値が.classで終わる場合、単一の出力クラスファイルがそのファイルに書き込まれます(入力に複数のクラスがある場合、この場合はエラーになります)。
v2のデコンパイラはまだ開発中です。デコンパイルには、現在Krakatau v1を使用する必要があります。