Skip to content

Commit aa415e9

Browse files
committed
update class transform. fix blocking defineclass from overwriting data
1 parent e2a6c63 commit aa415e9

File tree

8 files changed

+100
-16
lines changed

8 files changed

+100
-16
lines changed

build.gradle.kts

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,19 @@ import java.net.URI
33
plugins {
44
java
55
`maven-publish`
6-
id("com.github.johnrengelman.shadow") version "7.1.2"
6+
id("com.gradleup.shadow") version "9.1.0"
7+
id("xyz.wagyourtail.commons-gradle") version "1.0.5-SNAPSHOT"
78
}
89

910
version = if (project.hasProperty("version_snapshot")) project.properties["version"] as String + "-SNAPSHOT" else project.properties["version"] as String
1011
group = project.properties["maven_group"] as String
1112

13+
commons.autoToolchain(8, 17)
14+
1215
base {
1316
archivesName.set(project.properties["archives_base_name"] as String)
1417
}
1518

16-
java {
17-
sourceCompatibility = JavaVersion.VERSION_1_8
18-
targetCompatibility = JavaVersion.VERSION_1_8
19-
}
20-
2119
repositories {
2220
mavenCentral()
2321
maven("https://maven.quiltmc.org/repository/release")
@@ -26,20 +24,24 @@ repositories {
2624
dependencies {
2725

2826
// class transform
29-
implementation("net.lenni0451.classtransform:core:1.12.1")
27+
implementation("net.lenni0451.classtransform:core:1.14.1")
3028

3129
// qup
3230
implementation("org.quiltmc.qup:json:0.2.0") {
3331
isTransitive = false
3432
}
35-
}
3633

37-
tasks.compileJava {
38-
options.encoding = "UTF-8"
34+
testImplementation("org.ow2.asm:asm:9.2")
35+
testImplementation("org.ow2.asm:asm-commons:9.2")
36+
testImplementation("org.ow2.asm:asm-tree:9.2")
3937

40-
if (JavaVersion.current().isJava9Compatible) {
41-
options.release.set(8)
42-
}
38+
testImplementation("net.lenni0451:Reflect:1.5.0")
39+
testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.2")
40+
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.2")
41+
}
42+
43+
tasks.test {
44+
useJUnitPlatform()
4345
}
4446

4547
tasks.jar {

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
org.gradle.jvmargs=-Xmx1G
2-
version=0.1.4
2+
version=0.1.5
33
maven_group=xyz.wagyourtail.unimined
44
archives_base_name=jarmod-agent
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists

settings.gradle.kts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,9 @@
1+
pluginManagement {
2+
repositories {
3+
maven("https://maven.wagyourtail.xyz/snapshots")
4+
mavenCentral()
5+
gradlePluginPortal()
6+
}
7+
}
8+
19
rootProject.name = "jarmod-agent"

src/main/java/xyz/wagyourtail/unimined/jarmodagent/JarModder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,8 +258,9 @@ public byte[] patch(String className, Supplier<URL> base, Map<String, URL> prior
258258
debug("Found class with runtime patches: \"" + className + "\"");
259259
return patch(className, base.get());
260260
}
261-
return readAllBytes(base.get().openStream());
262261

262+
// no transform necessary
263+
return null;
263264
}
264265

265266
private String bytesToHex(byte[] hash) {
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package xyz.wagyourtail.unimined.jarmodagent;
2+
3+
public class Test {
4+
5+
public class Inner {
6+
7+
}
8+
9+
public static void main(String[] args) {
10+
Test t = null;
11+
t.new Inner() {};
12+
}
13+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package xyz.wagyourtail.unimined.test;
2+
3+
import net.lenni0451.reflect.Agents;
4+
import org.junit.jupiter.api.BeforeAll;
5+
import org.junit.jupiter.api.Test;
6+
import org.objectweb.asm.ClassWriter;
7+
import org.objectweb.asm.MethodVisitor;
8+
import org.objectweb.asm.Opcodes;
9+
import org.objectweb.asm.tree.ClassNode;
10+
import xyz.wagyourtail.unimined.jarmodagent.JarModAgent;
11+
12+
import java.io.IOException;
13+
import java.lang.invoke.MethodHandles;
14+
15+
import static org.junit.jupiter.api.Assertions.assertEquals;
16+
17+
public class JMATest {
18+
19+
@BeforeAll
20+
public static void loadAgent() throws IOException {
21+
Agents.loadInternal(JarModAgent.class);
22+
}
23+
24+
@Test
25+
public void test() throws IllegalAccessException {
26+
27+
// transformed
28+
ClassNode transformed = new ClassNode();
29+
transformed.visit(52, 1, "xyz/wagyourtail/unimined/test/TestClass", null, "java/lang/Object", null);
30+
31+
MethodVisitor md = transformed.visitMethod(Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, "test", "()Ljava/lang/String;", null, null);
32+
md.visitCode();
33+
md.visitLdcInsn("transformed");
34+
md.visitInsn(Opcodes.ARETURN);
35+
md.visitMaxs(0, 0);
36+
md.visitEnd();
37+
38+
transformed.visitEnd();
39+
40+
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
41+
transformed.accept(cw);
42+
43+
byte[] classBytes = cw.toByteArray();
44+
45+
MethodHandles.Lookup lookup = MethodHandles.lookup();
46+
lookup.defineClass(classBytes);
47+
48+
assertEquals("transformed", TestClass.test());
49+
}
50+
51+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package xyz.wagyourtail.unimined.test;
2+
3+
public class TestClass {
4+
5+
public static String test() {
6+
return "untransformed";
7+
}
8+
9+
}

0 commit comments

Comments
 (0)