From 292e1b8d88d0e31f7f3a457bd0c2b145afd1de41 Mon Sep 17 00:00:00 2001 From: "novice.li" Date: Mon, 1 Apr 2024 22:07:03 +0800 Subject: [PATCH] hook LicensingFacade --- .../LicensingFacadeTransformer.java | 38 +++++++++++++++++++ .../java/com/novitechie/PrivacyPlugin.java | 2 +- .../java/com/novitechie/StackTraceRule.java | 15 ++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/novitechie/LicensingFacadeTransformer.java diff --git a/src/main/java/com/novitechie/LicensingFacadeTransformer.java b/src/main/java/com/novitechie/LicensingFacadeTransformer.java new file mode 100644 index 0000000..4f786e2 --- /dev/null +++ b/src/main/java/com/novitechie/LicensingFacadeTransformer.java @@ -0,0 +1,38 @@ +package com.novitechie; + +import com.janetfilter.core.plugin.MyTransformer; +import jdk.internal.org.objectweb.asm.ClassReader; +import jdk.internal.org.objectweb.asm.ClassWriter; +import jdk.internal.org.objectweb.asm.tree.*; + +import static jdk.internal.org.objectweb.asm.Opcodes.*; + +public class LicensingFacadeTransformer implements MyTransformer { + @Override + public String getHookClassName() { + return "com/intellij/ui/LicensingFacade"; + } + + @Override + public byte[] transform(String className, byte[] classBytes, int order) throws Exception { + ClassReader reader = new ClassReader(classBytes); + ClassNode node = new ClassNode(ASM5); + reader.accept(node, 0); + for (MethodNode m : node.methods) { + if ("getLicenseExpirationDate".equals(m.name)) { + InsnList list = new InsnList(); + list.add(new MethodInsnNode(INVOKESTATIC, "com/novitechie/StackTraceRule", "hook", "()Ljava/util/Date;", false)); + list.add(new InsnNode(DUP)); + LabelNode labelNode = new LabelNode(); + list.add(new JumpInsnNode(IFNULL,labelNode)); + list.add(new InsnNode(ARETURN)); + list.add(labelNode); + list.add(new InsnNode(POP)); + m.instructions.insert(list); + } + } + ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); + node.accept(writer); + return writer.toByteArray(); + } +} diff --git a/src/main/java/com/novitechie/PrivacyPlugin.java b/src/main/java/com/novitechie/PrivacyPlugin.java index 3e518b4..8e03e3b 100644 --- a/src/main/java/com/novitechie/PrivacyPlugin.java +++ b/src/main/java/com/novitechie/PrivacyPlugin.java @@ -19,6 +19,6 @@ public class PrivacyPlugin implements PluginEntry { @Override public List getTransformers() { - return Arrays.asList(new VMOptionsTransformer(),new PluginClassLoaderTransformer()); + return Arrays.asList(new VMOptionsTransformer(),new PluginClassLoaderTransformer(),new LicensingFacadeTransformer()); } } diff --git a/src/main/java/com/novitechie/StackTraceRule.java b/src/main/java/com/novitechie/StackTraceRule.java index 5abf63f..e3d63d3 100644 --- a/src/main/java/com/novitechie/StackTraceRule.java +++ b/src/main/java/com/novitechie/StackTraceRule.java @@ -1,5 +1,8 @@ package com.novitechie; +import java.util.Calendar; +import java.util.Date; + public class StackTraceRule { public static boolean check() { RuntimeException e = new RuntimeException(); @@ -10,4 +13,16 @@ public class StackTraceRule { } return false; } + + public static Date hook() { + RuntimeException e = new RuntimeException(); + for (StackTraceElement stackTraceElement : e.getStackTrace()) { + if (stackTraceElement.getFileName() == null) { + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_MONTH, 180); + return calendar.getTime(); + } + } + return null; + } }