Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
fernflower — JavaバイトコードからJavaへの逆コンパイラ。IntelliJ IDEAで使用されています。 | Kitploit
ツール/GitHubGitHub/jetbrains/fernflower
静的分析リバースエンジニアリングバイナリ解析
GitHubjetbrains/fernflower

fernflower

JavaバイトコードからJavaへの逆コンパイラ。IntelliJ IDEAで使用されています。

リポジトリを見るウェブサイト
4.4k72610日前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Fernflower

Fernflowerは、Java向けの最初の実際に動作する解析型逆コンパイラであり、おそらく高水準プログラミング言語全般としても最初のものです。

リリースは、Intellij Communityリポジトリ で公開されています。

バグ報告や機能リクエストは、issue tracker(サブシステムJava. Decompiler. Engine)へお送りください。

IntelliJでの使用法

FernflowerはIntelliJ IDEAにバンドルされており、主にデバッグ中やクラスファイルを参照する際にJavaコードを表示するために使用されます。

コマンドラインでの使用法

Fernflowerは、以下のコマンドを使用してスタンドアロンモードでコマンドラインから実行できます:

root@kitploit:~
java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>

* は0回以上の繰り返しを意味します

+ は1回以上の繰り返しを意味します

<source>: 逆コンパイルするファイルまたはディレクトリ。ディレクトリは再帰的にスキャンされます。許可されるファイル拡張子は class、zip、jar です。-e= が前置されたソースは「ライブラリ」ファイルを意味し、逆コンパイルはされませんが、クラスやメソッド間の関係を解析する際に考慮されます。特に識別子のリネーム(renオプション参照)は外部クラスの情報から恩恵を受けることができます。

<destination>: 結果のJavaソースを配置する先のディレクトリ

<option>=<value>: 対応する値を持つコマンドラインオプション(以下の「コマンドラインオプション」を参照)。

例

root@kitploit:~
java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\
root@kitploit:~
java -jar fernflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\binary\Boot.class c:\Temp\source\

コマンドラインオプション

mpmとurcを除き、値1はオプションが有効、0は無効を意味します。デフォルト値(ある場合)は括弧内に示されています。

通常、ユーザーが変更する可能性があるオプションは次のとおりです: hes, hdc, dgs, mpm, ren, urc 残りのオプションはそのままにしておくことができます。これらはプロのリバースエンジニア向けです。

  • rbr (1): ブリッジメソッドを非表示にする
  • rsy (0): シンセティッククラスメンバーを非表示にする
  • din (1): 内部クラスを逆コンパイルする
  • dc4 (1): 1.4クラス参照を圧縮する
  • das (1): アサーションを逆コンパイルする
  • hes (1): 空のスーパー呼び出しを非表示にする
  • hdc (1): 空のデフォルトコンストラクタを非表示にする
  • dgs (0): ジェネリックシグネチャを逆コンパイルする
  • ner (1): リターンが例外をスローしないと仮定する
  • den (1): 列挙型を逆コンパイルする
  • rgn (1): 修飾付きnew文の一部である getClass() 呼び出しを削除する
  • lit (0): 数値リテラルを「そのまま」出力する
  • asc (0): 文字列および文字リテラル内の非ASCII文字をUnicodeエスケープとしてエンコードする

識別子のリネーム

一部の難読化ツールは、クラスとそのメンバー要素に短く意味のない、とりわけ曖昧な名前を付けます。このようなコードを再コンパイルすると、多数の競合が発生します。したがって、逆コンパイラが要素をリネームして各識別子の一意性を確保することをお勧めします。

renオプション(-ren=1)はリネーム機能を有効にします。デフォルトのリネーム戦略は次のとおりです:

  • 要素の名前が予約語であるか、3文字未満の場合にリネームする
  • 新しい名前は単純なパターンに従って構築されます: (class|method|field)_<連続した一意の番号>

これらのルールは、リネーム中に逆コンパイラによって呼び出される4つの主要メソッドの独自の実装を提供することで上書きできます。urcオプション(例: -urc=com.example.MyRenamer)で org.jetbrains.java.decompiler.main.extern.IMemberIdentifierRenamer を実装するクラスをFernflowerに渡すだけです。このクラスはアプリケーションのクラスパス上で利用可能でなければなりません。

各メソッドの意味は名前から明らかです: toBeRenamedは要素がリネームされるかどうかを決定し、他の3つはそれぞれクラス、メソッド、フィールドの新しい名前を提供します。

開発

実行可能な起動スクリプトをビルドする:

root@kitploit:~
./gradlew :installDist

起動スクリプトは build/install/engine/bin に生成されます。

貢献

FernflowerはIntelliJ Communityプロジェクトの一部です。貢献を歓迎します。パッチの送信方法としては、IntelliJ Communityリポジトリでプルリクエストを作成することを推奨します。パッチを提出する際は、コントリビューションガイドラインに従ってください。

ライセンス

FernflowerはApache License Version 2.0の下でライセンスされています。

クレジット

Fernflowerは当初Stiverによって開発されましたが、2014年以降はJetBrainsによってメンテナンスされています。ForgeFlowerからのいくつかのパッチがこのリポジトリにマージされました。FernflowerのミラーはAndrew McRaeによって長期間メンテナンスされていました。

名称

正しい名称はFernflowerであり、FernFlowerではありません。

ツールをダウンロード
  • bto (1): int 1をboolean trueとして解釈する(コンパイラのバグに対する回避策)
  • nns (0): 設定されていないシンセティック属性を許可する(コンパイラのバグに対する回避策)
  • uto (1): 名前のない型を java.lang.Object とみなす(コンパイラアーキテクチャの欠陥に対する回避策)
  • udv (1): デバッグ情報から変数名を再構築する(存在する場合)
  • ump (1): 対応する属性からパラメータ名を再構築する(存在する場合)
  • rer (1): 空の例外範囲を削除する
  • fdi (1): finally構造をインライン解除する
  • mpm (0): 逆コンパイルされたメソッドあたりの最大処理時間(秒)。0は上限なしを意味する
  • ren (0): 曖昧な(難読化された)クラスおよびクラス要素をリネームする
  • urc (-): IIdentifierRenamer インターフェースを実装するユーザー提供クラスの完全名。どのクラス識別子をリネームすべきかを判断し、新しい識別子名を提供するために使用されます(「識別子のリネーム」を参照)
  • inn (1): IntelliJ IDEA固有の@NotNullアノテーションをチェックし、見つかった場合は挿入されたコードを削除する
  • lac (0): ラムダ式を匿名クラスに逆コンパイルする
  • nls (0): 出力に使用する改行文字を定義する。0 - '\r\n' (Windows)、1 - '\n' (Unix)、デフォルトはOS依存
  • ind: インデント文字列(デフォルトは3スペース)
  • crp (0): 可能な場合にレコードパターンを使用する
  • cps (0): 可能な場合にパターンを使用したswitchを使用する
  • log (INFO): ログレベル。指定可能な値は TRACE, INFO, WARN, ERROR
  • iec (0): 逆コンパイル時にコンテキストにクラスパス全体を含める
  • isl (1): 単純なラムダ式をインライン化する
  • ucrc (1): 不要なレコードコンストラクタとゲッターを非表示にする
  • cci (1): try-with-resources内のリソースが実際に AutoCloseable インターフェースを実装しているかチェックする
  • jvn (0): すべてのローカル変数名をJADスタイルの名前で上書きする
  • jpr (0): JAD命名にパラメータ名を含める
  • pbo (0): ビット演算子/シフト演算子が算術演算子と混在している場合に明確化する括弧を追加する