Thursday, November 02, 2006
자바 클래스 파일 디스어셈블러/역어셈블;Java Class File Disassembler
프로그래밍 언어인 '자바'에 대한 게시물입니다.
JDK(자바 개발도구)를 설치하면, javap 라는 명령어가 있는데 이것으로, 컴파일된 자바 클래스 파일을 디스어셈블링할 수 있습니다.
가령 Foo.class 라는 파일을 디스어셈블하려면
이렇게 하면 됩니다.
그러나
javap -c Foo.class
이렇게 .class 라는 확장자를 붙이면, ERROR:Could not find Foo.class 이런 에러가 나게 됩니다.
다음의 소스를 컴파일하여 Foo.class 라는 파일을 만듭니다.
파일명: Foo.java
Foo.class 는 이진파일이기에 헥사 뷰어로 보면 이렇게 보입니다:
위의 클래스 파일을 역어셈블한 결과는 다음과 같습니다.
3.14 라는 숫자가 "double 3.14d" 이렇게 다시 발견되고 있습니다.
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);
}
}
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 ...
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>
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
<< Home