javapでデコンパイルする
| 言語 | バージョン |
|---|---|
| java | openjdk version “11.0.3” 2019-04-16 LTS |
昔はjadやjd-eclipseなどでデコンパイルができましたが、今はjavapコマンドである程度デコンパイルすることが出来ます。
Eclipseのプラグインだと今は「Enhanced Class Decompiler」が有名です。
javapとタイプして実行すればオプションが表示されます。
-pオプション すべてのメソッド・メンバ
AccountControllerクラスがあるとして、javap -p AccountController.classで以下のようにメソッドとその引数の型が表示されます。
C:\>javap -p AccountController.class
Compiled from "AccountController.java"
public class com.example.demo.controller.AccountController {
private final com.example.demo.repository.AccountRepository accountRepository;
public org.springframework.http.ResponseEntity<?> getAllList();
public org.springframework.http.ResponseEntity<?> getAgeList(java.lang.Integer);
public org.springframework.http.ResponseEntity<?> newAccount(java.lang.Integer, java.lang.String, java.lang.Integer);
public org.springframework.http.ResponseEntity<?> update(java.lang.Integer, java.lang.String, java.lang.Integer);
public org.springframework.http.ResponseEntity<?> updateName(java.lang.Integer, java.lang.String);
public org.springframework.http.ResponseEntity<?> deleteAccount(java.lang.Integer);
public com.example.demo.controller.AccountController(com.example.demo.repository.AccountRepository);
}
-publicオプション publicクラスおよびメンバ
publicなクラスやメンバのみを表示したい場合は、javap -public AccountController.classで以下のようにメソッドとその引数の型が表示されます。privateフィールドが非表示になっています。
C:\>javap -public AccountController.class
Compiled from "AccountController.java"
public class com.example.demo.controller.AccountController {
public org.springframework.http.ResponseEntity<?> getAllList();
public org.springframework.http.ResponseEntity<?> getAgeList(java.lang.Integer);
public org.springframework.http.ResponseEntity<?> newAccount(java.lang.Integer, java.lang.String, java.lang.Integer);
public org.springframework.http.ResponseEntity<?> update(java.lang.Integer, java.lang.String, java.lang.Integer);
public org.springframework.http.ResponseEntity<?> updateName(java.lang.Integer, java.lang.String);
public org.springframework.http.ResponseEntity<?> deleteAccount(java.lang.Integer);
public com.example.demo.controller.AccountController(com.example.demo.repository.AccountRepository);
}
-lオプション 行番号とローカル変数表を表示
-lオプションを使用するとデコンパイルしてくれます。
C:\>javap -l AccountController.class
Compiled from "AccountController.java"
public class com.example.demo.controller.AccountController {
public org.springframework.http.ResponseEntity<?> getAllList();
LineNumberTable:
line 31: 0
line 32: 10
line 33: 18
line 34: 26
LocalVariableTable:
Start Length Slot Name Signature
0 38 0 this Lcom/example/demo/controller/AccountController;
10 28 1 allList Ljava/util/List;
18 20 2 map Ljava/util/HashMap;
public org.springframework.http.ResponseEntity<?> getAgeList(java.lang.Integer);
LineNumberTable:
line 43: 0
line 44: 11
line 45: 19
line 46: 27
LocalVariableTable:
Start Length Slot Name Signature
0 39 0 this Lcom/example/demo/controller/AccountController;
0 39 1 age Ljava/lang/Integer;
11 28 2 ageList Ljava/util/List;
19 20 3 map Ljava/util/HashMap;
public org.springframework.http.ResponseEntity<?> newAccount(java.lang.Integer, java.lang.String, java.lang.Integer);
LineNumberTable:
line 58: 0
line 59: 9
line 60: 15
line 61: 21
line 62: 27
line 64: 39
line 65: 50
line 66: 59
line 67: 69
LocalVariableTable:
Start Length Slot Name Signature
0 82 0 this Lcom/example/demo/controller/AccountController;
0 82 1 accountId Ljava/lang/Integer;
0 82 2 name Ljava/lang/String;
0 82 3 age Ljava/lang/Integer;
9 73 4 accountEntity Lcom/example/demo/entity/AccountEntity;
50 32 5 postList Ljava/util/List;
59 23 6 map Ljava/util/HashMap;
public org.springframework.http.ResponseEntity<?> update(java.lang.Integer, java.lang.String, java.lang.Integer);
LineNumberTable:
line 79: 0
line 80: 14
line 81: 23
line 82: 33
LocalVariableTable:
Start Length Slot Name Signature
0 46 0 this Lcom/example/demo/controller/AccountController;
0 46 1 accountId Ljava/lang/Integer;
0 46 2 name Ljava/lang/String;
0 46 3 age Ljava/lang/Integer;
14 32 4 updateCnt Ljava/lang/Integer;
23 23 5 map Ljava/util/HashMap;
public org.springframework.http.ResponseEntity<?> updateName(java.lang.Integer, java.lang.String);
LineNumberTable:
line 92: 0
line 93: 12
line 94: 21
line 95: 30
LocalVariableTable:
Start Length Slot Name Signature
0 43 0 this Lcom/example/demo/controller/AccountController;
0 43 1 accountId Ljava/lang/Integer;
0 43 2 name Ljava/lang/String;
12 31 3 updateCnt Ljava/lang/Integer;
21 22 4 map Ljava/util/HashMap;
public org.springframework.http.ResponseEntity<?> deleteAccount(java.lang.Integer);
LineNumberTable:
line 104: 0
line 105: 11
line 106: 19
line 107: 27
LocalVariableTable:
Start Length Slot Name Signature
0 39 0 this Lcom/example/demo/controller/AccountController;
0 39 1 accountId Ljava/lang/Integer;
11 28 2 deleteCnt Ljava/lang/Integer;
19 20 3 map Ljava/util/HashMap;
public com.example.demo.controller.AccountController(com.example.demo.repository.AccountRepository);
LineNumberTable:
line 18: 0
LocalVariableTable:
Start Length Slot Name Signature
0 10 0 this Lcom/example/demo/controller/AccountController;
0 10 1 accountRepository Lcom/example/demo/repository/AccountRepository;
}
-cオプション 逆アセンブル
-cオプションで逆アセンブルしてくれます。

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^


コメント