【8/27まで】Udemyの人気コースが今なら1,200円から!!

【SpringBoot】VSCodeでGhidra(ギドラ)を使ってJavaクラスファイルを逆コンパイルしてソースを復元する

SpringBootを使っていると、lombokなどでアノテーションを付与してJavaのソースコードを自動生成する、という使い方をよくします。

lombokが自動生成するコードはソースファイル(.javaファイル)には表示されません。そのため、どんなコードが実際に自動生成されているのかを確認したければ、クラスファイル(.class)を逆コンパイルする必要があります。

普通にクラスファイル(.class)を逆コンパイルしても、元のJavaソースにはなりません。そこでGhidra(ギドラ)を使って元のソースファイルに近い形で逆コンパイルする方法をこの記事にまとめました。

Ghidra(ギドラ)のインストール

Ghidra(ギドラ)とは、NSA(アメリカ国家安全保障局)が開発したリバースエンジニアリングツールです。

このツールを使うといろいろなことができるのですが、今回は、このツールを使って「Javaのクラスファイルからソースファイルを復元する」ということをやってみようと思います。

以下のリンクよりインストーラをダウンロードします。

zipファイルを展開し、任意の場所に格納します。(以下はC:\workspace\に格納した例です。)インストール作業はこれにて完了です。

VSCodeで拡張機能のインストール

VSCodeでGhidraを使うために以下の拡張機能をインストールします。

「Decompiler」にGhidraのパスを通す

VSCodeに「Decompiler」をインストールしたら以下のように設定を行います。

実行

以下のPerson.javaを逆コンパイルしたいと思います。このソースコードには@Dataアノテーションが含まれているので、getter、setter、toStringなどが自動生成されているはずです。それを確かめてみます。

Person.java

package com.example.demo3.model;

import lombok.Data;
@Data
public class Person {
    private String name;
    private int age;
    private String business;

}

上記をコンパイル済みのPerson.classクラスファイルを選び、右クリックから「Decompile」を選択します。

処理が実行されると、「Decompiler!」というワークスペース直下にクラスファイルと同名のJavaソースファイルが生成されます。

逆コンパイルしたJavaソースの中身を確認する

以下が逆コンパイルして生成したPerson.javaです。getter、setter、toStringなど、@Dataアノテーションが自動生成したコードを確認することができました。

Person.java

import com.example.demo3.model.Person;

public class Person {
  private String name;
  
  private int age;
  
  private String business;
  
  public String getName() { return this.name; }
  
  public int getAge() { return this.age; }
  
  public String getBusiness() { return this.business; }
  
  public void setName(String name) { this.name = name; }
  
  public void setAge(int age) { this.age = age; }
  
  public void setBusiness(String business) { this.business = business; }
  
  public boolean equals(Object o) { if (o == this)
      return true; 
    if (!(o instanceof Person))
      return false; 
    Person other = (Person)o;
    if (!other.canEqual(this))
      return false; 
    Object this$name = getName(), other$name = other.getName();
    if ((this$name == null) ? (other$name != null) : !this$name.equals(other$name))
      return false; 
    if (getAge() != other.getAge())
      return false; 
    Object this$business = getBusiness(), other$business = other.getBusiness();
    return !((this$business == null) ? (other$business != null) : !this$business.equals(other$business)); }
  
  protected boolean canEqual(Object other) { return other instanceof Person; }
  
  public int hashCode() {
    int PRIME = 59;
    result = 1;
    Object $name = getName();
    result = result * 59 + (($name == null) ? 43 : $name.hashCode());
    result = result * 59 + getAge();
    Object $business = getBusiness();
    return result * 59 + (($business == null) ? 43 : $business.hashCode());
  }
  
  public String toString() { return "Person(name=" + getName() + ", age=" + getAge() + ", business=" + getBusiness() + ")"; }
}

他のWEBサービス

この記事の作成中に、同じことができるWEBサービスを見つけたので共有します。

デコンパイラをProcyon、CFR、JDCore、Jadx、Fernflower、JADから選択できます。

コメントを残す

メールアドレスが公開されることはありません。