JVM字节码之手动档修改字节码

  • 用16进制编辑器改字节码

准备

开始

未改前

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进行对比

  1. javap解析出的, 区别在 iconst_0 ,iconst_1, 分别对应了falsetrue.
  2. xxd得到的, 区别在 0203 ac00, 0204 ac00.

使用wxMEdit修改二进制文件

修改前

wxMEdit-1.png

修改后

wxMEdit-2.png

运行的改变

20200618155852.png

总结

通过这种方式可以破解软件, 但是16进制依然太难理解了, 如果一个class文件内容特别多, 就根本不知道哪个才是应该修改的内容, 所以需要一种简单的方式来修改字节码文件.