准备
开始
未改前
1 2 3 4 5 6 7 8 9 10 11
| package com.yuda.test;
public class Main { public static void main(String[] args) { System.out.println(test()); }
private static boolean test() { return true; } }
|
javap解析:
1 2 3 4 5 6 7 8 9 10
| ...略 private static boolean test(); descriptor: ()Z flags: ACC_PRIVATE, ACC_STATIC Code: stack=1, locals=0, args_size=0 0: iconst_1 1: ireturn LineNumberTable: line 14: 0
|
xxd解析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| $ xxd com/yuda/test/Main.class 00000000: cafe babe 0000 0034 0024 0a00 0600 1609 .......4.$...... 00000010: 0017 0018 0a00 0500 190a 001a 001b 0700 ................ 00000020: 1c07 001d 0100 063c 696e 6974 3e01 0003 .......<init>... 00000030: 2829 5601 0004 436f 6465 0100 0f4c 696e ()V...Code...Lin 00000040: 654e 756d 6265 7254 6162 6c65 0100 124c eNumberTable...L 00000050: 6f63 616c 5661 7269 6162 6c65 5461 626c ocalVariableTabl 00000060: 6501 0004 7468 6973 0100 144c 636f 6d2f e...this...Lcom/ 00000070: 7975 6461 2f74 6573 742f 4d61 696e 3b01 yuda/test/Main;. 00000080: 0004 6d61 696e 0100 1628 5b4c 6a61 7661 ..main...([Ljava 00000090: 2f6c 616e 672f 5374 7269 6e67 3b29 5601 /lang/String;)V. 000000a0: 0004 6172 6773 0100 135b 4c6a 6176 612f ..args...[Ljava/ 000000b0: 6c61 6e67 2f53 7472 696e 673b 0100 0474 lang/String;...t 000000c0: 6573 7401 0003 2829 5a01 000a 536f 7572 est...()Z...Sour 000000d0: 6365 4669 6c65 0100 094d 6169 6e2e 6a61 ceFile...Main.ja 000000e0: 7661 0c00 0700 0807 001e 0c00 1f00 200c va............ . 000000f0: 0012 0013 0700 210c 0022 0023 0100 1263 ......!..".#...c 00000100: 6f6d 2f79 7564 612f 7465 7374 2f4d 6169 om/yuda/test/Mai 00000110: 6e01 0010 6a61 7661 2f6c 616e 672f 4f62 n...java/lang/Ob 00000120: 6a65 6374 0100 106a 6176 612f 6c61 6e67 ject...java/lang 00000130: 2f53 7973 7465 6d01 0003 6f75 7401 0015 /System...out... 00000140: 4c6a 6176 612f 696f 2f50 7269 6e74 5374 Ljava/io/PrintSt 00000150: 7265 616d 3b01 0013 6a61 7661 2f69 6f2f ream;...java/io/ 00000160: 5072 696e 7453 7472 6561 6d01 0007 7072 PrintStream...pr 00000170: 696e 746c 6e01 0004 285a 2956 0021 0005 intln...(Z)V.!.. 00000180: 0006 0000 0000 0003 0001 0007 0008 0001 ................ 00000190: 0009 0000 002f 0001 0001 0000 0005 2ab7 ...../........*. 000001a0: 0001 b100 0000 0200 0a00 0000 0600 0100 ................ 000001b0: 0000 0800 0b00 0000 0c00 0100 0000 0500 ................ 000001c0: 0c00 0d00 0000 0900 0e00 0f00 0100 0900 ................ 000001d0: 0000 3800 0200 0100 0000 0ab2 0002 b800 ..8............. 000001e0: 03b6 0004 b100 0000 0200 0a00 0000 0a00 ................ 000001f0: 0200 0000 0a00 0900 0b00 0b00 0000 0c00 ................ 00000200: 0100 0000 0a00 1000 1100 0000 0a00 1200 ................ 00000210: 1300 0100 0900 0000 1a00 0100 0000 0000 ................ 00000220: 0204 ac00 0000 0100 0a00 0000 0600 0100 ................ 00000230: 0000 0e00 0100 1400 0000 0200 15 .............
|
查询源码
看 com.sun.tools.classfile.Opcode
中的 ICONST_1(0x4),
和 IRETURN(0xac),
, 所以xxd的到的16进制中找4AC
.
修改源码
return true;
改为 return false;
javap解析:
1 2 3 4 5 6 7 8 9 10
| ...略 private static boolean test(); descriptor: ()Z flags: ACC_PRIVATE, ACC_STATIC Code: stack=1, locals=0, args_size=0 0: iconst_0 1: ireturn LineNumberTable: line 14: 0
|
xxd解析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| $ xxd com/yuda/test/Main.class 00000000: cafe babe 0000 0034 0024 0a00 0600 1609 .......4.$...... 00000010: 0017 0018 0a00 0500 190a 001a 001b 0700 ................ 00000020: 1c07 001d 0100 063c 696e 6974 3e01 0003 .......<init>... 00000030: 2829 5601 0004 436f 6465 0100 0f4c 696e ()V...Code...Lin 00000040: 654e 756d 6265 7254 6162 6c65 0100 124c eNumberTable...L 00000050: 6f63 616c 5661 7269 6162 6c65 5461 626c ocalVariableTabl 00000060: 6501 0004 7468 6973 0100 144c 636f 6d2f e...this...Lcom/ 00000070: 7975 6461 2f74 6573 742f 4d61 696e 3b01 yuda/test/Main;. 00000080: 0004 6d61 696e 0100 1628 5b4c 6a61 7661 ..main...([Ljava 00000090: 2f6c 616e 672f 5374 7269 6e67 3b29 5601 /lang/String;)V. 000000a0: 0004 6172 6773 0100 135b 4c6a 6176 612f ..args...[Ljava/ 000000b0: 6c61 6e67 2f53 7472 696e 673b 0100 0474 lang/String;...t 000000c0: 6573 7401 0003 2829 5a01 000a 536f 7572 est...()Z...Sour 000000d0: 6365 4669 6c65 0100 094d 6169 6e2e 6a61 ceFile...Main.ja 000000e0: 7661 0c00 0700 0807 001e 0c00 1f00 200c va............ . 000000f0: 0012 0013 0700 210c 0022 0023 0100 1263 ......!..".#...c 00000100: 6f6d 2f79 7564 612f 7465 7374 2f4d 6169 om/yuda/test/Mai 00000110: 6e01 0010 6a61 7661 2f6c 616e 672f 4f62 n...java/lang/Ob 00000120: 6a65 6374 0100 106a 6176 612f 6c61 6e67 ject...java/lang 00000130: 2f53 7973 7465 6d01 0003 6f75 7401 0015 /System...out... 00000140: 4c6a 6176 612f 696f 2f50 7269 6e74 5374 Ljava/io/PrintSt 00000150: 7265 616d 3b01 0013 6a61 7661 2f69 6f2f ream;...java/io/ 00000160: 5072 696e 7453 7472 6561 6d01 0007 7072 PrintStream...pr 00000170: 696e 746c 6e01 0004 285a 2956 0021 0005 intln...(Z)V.!.. 00000180: 0006 0000 0000 0003 0001 0007 0008 0001 ................ 00000190: 0009 0000 002f 0001 0001 0000 0005 2ab7 ...../........*. 000001a0: 0001 b100 0000 0200 0a00 0000 0600 0100 ................ 000001b0: 0000 0800 0b00 0000 0c00 0100 0000 0500 ................ 000001c0: 0c00 0d00 0000 0900 0e00 0f00 0100 0900 ................ 000001d0: 0000 3800 0200 0100 0000 0ab2 0002 b800 ..8............. 000001e0: 03b6 0004 b100 0000 0200 0a00 0000 0a00 ................ 000001f0: 0200 0000 0a00 0900 0b00 0b00 0000 0c00 ................ 00000200: 0100 0000 0a00 1000 1100 0000 0a00 1200 ................ 00000210: 1300 0100 0900 0000 1a00 0100 0000 0000 ................ 00000220: 0203 ac00 0000 0100 0a00 0000 0600 0100 ................ 00000230: 0000 0e00 0100 1400 0000 0200 15 .............
|
使用WinMerge进行对比
- javap解析出的, 区别在
iconst_0
,iconst_1
, 分别对应了false
和 true
.
- xxd得到的, 区别在
0203 ac00
, 0204 ac00
.
使用wxMEdit修改二进制文件
修改前
修改后
运行的改变
总结
通过这种方式可以破解软件, 但是16进制依然太难理解了, 如果一个class文件内容特别多, 就根本不知道哪个才是应该修改的内容, 所以需要一种简单的方式来修改字节码文件.