際際滷

際際滷Share a Scribd company logo
恷弌 Hello World!?
チャレンジ
#i紅Java 2015-03-07
pLucky, Inc. @kawachi 采坪 括
お}
Hello World! を咫忖する?
.class ファイルを?
どこまで弌さくできるか
まずは Java で
class J {
public static void main(String args[]) {
System.out.println("Hello World!");
}
}
-rw-r--r-- 1 kawachi staff 408 Mar 3 23:07 J.class
javac して´
408 bytes
javap -c でみてみる
$ javap -c J.class
Compiled from "A.java"
class J {
J();
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: ldc #3 // String Hello
World!
5: invokevirtual #4 // Method java/io/
PrintStream.println:(Ljava/lang/String;)V
8: return
}
コンストラクタ
main()
Hello World!にコンストラクタは勣らない
Jasmin でトライ
JVM byte code 喘アセンブラ
.class public M
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
.limit stack 2
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "Hello World!"
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
return
.end method
jasmin M.j して´
-rw-r--r-- 1 kawachi staff 303 Mar 3 23:13 M.class
303 bytes (74.2%)408 bytes ★
main() だけ
バイナリみてみる
$ hexdump -C M.class
00000000 ca fe ba be 00 03 00 2d 00 18 0c 00 14 00 17 01 |.......-........|
00000010 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |..([Ljava/lang/S|
00000020 74 72 69 6e 67 3b 29 56 01 00 10 6a 61 76 61 2f |tring;)V...java/|
00000030 6c 61 6e 67 2f 4f 62 6a 65 63 74 07 00 03 01 00 |lang/Object.....|
00000040 0c 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 07 00 0f |.Hello World!...|
00000050 08 00 05 07 00 12 01 00 04 43 6f 64 65 01 00 04 |.........Code...|
00000060 6d 61 69 6e 09 00 08 00 01 01 00 01 4d 01 00 0a |main........M...|
00000070 53 6f 75 72 63 65 46 69 6c 65 0c 00 10 00 15 01 |SourceFile......|
00000080 00 13 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |..java/io/PrintS|
00000090 74 72 65 61 6d 01 00 07 70 72 69 6e 74 6c 6e 07 |tream...println.|
000000a0 00 0c 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 |.....java/lang/S|
000000b0 79 73 74 65 6d 0a 00 06 00 0e 01 00 03 6f 75 74 |ystem........out|
000000c0 01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |...(Ljava/lang/S|
000000d0 74 72 69 6e 67 3b 29 56 01 00 03 4d 2e 6a 01 00 |tring;)V...M.j..|
000000e0 15 4c 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |.Ljava/io/PrintS|
000000f0 74 72 65 61 6d 3b 00 21 00 11 00 04 00 00 00 00 |tream;.!........|
00000100 00 01 00 09 00 0a 00 02 00 01 00 09 00 00 00 15 |................|
00000110 00 02 00 01 00 00 00 09 b2 00 0b 12 07 b6 00 13 |................|
00000120 b1 00 00 00 00 00 01 00 0d 00 00 00 02 00 16 |...............|
0000012f
う`ん。わからん
.class ファイルのiみ圭
Java Virtual Machine Speci?cation,
4. The class File Format
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
枠^に4bytes マジック
肝の2bytesが?
マイナ`バ`ジョン
參和揖に
iめる、iめるぞ
$ hexdump -C M.class
00000000 ca fe ba be 00 03 00 2d 00 18 0c 00 14 00 17 01 |.......-........|
00000010 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |..([Ljava/lang/S|
00000020 74 72 69 6e 67 3b 29 56 01 00 10 6a 61 76 61 2f |tring;)V...java/|
00000030 6c 61 6e 67 2f 4f 62 6a 65 63 74 07 00 03 01 00 |lang/Object.....|
00000040 0c 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 07 00 0f |.Hello World!...|
00000050 08 00 05 07 00 12 01 00 04 43 6f 64 65 01 00 04 |.........Code...|
00000060 6d 61 69 6e 09 00 08 00 01 01 00 01 4d 01 00 0a |main........M...|
00000070 53 6f 75 72 63 65 46 69 6c 65 0c 00 10 00 15 01 |SourceFile......|
00000080 00 13 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |..java/io/PrintS|
00000090 74 72 65 61 6d 01 00 07 70 72 69 6e 74 6c 6e 07 |tream...println.|
000000a0 00 0c 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 |.....java/lang/S|
000000b0 79 73 74 65 6d 0a 00 06 00 0e 01 00 03 6f 75 74 |ystem........out|
000000c0 01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |...(Ljava/lang/S|
000000d0 74 72 69 6e 67 3b 29 56 01 00 03 4d 2e 6a 01 00 |tring;)V...M.j..|
000000e0 15 4c 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |.Ljava/io/PrintS|
000000f0 74 72 65 61 6d 3b 00 21 00 11 00 04 00 00 00 00 |tream;.!........|
00000100 00 01 00 09 00 0a 00 02 00 01 00 09 00 00 00 15 |................|
00000110 00 02 00 01 00 00 00 09 b2 00 0b 12 07 b6 00 13 |................|
00000120 b1 00 00 00 00 00 01 00 0d 00 00 00 02 00 16 |...............|
0000012f
.class は constant pool が9護
$ hexdump -C M.class
00000000 ca fe ba be 00 03 00 2d 00 18 0c 00 14 00 17 01 |.......-........|
00000010 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |..([Ljava/lang/S|
00000020 74 72 69 6e 67 3b 29 56 01 00 10 6a 61 76 61 2f |tring;)V...java/|
00000030 6c 61 6e 67 2f 4f 62 6a 65 63 74 07 00 03 01 00 |lang/Object.....|
00000040 0c 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 07 00 0f |.Hello World!...|
00000050 08 00 05 07 00 12 01 00 04 43 6f 64 65 01 00 04 |.........Code...|
00000060 6d 61 69 6e 09 00 08 00 01 01 00 01 4d 01 00 0a |main........M...|
00000070 53 6f 75 72 63 65 46 69 6c 65 0c 00 10 00 15 01 |SourceFile......|
00000080 00 13 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |..java/io/PrintS|
00000090 74 72 65 61 6d 01 00 07 70 72 69 6e 74 6c 6e 07 |tream...println.|
000000a0 00 0c 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 |.....java/lang/S|
000000b0 79 73 74 65 6d 0a 00 06 00 0e 01 00 03 6f 75 74 |ystem........out|
000000c0 01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |...(Ljava/lang/S|
000000d0 74 72 69 6e 67 3b 29 56 01 00 03 4d 2e 6a 01 00 |tring;)V...M.j..|
000000e0 15 4c 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |.Ljava/io/PrintS|
000000f0 74 72 65 61 6d 3b 00 21 00 11 00 04 00 00 00 00 |tream;.!........|
00000100 00 01 00 09 00 0a 00 02 00 01 00 09 00 00 00 15 |................|
00000110 00 02 00 01 00 00 00 09 b2 00 0b 12 07 b6 00 13 |................|
00000120 b1 00 00 00 00 00 01 00 0d 00 00 00 02 00 16 |...............|
0000012f
Constant pool
main()
constant pool
? 玉いプログラムでは constant pool が屶塘議サイズ
? 猟忖双協方とか、クラス歌孚とかが秘ってる
? constant pool を泌採にるかが掫
pポイント1: SourceFile 奉來
$ hexdump -C M.class
00000000 ca fe ba be 00 03 00 2d 00 18 0c 00 14 00 17 01 |.......-........|
00000010 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |..([Ljava/lang/S|
00000020 74 72 69 6e 67 3b 29 56 01 00 10 6a 61 76 61 2f |tring;)V...java/|
00000030 6c 61 6e 67 2f 4f 62 6a 65 63 74 07 00 03 01 00 |lang/Object.....|
00000040 0c 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 07 00 0f |.Hello World!...|
00000050 08 00 05 07 00 12 01 00 04 43 6f 64 65 01 00 04 |.........Code...|
00000060 6d 61 69 6e 09 00 08 00 01 01 00 01 4d 01 00 0a |main........M...|
00000070 53 6f 75 72 63 65 46 69 6c 65 0c 00 10 00 15 01 |SourceFile......|
00000080 00 13 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |..java/io/PrintS|
00000090 74 72 65 61 6d 01 00 07 70 72 69 6e 74 6c 6e 07 |tream...println.|
000000a0 00 0c 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 |.....java/lang/S|
000000b0 79 73 74 65 6d 0a 00 06 00 0e 01 00 03 6f 75 74 |ystem........out|
000000c0 01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |...(Ljava/lang/S|
000000d0 74 72 69 6e 67 3b 29 56 01 00 03 4d 2e 6a 01 00 |tring;)V...M.j..|
000000e0 15 4c 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |.Ljava/io/PrintS|
000000f0 74 72 65 61 6d 3b 00 21 00 11 00 04 00 00 00 00 |tream;.!........|
00000100 00 01 00 09 00 0a 00 02 00 01 00 09 00 00 00 15 |................|
00000110 00 02 00 01 00 00 00 09 b2 00 0b 12 07 b6 00 13 |................|
00000120 b1 00 00 00 00 00 01 00 0d 00 00 00 02 00 16 |...............|
0000012f
SourceFile 奉來。oくても咾
^SourceFile ̄
^M.j ̄
pポイント2:徭クラス兆
$ hexdump -C M.class
00000000 ca fe ba be 00 03 00 2d 00 18 0c 00 14 00 17 01 |.......-........|
00000010 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |..([Ljava/lang/S|
00000020 74 72 69 6e 67 3b 29 56 01 00 10 6a 61 76 61 2f |tring;)V...java/|
00000030 6c 61 6e 67 2f 4f 62 6a 65 63 74 07 00 03 01 00 |lang/Object.....|
00000040 0c 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 07 00 0f |.Hello World!...|
00000050 08 00 05 07 00 12 01 00 04 43 6f 64 65 01 00 04 |.........Code...|
00000060 6d 61 69 6e 09 00 08 00 01 01 00 01 4d 01 00 0a |main........M...|
00000070 53 6f 75 72 63 65 46 69 6c 65 0c 00 10 00 15 01 |SourceFile......|
00000080 00 13 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |..java/io/PrintS|
00000090 74 72 65 61 6d 01 00 07 70 72 69 6e 74 6c 6e 07 |tream...println.|
000000a0 00 0c 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 |.....java/lang/S|
000000b0 79 73 74 65 6d 0a 00 06 00 0e 01 00 03 6f 75 74 |ystem........out|
000000c0 01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |...(Ljava/lang/S|
000000d0 74 72 69 6e 67 3b 29 56 01 00 03 4d 2e 6a 01 00 |tring;)V...M.j..|
000000e0 15 4c 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |.Ljava/io/PrintS|
000000f0 74 72 65 61 6d 3b 00 21 00 11 00 04 00 00 00 00 |tream;.!........|
00000100 00 01 00 09 00 0a 00 02 00 01 00 09 00 00 00 15 |................|
00000110 00 02 00 01 00 00 00 09 b2 00 0b 12 07 b6 00 13 |................|
00000120 b1 00 00 00 00 00 01 00 0d 00 00 00 02 00 16 |...............|
0000012f
^M ̄クラス歌孚
this_class
^Code ̄?
(メソッドの嶄附を燕Fするために駅ず贋壓)
クラス兆を Code にすれば ^M ̄ をせる
java.lang.Object
java.util.Date12
pポイント3:Hクラス
$ hexdump -C M.class
00000000 ca fe ba be 00 03 00 2d 00 18 0c 00 14 00 17 01 |.......-........|
00000010 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |..([Ljava/lang/S|
00000020 74 72 69 6e 67 3b 29 56 01 00 10 6a 61 76 61 2f |tring;)V...java/|
00000030 6c 61 6e 67 2f 4f 62 6a 65 63 74 07 00 03 01 00 |lang/Object.....|
00000040 0c 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 07 00 0f |.Hello World!...|
00000050 08 00 05 07 00 12 01 00 04 43 6f 64 65 01 00 04 |.........Code...|
00000060 6d 61 69 6e 09 00 08 00 01 01 00 01 4d 01 00 0a |main........M...|
00000070 53 6f 75 72 63 65 46 69 6c 65 0c 00 10 00 15 01 |SourceFile......|
00000080 00 13 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |..java/io/PrintS|
00000090 74 72 65 61 6d 01 00 07 70 72 69 6e 74 6c 6e 07 |tream...println.|
000000a0 00 0c 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 |.....java/lang/S|
000000b0 79 73 74 65 6d 0a 00 06 00 0e 01 00 03 6f 75 74 |ystem........out|
000000c0 01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |...(Ljava/lang/S|
000000d0 74 72 69 6e 67 3b 29 56 01 00 03 4d 2e 6a 01 00 |tring;)V...M.j..|
000000e0 15 4c 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |.Ljava/io/PrintS|
000000f0 74 72 65 61 6d 3b 00 21 00 11 00 04 00 00 00 00 |tream;.!........|
00000100 00 01 00 09 00 0a 00 02 00 01 00 09 00 00 00 15 |................|
00000110 00 02 00 01 00 00 00 09 b2 00 0b 12 07 b6 00 13 |................|
00000120 b1 00 00 00 00 00 01 00 0d 00 00 00 02 00 16 |...............|
0000012f
^java/lang/Object ̄
クラス歌孚
super_class
Hクラスを PrintStream にすれば
^java/lang/Object ̄ とそのクラス歌孚がれる?
(java/lang/System は ?nal なのでダメ
^java/io/PrintStream ̄
(System.out の歌孚で旋喘)
バイナリエディタできQえ
$ hexdump -C Code.class
00000000 ca fe ba be 00 03 00 2d 00 13 0c 00 10 00 12 01 |.......-........|
00000010 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |..([Ljava/lang/S|
00000020 74 72 69 6e 67 3b 29 56 01 00 0c 48 65 6c 6c 6f |tring;)V...Hello|
00000030 20 57 6f 72 6c 64 21 07 00 0b 08 00 03 07 00 0e | World!.........|
00000040 01 00 04 43 6f 64 65 01 00 04 6d 61 69 6e 09 00 |...Code...main..|
00000050 06 00 01 0c 00 0c 00 11 01 00 13 6a 61 76 61 2f |...........java/|
00000060 69 6f 2f 50 72 69 6e 74 53 74 72 65 61 6d 01 00 |io/PrintStream..|
00000070 07 70 72 69 6e 74 6c 6e 07 00 07 01 00 10 6a 61 |.println......ja|
00000080 76 61 2f 6c 61 6e 67 2f 53 79 73 74 65 6d 0a 00 |va/lang/System..|
00000090 04 00 0a 01 00 03 6f 75 74 01 00 15 28 4c 6a 61 |......out...(Lja|
000000a0 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 |va/lang/String;)|
000000b0 56 01 00 15 4c 6a 61 76 61 2f 69 6f 2f 50 72 69 |V...Ljava/io/Pri|
000000c0 6e 74 53 74 72 65 61 6d 3b 00 21 00 0d 00 04 00 |ntStream;.!.....|
000000d0 00 00 00 00 01 00 09 00 08 00 02 00 01 00 07 00 |................|
000000e0 00 00 15 00 02 00 01 00 00 00 09 b2 00 09 12 05 |................|
000000f0 b6 00 0f b1 00 00 00 00 00 00 |..........|
000000fa
250 bytes (61.2%)408 bytes ★
constant pool count 0x18★0x13
暴の基え
Hello World! を咫忖する?
.class ファイルを?
どこまで弌さくできるか
250 bytes
まとめ
? JVM碧とバイナリエディタがあればY[べる
? シをg`えると噸粁ないエラ`がられる
? .class iめると javap の竃薦にHしみがイ
? チャレンジのh http://bit.ly/1w9a4Kb
? もっと玉くできそうだったら @kawachi まで

More Related Content

恷弌 Hello World! チャレンジ

  • 1. 恷弌 Hello World!? チャレンジ #i紅Java 2015-03-07 pLucky, Inc. @kawachi 采坪 括
  • 2. お} Hello World! を咫忖する? .class ファイルを? どこまで弌さくできるか
  • 3. まずは Java で class J { public static void main(String args[]) { System.out.println("Hello World!"); } } -rw-r--r-- 1 kawachi staff 408 Mar 3 23:07 J.class javac して´ 408 bytes
  • 4. javap -c でみてみる $ javap -c J.class Compiled from "A.java" class J { J(); 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: ldc #3 // String Hello World! 5: invokevirtual #4 // Method java/io/ PrintStream.println:(Ljava/lang/String;)V 8: return } コンストラクタ main() Hello World!にコンストラクタは勣らない
  • 5. Jasmin でトライ JVM byte code 喘アセンブラ .class public M .super java/lang/Object .method public static main([Ljava/lang/String;)V .limit stack 2 getstatic java/lang/System/out Ljava/io/PrintStream; ldc "Hello World!" invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V return .end method jasmin M.j して´ -rw-r--r-- 1 kawachi staff 303 Mar 3 23:13 M.class 303 bytes (74.2%)408 bytes ★ main() だけ
  • 6. バイナリみてみる $ hexdump -C M.class 00000000 ca fe ba be 00 03 00 2d 00 18 0c 00 14 00 17 01 |.......-........| 00000010 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |..([Ljava/lang/S| 00000020 74 72 69 6e 67 3b 29 56 01 00 10 6a 61 76 61 2f |tring;)V...java/| 00000030 6c 61 6e 67 2f 4f 62 6a 65 63 74 07 00 03 01 00 |lang/Object.....| 00000040 0c 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 07 00 0f |.Hello World!...| 00000050 08 00 05 07 00 12 01 00 04 43 6f 64 65 01 00 04 |.........Code...| 00000060 6d 61 69 6e 09 00 08 00 01 01 00 01 4d 01 00 0a |main........M...| 00000070 53 6f 75 72 63 65 46 69 6c 65 0c 00 10 00 15 01 |SourceFile......| 00000080 00 13 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |..java/io/PrintS| 00000090 74 72 65 61 6d 01 00 07 70 72 69 6e 74 6c 6e 07 |tream...println.| 000000a0 00 0c 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 |.....java/lang/S| 000000b0 79 73 74 65 6d 0a 00 06 00 0e 01 00 03 6f 75 74 |ystem........out| 000000c0 01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |...(Ljava/lang/S| 000000d0 74 72 69 6e 67 3b 29 56 01 00 03 4d 2e 6a 01 00 |tring;)V...M.j..| 000000e0 15 4c 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |.Ljava/io/PrintS| 000000f0 74 72 65 61 6d 3b 00 21 00 11 00 04 00 00 00 00 |tream;.!........| 00000100 00 01 00 09 00 0a 00 02 00 01 00 09 00 00 00 15 |................| 00000110 00 02 00 01 00 00 00 09 b2 00 0b 12 07 b6 00 13 |................| 00000120 b1 00 00 00 00 00 01 00 0d 00 00 00 02 00 16 |...............| 0000012f う`ん。わからん
  • 7. .class ファイルのiみ圭 Java Virtual Machine Speci?cation, 4. The class File Format ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; field_info fields[fields_count]; u2 methods_count; method_info methods[methods_count]; u2 attributes_count; attribute_info attributes[attributes_count]; } 枠^に4bytes マジック 肝の2bytesが? マイナ`バ`ジョン 參和揖に
  • 8. iめる、iめるぞ $ hexdump -C M.class 00000000 ca fe ba be 00 03 00 2d 00 18 0c 00 14 00 17 01 |.......-........| 00000010 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |..([Ljava/lang/S| 00000020 74 72 69 6e 67 3b 29 56 01 00 10 6a 61 76 61 2f |tring;)V...java/| 00000030 6c 61 6e 67 2f 4f 62 6a 65 63 74 07 00 03 01 00 |lang/Object.....| 00000040 0c 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 07 00 0f |.Hello World!...| 00000050 08 00 05 07 00 12 01 00 04 43 6f 64 65 01 00 04 |.........Code...| 00000060 6d 61 69 6e 09 00 08 00 01 01 00 01 4d 01 00 0a |main........M...| 00000070 53 6f 75 72 63 65 46 69 6c 65 0c 00 10 00 15 01 |SourceFile......| 00000080 00 13 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |..java/io/PrintS| 00000090 74 72 65 61 6d 01 00 07 70 72 69 6e 74 6c 6e 07 |tream...println.| 000000a0 00 0c 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 |.....java/lang/S| 000000b0 79 73 74 65 6d 0a 00 06 00 0e 01 00 03 6f 75 74 |ystem........out| 000000c0 01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |...(Ljava/lang/S| 000000d0 74 72 69 6e 67 3b 29 56 01 00 03 4d 2e 6a 01 00 |tring;)V...M.j..| 000000e0 15 4c 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |.Ljava/io/PrintS| 000000f0 74 72 65 61 6d 3b 00 21 00 11 00 04 00 00 00 00 |tream;.!........| 00000100 00 01 00 09 00 0a 00 02 00 01 00 09 00 00 00 15 |................| 00000110 00 02 00 01 00 00 00 09 b2 00 0b 12 07 b6 00 13 |................| 00000120 b1 00 00 00 00 00 01 00 0d 00 00 00 02 00 16 |...............| 0000012f
  • 9. .class は constant pool が9護 $ hexdump -C M.class 00000000 ca fe ba be 00 03 00 2d 00 18 0c 00 14 00 17 01 |.......-........| 00000010 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |..([Ljava/lang/S| 00000020 74 72 69 6e 67 3b 29 56 01 00 10 6a 61 76 61 2f |tring;)V...java/| 00000030 6c 61 6e 67 2f 4f 62 6a 65 63 74 07 00 03 01 00 |lang/Object.....| 00000040 0c 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 07 00 0f |.Hello World!...| 00000050 08 00 05 07 00 12 01 00 04 43 6f 64 65 01 00 04 |.........Code...| 00000060 6d 61 69 6e 09 00 08 00 01 01 00 01 4d 01 00 0a |main........M...| 00000070 53 6f 75 72 63 65 46 69 6c 65 0c 00 10 00 15 01 |SourceFile......| 00000080 00 13 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |..java/io/PrintS| 00000090 74 72 65 61 6d 01 00 07 70 72 69 6e 74 6c 6e 07 |tream...println.| 000000a0 00 0c 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 |.....java/lang/S| 000000b0 79 73 74 65 6d 0a 00 06 00 0e 01 00 03 6f 75 74 |ystem........out| 000000c0 01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |...(Ljava/lang/S| 000000d0 74 72 69 6e 67 3b 29 56 01 00 03 4d 2e 6a 01 00 |tring;)V...M.j..| 000000e0 15 4c 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |.Ljava/io/PrintS| 000000f0 74 72 65 61 6d 3b 00 21 00 11 00 04 00 00 00 00 |tream;.!........| 00000100 00 01 00 09 00 0a 00 02 00 01 00 09 00 00 00 15 |................| 00000110 00 02 00 01 00 00 00 09 b2 00 0b 12 07 b6 00 13 |................| 00000120 b1 00 00 00 00 00 01 00 0d 00 00 00 02 00 16 |...............| 0000012f Constant pool main()
  • 10. constant pool ? 玉いプログラムでは constant pool が屶塘議サイズ ? 猟忖双協方とか、クラス歌孚とかが秘ってる ? constant pool を泌採にるかが掫
  • 11. pポイント1: SourceFile 奉來 $ hexdump -C M.class 00000000 ca fe ba be 00 03 00 2d 00 18 0c 00 14 00 17 01 |.......-........| 00000010 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |..([Ljava/lang/S| 00000020 74 72 69 6e 67 3b 29 56 01 00 10 6a 61 76 61 2f |tring;)V...java/| 00000030 6c 61 6e 67 2f 4f 62 6a 65 63 74 07 00 03 01 00 |lang/Object.....| 00000040 0c 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 07 00 0f |.Hello World!...| 00000050 08 00 05 07 00 12 01 00 04 43 6f 64 65 01 00 04 |.........Code...| 00000060 6d 61 69 6e 09 00 08 00 01 01 00 01 4d 01 00 0a |main........M...| 00000070 53 6f 75 72 63 65 46 69 6c 65 0c 00 10 00 15 01 |SourceFile......| 00000080 00 13 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |..java/io/PrintS| 00000090 74 72 65 61 6d 01 00 07 70 72 69 6e 74 6c 6e 07 |tream...println.| 000000a0 00 0c 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 |.....java/lang/S| 000000b0 79 73 74 65 6d 0a 00 06 00 0e 01 00 03 6f 75 74 |ystem........out| 000000c0 01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |...(Ljava/lang/S| 000000d0 74 72 69 6e 67 3b 29 56 01 00 03 4d 2e 6a 01 00 |tring;)V...M.j..| 000000e0 15 4c 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |.Ljava/io/PrintS| 000000f0 74 72 65 61 6d 3b 00 21 00 11 00 04 00 00 00 00 |tream;.!........| 00000100 00 01 00 09 00 0a 00 02 00 01 00 09 00 00 00 15 |................| 00000110 00 02 00 01 00 00 00 09 b2 00 0b 12 07 b6 00 13 |................| 00000120 b1 00 00 00 00 00 01 00 0d 00 00 00 02 00 16 |...............| 0000012f SourceFile 奉來。oくても咾 ^SourceFile ̄ ^M.j ̄
  • 12. pポイント2:徭クラス兆 $ hexdump -C M.class 00000000 ca fe ba be 00 03 00 2d 00 18 0c 00 14 00 17 01 |.......-........| 00000010 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |..([Ljava/lang/S| 00000020 74 72 69 6e 67 3b 29 56 01 00 10 6a 61 76 61 2f |tring;)V...java/| 00000030 6c 61 6e 67 2f 4f 62 6a 65 63 74 07 00 03 01 00 |lang/Object.....| 00000040 0c 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 07 00 0f |.Hello World!...| 00000050 08 00 05 07 00 12 01 00 04 43 6f 64 65 01 00 04 |.........Code...| 00000060 6d 61 69 6e 09 00 08 00 01 01 00 01 4d 01 00 0a |main........M...| 00000070 53 6f 75 72 63 65 46 69 6c 65 0c 00 10 00 15 01 |SourceFile......| 00000080 00 13 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |..java/io/PrintS| 00000090 74 72 65 61 6d 01 00 07 70 72 69 6e 74 6c 6e 07 |tream...println.| 000000a0 00 0c 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 |.....java/lang/S| 000000b0 79 73 74 65 6d 0a 00 06 00 0e 01 00 03 6f 75 74 |ystem........out| 000000c0 01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |...(Ljava/lang/S| 000000d0 74 72 69 6e 67 3b 29 56 01 00 03 4d 2e 6a 01 00 |tring;)V...M.j..| 000000e0 15 4c 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |.Ljava/io/PrintS| 000000f0 74 72 65 61 6d 3b 00 21 00 11 00 04 00 00 00 00 |tream;.!........| 00000100 00 01 00 09 00 0a 00 02 00 01 00 09 00 00 00 15 |................| 00000110 00 02 00 01 00 00 00 09 b2 00 0b 12 07 b6 00 13 |................| 00000120 b1 00 00 00 00 00 01 00 0d 00 00 00 02 00 16 |...............| 0000012f ^M ̄クラス歌孚 this_class ^Code ̄? (メソッドの嶄附を燕Fするために駅ず贋壓) クラス兆を Code にすれば ^M ̄ をせる
  • 14. pポイント3:Hクラス $ hexdump -C M.class 00000000 ca fe ba be 00 03 00 2d 00 18 0c 00 14 00 17 01 |.......-........| 00000010 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |..([Ljava/lang/S| 00000020 74 72 69 6e 67 3b 29 56 01 00 10 6a 61 76 61 2f |tring;)V...java/| 00000030 6c 61 6e 67 2f 4f 62 6a 65 63 74 07 00 03 01 00 |lang/Object.....| 00000040 0c 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 07 00 0f |.Hello World!...| 00000050 08 00 05 07 00 12 01 00 04 43 6f 64 65 01 00 04 |.........Code...| 00000060 6d 61 69 6e 09 00 08 00 01 01 00 01 4d 01 00 0a |main........M...| 00000070 53 6f 75 72 63 65 46 69 6c 65 0c 00 10 00 15 01 |SourceFile......| 00000080 00 13 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |..java/io/PrintS| 00000090 74 72 65 61 6d 01 00 07 70 72 69 6e 74 6c 6e 07 |tream...println.| 000000a0 00 0c 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 |.....java/lang/S| 000000b0 79 73 74 65 6d 0a 00 06 00 0e 01 00 03 6f 75 74 |ystem........out| 000000c0 01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |...(Ljava/lang/S| 000000d0 74 72 69 6e 67 3b 29 56 01 00 03 4d 2e 6a 01 00 |tring;)V...M.j..| 000000e0 15 4c 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 |.Ljava/io/PrintS| 000000f0 74 72 65 61 6d 3b 00 21 00 11 00 04 00 00 00 00 |tream;.!........| 00000100 00 01 00 09 00 0a 00 02 00 01 00 09 00 00 00 15 |................| 00000110 00 02 00 01 00 00 00 09 b2 00 0b 12 07 b6 00 13 |................| 00000120 b1 00 00 00 00 00 01 00 0d 00 00 00 02 00 16 |...............| 0000012f ^java/lang/Object ̄ クラス歌孚 super_class Hクラスを PrintStream にすれば ^java/lang/Object ̄ とそのクラス歌孚がれる? (java/lang/System は ?nal なのでダメ ^java/io/PrintStream ̄ (System.out の歌孚で旋喘)
  • 15. バイナリエディタできQえ $ hexdump -C Code.class 00000000 ca fe ba be 00 03 00 2d 00 13 0c 00 10 00 12 01 |.......-........| 00000010 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 |..([Ljava/lang/S| 00000020 74 72 69 6e 67 3b 29 56 01 00 0c 48 65 6c 6c 6f |tring;)V...Hello| 00000030 20 57 6f 72 6c 64 21 07 00 0b 08 00 03 07 00 0e | World!.........| 00000040 01 00 04 43 6f 64 65 01 00 04 6d 61 69 6e 09 00 |...Code...main..| 00000050 06 00 01 0c 00 0c 00 11 01 00 13 6a 61 76 61 2f |...........java/| 00000060 69 6f 2f 50 72 69 6e 74 53 74 72 65 61 6d 01 00 |io/PrintStream..| 00000070 07 70 72 69 6e 74 6c 6e 07 00 07 01 00 10 6a 61 |.println......ja| 00000080 76 61 2f 6c 61 6e 67 2f 53 79 73 74 65 6d 0a 00 |va/lang/System..| 00000090 04 00 0a 01 00 03 6f 75 74 01 00 15 28 4c 6a 61 |......out...(Lja| 000000a0 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 |va/lang/String;)| 000000b0 56 01 00 15 4c 6a 61 76 61 2f 69 6f 2f 50 72 69 |V...Ljava/io/Pri| 000000c0 6e 74 53 74 72 65 61 6d 3b 00 21 00 0d 00 04 00 |ntStream;.!.....| 000000d0 00 00 00 00 01 00 09 00 08 00 02 00 01 00 07 00 |................| 000000e0 00 00 15 00 02 00 01 00 00 00 09 b2 00 09 12 05 |................| 000000f0 b6 00 0f b1 00 00 00 00 00 00 |..........| 000000fa 250 bytes (61.2%)408 bytes ★ constant pool count 0x18★0x13
  • 16. 暴の基え Hello World! を咫忖する? .class ファイルを? どこまで弌さくできるか 250 bytes
  • 17. まとめ ? JVM碧とバイナリエディタがあればY[べる ? シをg`えると噸粁ないエラ`がられる ? .class iめると javap の竃薦にHしみがイ ? チャレンジのh http://bit.ly/1w9a4Kb ? もっと玉くできそうだったら @kawachi まで