Начинающий
- Статус
- Оффлайн
- Регистрация
- 4 Дек 2021
- Сообщения
- 282
- Реакции
- 10
Пишу читуху под Rustex Remake которая работает на загрузке своих классов
Столкнулся с проблемой что эта параша детектит толи загрузку классов толи создания потока толи подключение к класс лоадеру
Какой класс лоадер лучше использовать мой код на данный момент
(Не много гпт фиксил ошибки с загрузкой классов) сейчас работает только AppClassLoader который я так понимаю в детекте чем его можно заменить?
ну или же как лучше дефайнить классы чтоб это не задетектило
Help
Столкнулся с проблемой что эта параша детектит толи загрузку классов толи создания потока толи подключение к класс лоадеру
Какой класс лоадер лучше использовать мой код на данный момент
ByteLoader:
package Heroin.base.ClassLoader;
import java.io.File;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
public class ByteLoader extends Thread {
public static byte[][] classbyte;
public static native Class defineClass(ClassLoader loader, byte[] bytecode, int length);
public static native Class MainAnnotation();
public static native boolean isKeyDown(int key);
public static native int getAsyncKeyState(int key);
public static int startByteLoader(byte[][] classes) {
try {
classbyte = classes;
ByteLoader loader = new ByteLoader();
loader.start();
} catch (Exception e) {
System.out.println("StartLoader: " + e);
}
return 0;
}
@Override
public void run() {
PrintWriter logWriter = null;
try {
String logPath = System.getProperty("user.home") + File.separator + "log.txt";
logWriter = new PrintWriter(logPath, "UTF-8");
logWriter.println("Starting ByteLoader...");
logWriter.flush();
ClassLoader targetLoader = findLoader(logWriter);
if (targetClassLoader == null) {
throw new Exception("ClassLoader is null");
}
logWriter.println("Found ClassLoader: " + targetClassLoader.getClass().getName());
logWriter.flush();
this.setContextClassLoader(targetClassLoader);
logWriter.println("Loading class");
List<Class<?>> allClasses = new ArrayList<>();
for (int i = 0; i < classbyte.length; i++) {
byte[] classData = classbyte[i];
if (classData == null) continue;
try {
Class<?> loadedClass = defineClass(null, classData, classData.length);
allClasses.add(loadedClass);
logWriter.println(" Loaded: " + loadedClass.getName());
} catch (Throwable e) {
logWriter.println(" ERROR: " + e.getMessage());
e.printStackTrace(logWriter);
}
}
logWriter.println("Loaded " + allClasses.size() + " classes");
logWriter.flush();
Class<?> annotationClass = null;
for (Class<?> cls : allClasses) {
if (cls.getName().equals("Heroin.base.Utils.ModInitializer")) {
annotationClass = cls;
logWriter.println("Found annotation: " + cls.getName());
break;
}
}
if (annotationClass == null) {
logWriter.println("ModInitializer not found!");
return;
}
for (Class<?> cls : allClasses) {
if (cls != annotationClass && cls.isAnnotationPresent(
(Class<? extends java.lang.annotation.Annotation>) annotationClass)) {
try {
cls.newInstance();
} catch (Exception e) {
logWriter.println("Error starting " + cls.getName() + ": " + e.getMessage());
}
}
}
logWriter.println("success load");
logWriter.flush();
} catch (Throwable error) {
if (logWriter != null) {
error.printStackTrace(logWriter);
logWriter.flush();
}
error.printStackTrace();
} finally {
if (logWriter != null) {
logWriter.close();
}
}
}
private ClassLoader findLoader(PrintWriter logWriter) {
for (Thread thread : Thread.getAllStackTraces().keySet()) {
if (thread == null) continue;
ClassLoader loader = thread.getContextClassLoader();
if (loader == null) continue;
String name = loader.getClass().getName();
if (logWriter != null) {
logWriter.println("Thread: " + thread.getName() + " -> " + name);
}
if (name.contains("AppClassLoader") ||
name.contains("TransformingClassLoader")) {
return loader;
}
}
return ByteLoader.class.getClassLoader();
}
}
ну или же как лучше дефайнить классы чтоб это не задетектило
Help