シダフラワーについて
FernFflower は、Java 用、そしておそらく一般的な高水準プログラミング言語用の、実際に動作する最初の分析逆コンパイラーです。当然のことながら、まだ開発中です。バグ レポートと改善提案を [問題トラッカー](https://youtrack.jetbrains.com/newIssue?project=IDEA&clearDraft=true&c=Subsystem+Java.Decompiler) に送信してください。
シダフラワーとフォージフラワー
FernFflower には、ForgeFflower からのパッチがいくつか含まれています。 ForgeFflower のメンテナーの貴重な貢献と機能強化に心からの感謝の意を表します。
ライセンス
FernFflower は、Apache License Version 2.0 に基づいてライセンスされています。
コマンドラインから実行する
java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>
* は 0 回以上を意味します
+ は 1 回以上を意味します
<source>: 逆コンパイルするファイルが含まれるファイルまたはディレクトリ。ディレクトリは再帰的にスキャンされます。許可されるファイル拡張子は、class、zip、jar です。 -e= という接頭辞が付いたソースは、逆コンパイルされないが、クラスまたはメソッド間の関係を分析するときに考慮される「ライブラリ」ファイルを意味します。特に識別子の名前変更 (s. オプション 'ren') は、外部クラスに関する情報から恩恵を受けることができます。
<宛先>: 宛先ディレクトリ
<option>、<value>: 対応する値を持つコマンド ライン オプション (下記の「コマンド ライン オプション」を参照)。
例:
java -jar fernflower.jar -hes=0 -hdc=0 c:Tempbinary -e=c:Javart.jar c:Tempsource
java -jar fernflower.jar -dgs=1 c:Tempbinarylibrary.jar c:TempbinaryBoot.class c:Tempsource
コマンドラインオプション
mpm と urc を除き、値 1 はオプションがアクティブであることを意味し、0 - 非アクティブであることを意味します。デフォルト値がある場合は、括弧内に指定します。
通常、次のオプションは、必要に応じてユーザーによって変更されます: hes、hdc、dgs、mpm、ren、urc 残りのオプションはそのままにしておくことができます。これらはプロのリバース エンジニアを対象としています。
- rbr (1): ブリッジメソッドを非表示にする
- rsy (0): 合成クラスのメンバーを非表示にする
- din (1): 内部クラスを逆コンパイルします。
- dc4 (1): 1.4 クラス参照を折りたたむ
- das (1): アサーションを逆コンパイルする
- 彼 (1): 空のスーパー呼び出しを非表示にする
- hdc (1): 空のデフォルトコンストラクターを非表示にする
- dgs (0): 汎用署名を逆コンパイルします。
- ner (1): 例外をスローしない戻り値を想定します
- den (1): 列挙型を逆コンパイルする
- rgn (1): getClass() 呼び出しが修飾された新しいステートメントの一部である場合、 getClass() 呼び出しを削除します。
- 点灯 (0): 数値リテラルを「そのまま」出力します。
- asc (0): 文字列および文字リテラル内の非 ASCII 文字を Unicode エスケープとしてエンコードします。
- bto (1): int 1 をブール値 true として解釈します (コンパイラのバグの回避策)
- nns (0): 合成属性を設定しないことを許可します (コンパイラのバグの回避策)
- uto (1): 名前のない型を java.lang.Object として考慮します (コンパイラ アーキテクチャの欠陥に対する回避策)
- udv (1): デバッグ情報が存在する場合、デバッグ情報から変数名を再構築します。
- ump (1): 対応する属性 (存在する場合) からパラメータ名を再構築します。
- rer (1): 空の例外範囲を削除します。
- fdi (1): Final 構造体のインライン化を解除する
- mpm (0): 逆コンパイルされたメソッドごとに許可される最大処理時間 (秒単位)。 0は上限なしを意味します
- ren (0): あいまいな (難読化された) クラスとクラス要素の名前を変更します。
- urc (-): IIdentifierRenamer インターフェイスを実装するユーザー指定のクラスの完全な名前。これは、どのクラス識別子の名前を変更する必要があるかを決定し、新しい識別子名を提供するために使用されます (「識別子の名前変更」を参照)。
- inn (1): IntelliJ IDEA 固有の @NotNull アノテーションを確認し、見つかった場合は挿入されたコードを削除します
- lac (0): ラムダ式を匿名クラスに逆コンパイルします。
- nls (0): 出力に使用する改行文字を定義します。 0 - 'rn' (Windows)、1 - 'n' (Unix)、デフォルトは OS に依存します。
- ind: インデント文字列 (デフォルトは 3 つのスペース)
- crp (0): 可能な場合はレコード パターンを使用します
- cps (0): 可能な場合はパターンを含むスイッチを使用します
- log (INFO): ログレベル。可能な値は TRACE、INFO、WARN、ERROR です。
- iec (0): 逆コンパイル時にクラスパス全体をコンテキストに含めます
- isl (1): インラインの単純なラムダ式
- ucrc (1): 不要なレコードコンストラクターとゲッターを非表示にします。
- cci (1): try-with-resources のリソースが実際に
AutoCloseable
インターフェイスを実装しているかどうかを確認します - jvn (0): ローカル変数名を JAD スタイル名で上書きします。
- jpr (0): JAD 命名にパラメータ名を含めます
識別子の名前変更
難読化ツールの中には、クラスとそのメンバー要素に短く、意味のない、そして何よりも曖昧な名前を付けるものがあります。このようなコードを再コンパイルすると、多数の競合が発生します。したがって、逆コンパイラに要素の名前を順番に変更させ、各識別子の一意性を確保することをお勧めします。
オプション「ren」(つまり、-ren=1) は、名前変更機能を有効にします。デフォルトの名前変更戦略は次のようになります。
- 要素の名前が予約語であるか、3 文字未満の場合は要素の名前を変更します。
- 新しい名前は、単純なパターンに従って構築されます: (クラス|メソッド|フィールド)_<連続する一意の番号>
名前変更時に逆コンパイラーによって呼び出される 4 つの主要なメソッドの独自の実装を提供することで、このルールを上書きできます。 org.jetbrains.java.decompiler.main.extern.IIdentifierRenamer をオプション 'urc' で実装するクラス (例 -urc=com.example.MyRenamer) を FernFlower に渡すだけです。このクラスはアプリケーションのクラスパス上で使用できる必要があります。
各メソッドの意味は名前から明らかです。toBeRenamed は要素の名前が変更されるかどうかを決定し、他の 3 つはそれぞれクラス、メソッド、フィールドに新しい名前を提供します。