mwultong Blog ... 프로그래밍 / 계산기

컴퓨터 엑셀 워드 포토샵 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Thursday, November 02, 2006

자바 클래스 파일 디스어셈블러/역어셈블;Java Class File Disassembler


프로그래밍 언어인 '자바'에 대한 게시물입니다.

JDK(자바 개발도구)를 설치하면, javap 라는 명령어가 있는데 이것으로, 컴파일된 자바 클래스 파일을 디스어셈블링할 수 있습니다.

가령 Foo.class 라는 파일을 디스어셈블하려면
javap -c Foo

이렇게 하면 됩니다.


그러나
javap -c Foo.class
이렇게 .class 라는 확장자를 붙이면, ERROR:Could not find Foo.class 이런 에러가 나게 됩니다.



디스어셈블 예제


다음의 소스를 컴파일하여 Foo.class 라는 파일을 만듭니다.
파일명: Foo.java
public class Foo {
  public static void main(String args[]) {

    System.out.println(3.14);

  }
}



Foo.class 는 이진파일이기에 헥사 뷰어로 보면 이렇게 보입니다:

00000000:  CA FE BA BE 00 00 00 31  00 1D 0A 00 07 00 10 09  .......1........
00000010:  00 11 00 12 06 40 09 1E  B8 51 EB 85 1F 0A 00 13  .....@...Q......
00000020:  00 14 07 00 15 07 00 16  01 00 06 3C 69 6E 69 74  ...........<init
00000030:  3E 01 00 03 28 29 56 01  00 04 43 6F 64 65 01 00  >...()V...Code..
00000040:  0F 4C 69 6E 65 4E 75 6D  62 65 72 54 61 62 6C 65  .LineNumberTable
00000050:  01 00 04 6D 61 69 6E 01  00 16 28 5B 4C 6A 61 76  ...main...([Ljav
00000060:  61 2F 6C 61 6E 67 2F 53  74 72 69 6E 67 3B 29 56  a/lang/String;)V
00000070:  01 00 0A 53 6F 75 72 63  65 46 69 6C 65 01 00 08  ...SourceFile...
00000080:  46 6F 6F 2E 6A 61 76 61  0C 00 08 00 09 07 00 17  Foo.java........
00000090:  0C 00 18 00 19 07 00 1A  0C 00 1B 00 1C 01 00 03  ................
000000A0:  46 6F 6F 01 00 10 6A 61  76 61 2F 6C 61 6E 67 2F  Foo...java/lang/
000000B0:  4F 62 6A 65 63 74 01 00  10 6A 61 76 61 2F 6C 61  Object...java/la
000000C0:  6E 67 2F 53 79 73 74 65  6D 01 00 03 6F 75 74 01  ng/System...out.
000000D0:  00 15 4C 6A 61 76 61 2F  69 6F 2F 50 72 69 6E 74  ..Ljava/io/Print
000000E0:  53 74 72 65 61 6D 3B 01  00 13 6A 61 76 61 2F 69  Stream;...java/i
000000F0:  6F 2F 50 72 69 6E 74 53  74 72 65 61 6D 01 00 07  o/PrintStream...
00000100:  70 72 69 6E 74 6C 6E 01  00 04 28 44 29 56 00 21  println...(D)V.!
00000110:  00 06 00 07 00 00 00 00  00 02 00 01 00 08 00 09  ................
00000120:  00 01 00 0A 00 00 00 1D  00 01 00 01 00 00 00 05  ................
00000130:  2A B7 00 01 B1 00 00 00  01 00 0B 00 00 00 06 00  *...............
00000140:  01 00 00 00 01 00 09 00  0C 00 0D 00 01 00 0A 00  ................
00000150:  00 00 26 00 03 00 01 00  00 00 0A B2 00 02 14 00  ..&.............
00000160:  03 B6 00 05 B1 00 00 00  01 00 0B 00 00 00 0A 00  ................
00000170:  02 00 00 00 04 00 09 00  06 00 01 00 0E 00 00 00  ................
00000180:  02 00 0F                                          ...



위의 클래스 파일을 역어셈블한 결과는 다음과 같습니다.

D:\Z>javap -c Foo
Compiled from "Foo.java"
public class Foo extends java.lang.Object{
public Foo();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc2_w  #3; //double 3.14d
   6:   invokevirtual   #5; //Method java/io/PrintStream.println:(D)V
   9:   return

}


D:\Z>


3.14 라는 숫자가 "double 3.14d" 이렇게 다시 발견되고 있습니다.




tag: java
자바 | Java

0 Comments:

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Previous Posts
Monthly Archives
Top