Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package jni;
- import jdk.incubator.foreign.CLinker;
- import jdk.incubator.foreign.FunctionDescriptor;
- import jdk.incubator.foreign.LibraryLookup;
- import jdk.incubator.foreign.MemoryAccess;
- import jdk.incubator.foreign.MemoryAddress;
- import jdk.incubator.foreign.MemoryLayout;
- import jdk.incubator.foreign.MemorySegment;
- import jdk.incubator.foreign.NativeScope;
- import static java.lang.invoke.MethodType.methodType;
- import static jdk.incubator.foreign.CLinker.*;
- import static jdk.incubator.foreign.MemoryAddress.NULL;
- import java.nio.charset.StandardCharsets;
- import java.util.Base64;
- public class ClassDefiner {
- public static void main(String[] args) throws Throwable {
- MemoryAddress vm;
- try (var ns = NativeScope.unboundedScope()) {
- var JNI_GetCreatedJavaVMs = CLinker.getInstance().downcallHandle(
- LibraryLookup.ofDefault().lookup("JNI_GetCreatedJavaVMs").orElseThrow(),
- methodType(int.class, MemoryAddress.class, int.class, MemoryAddress.class),
- FunctionDescriptor.of(C_INT, C_POINTER, C_INT, C_POINTER));
- var vmPtr = ns.allocate(C_POINTER);
- int result = (int) JNI_GetCreatedJavaVMs.invokeExact(vmPtr.address(), 1, NULL);
- if (result != 0) throw new Exception("JNI Error: " + result);
- vm = MemoryAccess.getAddress(vmPtr);
- }
- MemoryAddress env;
- try (var ns = NativeScope.unboundedScope()) {
- var vmMethodCount = 8;
- var vmTable = MemoryAccess.getAddress(vm.asSegmentRestricted(C_POINTER.byteSize()));
- var vmTableSeg = vmTable.asSegmentRestricted(MemoryLayout.ofSequence(vmMethodCount, C_POINTER).byteSize());
- var GetEnvIDX = 6;
- var GetEnv = CLinker.getInstance().downcallHandle(MemoryAccess.getAddressAtIndex(vmTableSeg, 6),
- methodType(int.class, MemoryAddress.class, MemoryAddress.class, int.class),
- FunctionDescriptor.of(C_INT, C_POINTER, C_POINTER, C_INT));
- var envPtr = ns.allocate(C_POINTER);
- int JNI_VERSION_10 = 0x000a0000; // 10
- int result = (int) GetEnv.invokeExact(vm, envPtr.address(), JNI_VERSION_10);
- if (result != 0) throw new Exception("JNI Error: " + result);
- env = MemoryAccess.getAddress(envPtr);
- }
- try (var ns = NativeScope.unboundedScope()) {
- var envMethodCount = 234;
- var envTable = MemoryAccess.getAddress(env.asSegmentRestricted(C_POINTER.byteSize()));
- var envTableSeg = envTable.asSegmentRestricted(MemoryLayout.ofSequence(envMethodCount, C_POINTER).byteSize());
- var DefineClassIDX = 5;
- var DefineClass = CLinker.getInstance().downcallHandle(MemoryAccess.getAddressAtIndex(envTableSeg, DefineClassIDX),
- methodType(MemoryAddress.class, MemoryAddress.class, MemoryAddress.class, MemoryAddress.class, MemoryAddress.class, int.class),
- FunctionDescriptor.of(C_POINTER, C_POINTER, C_POINTER, C_POINTER, C_POINTER, C_INT));
- var name = CLinker.toCString("java/lang/Example", StandardCharsets.UTF_8, ns);
- var bytes = classFile();
- var bytesPtr = ns.allocate(bytes.length);
- bytesPtr.copyFrom(MemorySegment.ofArray(bytes));
- MemoryAddress result = (MemoryAddress) DefineClass.invokeExact(env, name.address(), NULL, bytesPtr.address(), bytes.length);
- if (result.equals(NULL)) throw new Exception("JNI Error: " + result);
- }
- System.out.println(Class.forName("java.lang.Example"));
- }
- private static byte[] classFile() {
- return Base64.getDecoder().decode("yv66vgAAADsABQEAEWphdmEvbGFuZy9FeGFtcGxlBwABAQAQamF2YS9sYW5nL09iamVjdAcAAwAhAAIABAAAAAAAAAAA");
- }
- }
Add Comment
Please, Sign In to add comment