Исходник Bludnov Dumper - 1.21.1 Fabric

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
4 Окт 2025
Сообщения
7
Реакции
0
Выберите загрузчик игры
  1. Fabric
BludnovDumper.java:
Expand Collapse Copy
package nick;

import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.loader.impl.launch.knot.Knot;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.tree.ClassNode;
import sun.misc.Unsafe;

import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
import java.util.jar.JarOutputStream;
import java.util.zip.ZipEntry;

public class BludnovDumper implements ClientModInitializer {
    private static Unsafe UNSAFE;

    static {
        try {
            Field f = Unsafe.class.getDeclaredField("theUnsafe");
            f.setAccessible(true);
            UNSAFE = (Unsafe) f.get(null);
        } catch (Throwable _t) {
            _t.printStackTrace(System.err);
        }
    }

    public static <T extends AccessibleObject> T patch(T obj) {
        UNSAFE.putBoolean(obj, 12, true);
        return obj;
    }

    @Override
    @SuppressWarnings("all")
    public void onInitializeClient() {
        Objects.requireNonNull(UNSAFE);
        CompletableFuture.runAsync(() -> {
            try {
                Thread.sleep(15000);

                ClassLoader knot = Knot.getLauncher().getTargetClassLoader();
                Object resourceProvider_inst = patch(knot.getClass().getDeclaredField("resourceProvider")).get(knot);
                Class<?> resourceProvider_klass = resourceProvider_inst.getClass();
                Field rsc = patch(resourceProvider_klass.getDeclaredField("resources"));

                Class<?> encryption = Class.forName("netutil.d");
                Function decrypt_stage0 = (Function) patch(encryption.getDeclaredField("b")).get(null);
                Method decrypt_stage1 = patch(encryption.getDeclaredMethod("b", byte[].class));

                Path output = Paths.get(System.getProperty("user.home"), "Downloads", "bludnov_dumped");
                File jar = new File(System.getProperty("user.home") + "\\Downloads", "bludnov_dump.jar");
                Files.createDirectories(output);

                HashMap<String, byte[]> resources = (HashMap<String, byte[]>) rsc.get(resourceProvider_inst);

                try (JarOutputStream jos = new JarOutputStream(new FileOutputStream(jar))) {
                    resources.forEach((str, data) -> {
                        try {
                            byte[] dec = (byte[]) decrypt_stage0.apply((Object) data);

                            if (dec != null) {
                                data = (byte[]) decrypt_stage1.invoke(null, dec);
                                ClassReader cr = new ClassReader(data);
                                ClassNode cn = new ClassNode();
                                cr.accept(cn, 0);
                                str = cn.name;
                            }

                            ZipEntry ze = new ZipEntry(str);
                            jos.putNextEntry(ze);
                            jos.write(data);
                            jos.closeEntry();
                        } catch (Throwable _t) {
                            _t.printStackTrace(System.err);
                        }
                    });
                }
            } catch (Throwable _t) {
                _t.printStackTrace(System.err);
            }
        });
    }
}
 
зачем нужен он
для автоматического извлечения и распаковки ресурсов (например, классов и других файлов) из внутреннего ресурса лаунчера Minecraft, а затем сохранения их в виде JAR файла на диск, он извлекает все ресурсы, которые лаунчер Minecraft загрузил в память, и сохраняет их в JAR-файл для дальнейшего анализа
 
BludnovDumper.java:
Expand Collapse Copy
package nick;

import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.loader.impl.launch.knot.Knot;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.tree.ClassNode;
import sun.misc.Unsafe;

import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
import java.util.jar.JarOutputStream;
import java.util.zip.ZipEntry;

public class BludnovDumper implements ClientModInitializer {
    private static Unsafe UNSAFE;

    static {
        try {
            Field f = Unsafe.class.getDeclaredField("theUnsafe");
            f.setAccessible(true);
            UNSAFE = (Unsafe) f.get(null);
        } catch (Throwable _t) {
            _t.printStackTrace(System.err);
        }
    }

    public static <T extends AccessibleObject> T patch(T obj) {
        UNSAFE.putBoolean(obj, 12, true);
        return obj;
    }

    @Override
    @SuppressWarnings("all")
    public void onInitializeClient() {
        Objects.requireNonNull(UNSAFE);
        CompletableFuture.runAsync(() -> {
            try {
                Thread.sleep(15000);

                ClassLoader knot = Knot.getLauncher().getTargetClassLoader();
                Object resourceProvider_inst = patch(knot.getClass().getDeclaredField("resourceProvider")).get(knot);
                Class<?> resourceProvider_klass = resourceProvider_inst.getClass();
                Field rsc = patch(resourceProvider_klass.getDeclaredField("resources"));

                Class<?> encryption = Class.forName("netutil.d");
                Function decrypt_stage0 = (Function) patch(encryption.getDeclaredField("b")).get(null);
                Method decrypt_stage1 = patch(encryption.getDeclaredMethod("b", byte[].class));

                Path output = Paths.get(System.getProperty("user.home"), "Downloads", "bludnov_dumped");
                File jar = new File(System.getProperty("user.home") + "\\Downloads", "bludnov_dump.jar");
                Files.createDirectories(output);

                HashMap<String, byte[]> resources = (HashMap<String, byte[]>) rsc.get(resourceProvider_inst);

                try (JarOutputStream jos = new JarOutputStream(new FileOutputStream(jar))) {
                    resources.forEach((str, data) -> {
                        try {
                            byte[] dec = (byte[]) decrypt_stage0.apply((Object) data);

                            if (dec != null) {
                                data = (byte[]) decrypt_stage1.invoke(null, dec);
                                ClassReader cr = new ClassReader(data);
                                ClassNode cn = new ClassNode();
                                cr.accept(cn, 0);
                                str = cn.name;
                            }

                            ZipEntry ze = new ZipEntry(str);
                            jos.putNextEntry(ze);
                            jos.write(data);
                            jos.closeEntry();
                        } catch (Throwable _t) {
                            _t.printStackTrace(System.err);
                        }
                    });
                }
            } catch (Throwable _t) {
                _t.printStackTrace(System.err);
            }
        });
    }
}
топ
 
Назад
Сверху Снизу