Skip to content

Commit 9a0ce2f

Browse files
committed
Add Dynamic Exchange Module
1 parent b914598 commit 9a0ce2f

25 files changed

Lines changed: 958 additions & 39 deletions

‎MCDynamicExchanger/.classpath‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,7 @@
1616
<attribute name="maven.pomderived" value="true"/>
1717
</attributes>
1818
</classpathentry>
19+
<classpathentry kind="lib" path="D:/Minecraft3/.minecraft/libraries/com/mojang/brigadier/1.0.17/brigadier-1.0.17.jar"/>
20+
<classpathentry kind="lib" path="D:/1.14.4-remapped.jar" sourcepath="D:/1.14.4-remapped-src.zip"/>
1921
<classpathentry kind="output" path="target/classes"/>
2022
</classpath>

‎MCDynamicExchanger/MANIFEST.MF‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Manifest-Version: 1.0
2+
Created-By: Nickid2018
3+
Premain-Class: com.github.nickid2018.dynamicex.DEProgramInterface
4+
Main-Class: com.github.nickid2018.mcremap.RemapperMain
5+
Can-Redefine-Classes: true
6+
Can-Retransform-Classes: true
7+
Class-Path: asm-all-6.0_BETA.jar
8+
log4j-1.2.17.jar
9+
commons-io-2.6.jar
10+

‎MCDynamicExchanger/pom.xml‎

Lines changed: 39 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,40 @@
1-
<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">
2-
<modelVersion>4.0.0</modelVersion>
3-
<groupId>com.github.nickid2018</groupId>
4-
<artifactId>mcde</artifactId>
5-
<version>0.0.1</version>
6-
<name>MCDynamicExchanger</name>
7-
<build>
8-
<sourceDirectory>src</sourceDirectory>
9-
<plugins>
10-
<plugin>
11-
<artifactId>maven-compiler-plugin</artifactId>
12-
<version>3.7.0</version>
13-
<configuration>
14-
<source>1.8</source>
15-
<target>1.8</target>
16-
</configuration>
17-
</plugin>
18-
</plugins>
19-
</build>
20-
<dependencies>
21-
<dependency>
22-
<groupId>org.ow2.asm</groupId>
23-
<artifactId>asm-all</artifactId>
24-
<version>6.0_BETA</version>
25-
</dependency>
26-
<dependency>
27-
<groupId>commons-io</groupId>
28-
<artifactId>commons-io</artifactId>
29-
<version>2.6</version>
30-
</dependency>
31-
</dependencies>
32-
<description>A no-mod-launcher dynamic class replacer</description>
1+
<project xmlns="http://maven.apache.org/POM/4.0.0"
2+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<groupId>com.github.nickid2018</groupId>
6+
<artifactId>mcde</artifactId>
7+
<version>0.0.1</version>
8+
<name>MCDynamicExchanger</name>
9+
<build>
10+
<sourceDirectory>src</sourceDirectory>
11+
<plugins>
12+
<plugin>
13+
<artifactId>maven-compiler-plugin</artifactId>
14+
<version>3.7.0</version>
15+
<configuration>
16+
<source>1.8</source>
17+
<target>1.8</target>
18+
</configuration>
19+
</plugin>
20+
</plugins>
21+
</build>
22+
<dependencies>
23+
<dependency>
24+
<groupId>org.ow2.asm</groupId>
25+
<artifactId>asm-all</artifactId>
26+
<version>6.0_BETA</version>
27+
</dependency>
28+
<dependency>
29+
<groupId>commons-io</groupId>
30+
<artifactId>commons-io</artifactId>
31+
<version>2.6</version>
32+
</dependency>
33+
<dependency>
34+
<groupId>log4j</groupId>
35+
<artifactId>log4j</artifactId>
36+
<version>1.2.17</version>
37+
</dependency>
38+
</dependencies>
39+
<description>A no-mod-launcher dynamic class replacer</description>
3340
</project>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.github.nickid2018.asmexecutor.gen;
2+
3+
import org.objectweb.asm.*;
4+
5+
public class AnnonationGenerator extends AnnotationVisitor {
6+
7+
public AnnonationGenerator() {
8+
super(Opcodes.ASM6);
9+
}
10+
11+
}

