classファイルを変更して見えないメソッドを作る
まず、以下のソースを作ってコンパイルします。
class InvisibleMethod { void test() { System.out.println("hoge"); } public static void main(String[] args) { new InvisibleMethod().test(); } }
バイナリエディタで、メソッド名 test をブランクに変更します。20 20 20 20にします。
address +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF 000000: CA FE BA BE 00 00 00 32 00 21 0A 00 08 00 12 09 ハ・コセ・・・2・!・・・・・・ 000010: 00 13 00 14 08 00 15 0A 00 16 00 17 07 00 18 0A ・・・・・・・・・・・・・・・・ 000020: 00 05 00 12 0A 00 05 00 19 07 00 1A 01 00 06 3C ・・・・・・・・・・・・・・・< 000030: 69 6E 69 74 3E 01 00 03 28 29 56 01 00 04 43 6F init>・・・()V・・・Co 000040: 64 65 01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 de・・・LineNumberT 000050: 61 62 6C 65 01 00 04 74 65 73 74 01 00 04 6D 61 able・・・test・・・ma 000060: 69 6E 01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61 6E in・・・([Ljava/lan 000070: 67 2F 53 74 72 69 6E 67 3B 29 56 01 00 0A 53 6F g/String;)V・・・So 000080: 75 72 63 65 46 69 6C 65 01 00 14 49 6E 76 69 73 urceFile・・・Invis 000090: 69 62 6C 65 4D 65 74 68 6F 64 2E 6A 61 76 61 0C ibleMethod.java・ 0000A0: 00 09 00 0A 07 00 1B 0C 00 1C 00 1D 01 00 04 68 ・・・・・・・・・・・・・・・h 0000B0: 6F 67 65 07 00 1E 0C 00 1F 00 20 01 00 0F 49 6E oge・・・・・・・ ・・・In 0000C0: 76 69 73 69 62 6C 65 4D 65 74 68 6F 64 0C 00 0D visibleMethod・・・ 0000D0: 00 0A 01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F ・・・・・java/lang/O 0000E0: 62 6A 65 63 74 01 00 10 6A 61 76 61 2F 6C 61 6E bject・・・java/lan 0000F0: 67 2F 53 79 73 74 65 6D 01 00 03 6F 75 74 01 00 g/System・・・out・・ 000100: 15 4C 6A 61 76 61 2F 69 6F 2F 50 72 69 6E 74 53 ・Ljava/io/PrintS 000110: 74 72 65 61 6D 3B 01 00 13 6A 61 76 61 2F 69 6F tream;・・・java/io 000120: 2F 50 72 69 6E 74 53 74 72 65 61 6D 01 00 07 70 /PrintStream・・・p 000130: 72 69 6E 74 6C 6E 01 00 15 28 4C 6A 61 76 61 2F rintln・・・(Ljava/ 000140: 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56 00 20 lang/String;)V・ 000150: 00 05 00 08 00 00 00 00 00 03 00 00 00 09 00 0A ・・・・・・・・・・・・・・・・ 000160: 00 01 00 0B 00 00 00 1D 00 01 00 01 00 00 00 05 ・・・・・・・・・・・・・・・・ 000170: 2A B7 00 01 B1 00 00 00 01 00 0C 00 00 00 06 00 *キ・・ア・・・・・・・・・・・ 000180: 01 00 00 00 01 00 00 00 0D 00 0A 00 01 00 0B 00 ・・・・・・・・・・・・・・・・ 000190: 00 00 25 00 02 00 01 00 00 00 09 B2 00 02 12 03 ・・%・・・・・・・・イ・・・・ 0001A0: B6 00 04 B1 00 00 00 01 00 0C 00 00 00 0A 00 02 カ・・ア・・・・・・・・・・・・ 0001B0: 00 00 00 03 00 08 00 04 00 09 00 0E 00 0F 00 01 ・・・・・・・・・・・・・・・・ 0001C0: 00 0B 00 00 00 27 00 02 00 01 00 00 00 0B BB 00 ・・・・・'・・・・・・・・サ・ 0001D0: 05 59 B7 00 06 B6 00 07 B1 00 00 00 01 00 0C 00 ・Yキ・・カ・・ア・・・・・・・ 0001E0: 00 00 0A 00 02 00 00 00 06 00 0A 00 07 00 01 00 ・・・・・・・・・・・・・・・・ 0001F0: 10 00 00 00 02 00 11 ・・・・・・・
変更してもチャンと動きます。
ところが、javapで見ると、メソッド名は見えなくなります。おぉー!
C:\home\eclipse\test>javap InvisibleMethod Compiled from "InvisibleMethod.java" class InvisibleMethod extends java.lang.Object{ InvisibleMethod(); void (); public static void main(java.lang.String[]); }
このアイディア、逆コンパイラ防止に使えないかな???
jadで逆コンパイルしたらどうなるのかな?
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.kpdus.com/jad.html // Decompiler options: packimports(3) // Source File Name: InvisibleMethod.java import java.io.PrintStream; class InvisibleMethod { InvisibleMethod() { } void _20__20__20__20_() { System.out.println("hoge"); } public static void main(String args[]) { (new InvisibleMethod())._20__20__20__20_(); } }
あー。ブランクにはならなかったです。
もう少し面白い結果を期待していたけれど、イマイチ。