This commit is contained in:
novice.li 2024-02-25 12:18:32 +08:00
commit 439a127799
7 changed files with 233 additions and 0 deletions

38
.gitignore vendored Normal file
View File

@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
.idea/
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

71
pom.xml Normal file
View File

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.novitechie</groupId>
<artifactId>plugin-privacy</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>8</source>
<target>8</target>
<encoding>UTF-8</encoding>
<compilerArgument>-XDignore.symbol.file</compilerArgument>
<fork>true</fork>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
<manifestEntries>
<Built-By>novice.li</Built-By>
<JANF-Plugin-Entry>com.novitechie.PrivacyPlugin</JANF-Plugin-Entry>
</manifestEntries>
</archive>
<finalName>privacy</finalName>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.ja-netfilter</groupId>
<artifactId>ja-netfilter</artifactId>
<version>2.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,9 @@
package com.novitechie;
public class LoadClassRule {
public static void check(String name) throws Exception {
if (name.startsWith("com.janetfilter")) {
throw new ClassNotFoundException(name);
}
}
}

View File

@ -0,0 +1,37 @@
package com.novitechie;
import com.janetfilter.core.plugin.MyTransformer;
import jdk.internal.org.objectweb.asm.*;
import jdk.internal.org.objectweb.asm.commons.AdviceAdapter;
import static jdk.internal.org.objectweb.asm.Opcodes.ASM5;
public class PluginClassLoaderTransformer implements MyTransformer {
@Override
public String getHookClassName() {
return "com/intellij/ide/plugins/cl/PluginClassLoader";
}
@Override
public byte[] transform(String className, byte[] classBytes, int order) throws Exception {
ClassReader cr = new ClassReader(classBytes);
ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_FRAMES);
cr.accept(new ClassVisitor(ASM5, cw) {
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
if (name.equals("loadClass")) {
MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
return new AdviceAdapter(api, mv, access, name, desc) {
@Override
protected void onMethodEnter() {
mv.visitVarInsn(ALOAD, 1);
mv.visitMethodInsn(INVOKESTATIC, "com/novitechie/LoadClassRule", "check", "(Ljava/lang/String;)V", false);
}
};
}
return super.visitMethod(access, name, desc, signature, exceptions);
}
}, 6);
return cw.toByteArray();
}
}

View File

@ -0,0 +1,24 @@
package com.novitechie;
import com.janetfilter.core.plugin.MyTransformer;
import com.janetfilter.core.plugin.PluginEntry;
import java.util.Arrays;
import java.util.List;
public class PrivacyPlugin implements PluginEntry {
@Override
public String getName() {
return "PRIVACY";
}
@Override
public String getAuthor() {
return "novice.li";
}
@Override
public List<MyTransformer> getTransformers() {
return Arrays.asList(new VMOptionsTransformer(),new PluginClassLoaderTransformer());
}
}

View File

@ -0,0 +1,13 @@
package com.novitechie;
public class StackTraceRule {
public static boolean check() {
RuntimeException e = new RuntimeException();
for (StackTraceElement stackTraceElement : e.getStackTrace()) {
if (stackTraceElement.getFileName() == null) {
return true;
}
}
return false;
}
}

View File

@ -0,0 +1,41 @@
package com.novitechie;
import com.janetfilter.core.plugin.MyTransformer;
import jdk.internal.org.objectweb.asm.*;
import jdk.internal.org.objectweb.asm.commons.AdviceAdapter;
import static jdk.internal.org.objectweb.asm.Opcodes.ASM5;
public class VMOptionsTransformer implements MyTransformer {
@Override
public String getHookClassName() {
return "com/intellij/diagnostic/VMOptions";
}
@Override
public byte[] transform(String className, byte[] classBytes, int order) throws Exception {
ClassReader cr = new ClassReader(classBytes);
ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_FRAMES);
cr.accept(new ClassVisitor(ASM5, cw) {
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
if (name.equals("getUserOptionsFile")) {
MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
return new AdviceAdapter(api, mv, access, name, desc) {
@Override
protected void onMethodEnter() {
mv.visitMethodInsn(INVOKESTATIC, "com/novitechie/StackTraceRule", "check", "()Z", false);
Label l0 = new Label();
mv.visitJumpInsn(IFEQ, l0);
mv.visitInsn(ACONST_NULL);
mv.visitInsn(ARETURN);
mv.visitLabel(l0);
}
};
}
return super.visitMethod(access, name, desc, signature, exceptions);
}
}, 6);
return cw.toByteArray();
}
}