‎MCDynamicExchanger/src/com/github/nickid2018/asmexecutor/gen/ClassGenerator.java‎

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,24 @@ public class ClassGenerator {
1111
public String details;
1212
public String cname;
1313
public ASMClass clazz;
14+
public byte[] generated;
15+
16+
public ClassGenerator(String details, String cname) {
17+
this.details = details;
18+
this.cname = cname;
19+
}
1420

1521
public ClassGenerator(String details) {
1622
this.details = details;
23+
cname = "_ASM_gen_" + (int) (Integer.MAX_VALUE * Math.random());
1724
}
1825

1926
public void make() {
2027
String[] splits = details.split("\n", 2);
2128
details = splits[1];
2229
String[] splitss = splits[0].split(" ", 3);
2330
ClassWriter writer = new ClassWriter(0);
24-
writer.visit(V1_8, Integer.parseInt(splitss[0]),
25-
cname = "_ASM_gen_" + (int) (Integer.MAX_VALUE * Math.random()), null, splitss[1],
31+
writer.visit(V1_8, Integer.parseInt(splitss[0]), cname, null, splitss[1],
2632
splitss[2].trim().isEmpty() ? null : splitss[2].trim().split(" "));
2733
details = details.replaceAll("[Tt][Hh][Ii][Ss]_[Cc][Ll][Aa][Ss][Ss]", cname);
2834
String[] arrdetail = details.split("\n");
@@ -34,23 +40,45 @@ public void make() {
3440
index += genMethod(writer, arrdetail, index);
3541
break;
3642
case "FIELD":
37-
index += genField(writer, arrdetail, index);
43+
index += genField(writer, detail);
44+
break;
45+
case "INNERCLASS":
46+
index += genInnerClass(writer, detail);
47+
break;
48+
case "OUTERCLASS":
49+
index += genOuterClass(writer, detail);
3850
break;
3951
case "DEFAULT_INIT":
4052
index += genDefaultInit(writer);
4153
break;
4254
default:
43-
throw new IllegalArgumentException("Uncompile Tag");
55+
throw new IllegalArgumentException("Uncongnized Tag:" + type);
4456
}
4557
}
4658
writer.visitEnd();
47-
clazz = ASMClass.newClass(writer.toByteArray());
59+
generated = writer.toByteArray();
60+
}
61+
62+
public ASMClass generateClass() {
63+
return clazz = ASMClass.newClass(generated);
4864
}
4965

5066
public Class<?> getGeneratedClass() {
5167
return clazz.clazz;
5268
}
5369

70+
public static int genInnerClass(ClassWriter writer, String detail) {
71+
String[] all = detail.split(" ");
72+
writer.visitInnerClass(all[1], all[2], all[3], Integer.parseInt(all[4]));
73+
return 1;
74+
}
75+
76+
public static int genOuterClass(ClassWriter writer, String detail) {
77+
String[] all = detail.split(" ");
78+
writer.visitOuterClass(all[1], all[2], all[3]);
79+
return 1;
80+
}
81+
5482
public static int genMethod(ClassWriter writer, String[] details, int offset) {
5583
int counter = 1;
5684
String description = details[offset];
@@ -67,8 +95,8 @@ public static int genMethod(ClassWriter writer, String[] details, int offset) {
6795
return counter;
6896
}
6997

70-
public static int genField(ClassWriter writer, String[] details, int offset) {
71-
String[] aftSplit = details[offset].split(" ", 5);
98+
public static int genField(ClassWriter writer, String detail) {
99+
String[] aftSplit = detail.split(" ", 5);
72100
FieldVisitor fwriter;
73101
if (aftSplit.length == 4) {
74102
fwriter = writer.visitField(Integer.parseInt(aftSplit[1]), aftSplit[2], aftSplit[3].trim(), null, null);
@@ -84,6 +112,10 @@ public static int genField(ClassWriter writer, String[] details, int offset) {
84112
return 1;
85113
}
86114

115+
public static boolean genFieldNextLine(FieldVisitor writer, String detail) {
116+
return false;
117+
}
118+
87119
public static int genDefaultInit(ClassWriter writer) {
88120
MethodVisitor mv = writer.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
89121
mv.visitVarInsn(ALOAD, 0);

‎MCDynamicExchanger/src/com/github/nickid2018/asmexecutor/gen/ClassTransformer.java‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ public ClassTransformer(byte[] asmcode) {
2121
this.asmcode = asmcode;
2222
}
2323

24+
public String executeInString() throws IOException {
25+
ClassReader reader = new ClassReader(asmcode);
26+
reader.accept(this, ClassReader.SKIP_DEBUG);
27+
this.writer.flush();
28+
return this.writer.toString().replaceAll(clazzName, "THIS_CLASS");
29+
}
30+
2431
public void execute() throws IOException {
2532
ClassReader reader = new ClassReader(asmcode);
2633
reader.accept(this, ClassReader.SKIP_DEBUG);
@@ -84,6 +91,26 @@ public FieldVisitor visitField(int access, String name, String desc, String sign
8491
}
8592
}
8693

94+
@Override
95+
public void visitInnerClass(String name, String outerName, String innerName, int access) {
96+
try {
97+
IOUtils.write("INNERCLASS " + name + " " + outerName + " " + innerName + " " + access + "\n", writer);
98+
} catch (IOException e) {
99+
throw new RuntimeException(e);
100+
}
101+
}
102+
103+
@Override
104+
public void visitOuterClass(String owner, String name, String desc) {
105+
try {
106+
IOUtils.write("OUTERCLASS " + owner + " " + name + " " + desc + "\n", writer);
107+
} catch (IOException e) {
108+
throw new RuntimeException(e);
109+
}
110+
}
111+
112+
113+
87114
public static class ClassMethodWriter extends MethodTransformer.MethodWriter {
88115

89116
public ClassMethodWriter(String desc, String name, String clazzName, StringWriter writer) throws IOException {

‎MCDynamicExchanger/src/com/github/nickid2018/asmexecutor/gen/MethodTransformer.java‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,12 @@ private String formatForFrame(Object[] obj) {
133133
}
134134
return sb.toString();
135135
}
136+
137+
@Override
138+
public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) {
139+
// TODO ×Ô¶¯Éú³ÉµÄ·½·¨´æ¸ù
140+
return super.visitTypeAnnotation(typeRef, typePath, desc, visible);
141+
}
136142

137143
@Override
138144
public void visitInsn(int opcode) {
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.github.nickid2018.dynamicex;
2+
3+
import org.apache.log4j.*;
4+
import java.lang.instrument.*;
5+
6+
public class DEProgramInterface {
7+
8+
public static Instrumentation instrumention;
9+
public static final Logger logger;
10+
11+
public static void premain(String preargs, Instrumentation inst) {
12+
instrumention = inst;
13+
inst.addTransformer(new DETransformer());
14+
}
15+
16+
static {
17+
PropertyConfigurator.configure(DEProgramInterface.class
18+
.getResourceAsStream("/com/github/nickid2018/dynamicex/resources/defaultLogFormat.properties"));
19+
logger = Logger.getLogger("DynamicExchanger");
20+
}
21+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.github.nickid2018.dynamicex;
2+
3+
import java.security.*;
4+
import org.objectweb.asm.*;
5+
import java.lang.instrument.*;
6+
import com.github.nickid2018.dynamicex.hacks.*;
7+
8+
public class DETransformer implements ClassFileTransformer {
9+
10+
@Override
11+
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
12+
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
13+
// Hack net.minecraft.commands.Commands
14+
if (className.equals("net/minecraft/commands/Commands")) {
15+
ClassReader reader = new ClassReader(classfileBuffer);
16+
ClassWriter writer = new ClassWriter(0);
17+
reader.accept(new HackCommandsWriter(writer), 0);
18+
return writer.toByteArray();
19+
}
20+
return classfileBuffer;
21+
}
22+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.github.nickid2018.dynamicex;
2+
3+
import java.lang.instrument.*;
4+
5+
public class DynamicClass {
6+
7+
public final String filePath;
8+
public final ClassDefinition definition;
9+
10+
public DynamicClass(String filePath, ClassDefinition definition) {
11+
this.filePath = filePath;
12+
this.definition = definition;
13+
}
14+
}

0 commit comments

Comments
 (0)