Гайд Пересобираем дерьмо(джаву) и делаем крипту [2/2]

Забаненный
Забаненный
Статус
Оффлайн
Регистрация
15 Фев 2025
Сообщения
3
Реакции
1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Всем привет!

Сегодня мы продолжим написание дерьмо защиты, и мы добавим крипту в нашу джаву. Если вы еще не читали прошлую часть то прочитайте.

1*. Для начала мы найдем метод ClassFileParser.cpp и зайдем в метод parse_constant_pool_entries и далее найдем JVM_CONSTANT_Utf8 далее мы увидем utf8_buffer нам нужно его изменить на u1* utf8_buffer = const_cast<u1*>(cfs->current()); далее после строки cfs->skip_u1_fast(utf8_length); мы пишем
code:
Expand Collapse Copy
        if (cfs->custom()) {
          for (int i = 0; i < utf8_length; i++) {
            utf8_buffer[i] -= 5;
          }
      }
но у вас нету метода custom. Сейчас мы его сделаем заходим в класс classFileStream.hpp и после строки static const bool verify; мы пишем bool custom() const; ошибка должна была пропасть. Но мы не реализовали сам метод поэтому мы переходим уже в ClassFileStream.cpp и пишем
method:
Expand Collapse Copy
bool ClassFileStream::custom() const {
  return buffer()[0] != 0xCA && buffer()[1] != 0xFE && buffer()[2] != 0xBA && buffer()[4] != 0xBE;
}
Теперь мы в ClassFileParser.cpp ищем метод parse_stream в нем нам нужно удалить проверку на magic value ибо в будущем мы его будем изменять
delete:
Expand Collapse Copy
  guarantee_property(magic == JAVA_CLASSFILE_MAGIC,
                     "Incompatible magic value %u in class file %s",
                     magic, CHECK);
2*. Далее мы билдим это дерьмо если вы сделали все правильно то должно заработать. После билда мы открываем intellij idea и создаем новый проект с 18 джавой(НЕ НАШЕЙ). И начинаем писать код Создаем 1 класс Main и туда пишем
Main:
Expand Collapse Copy
package omg.sertyo;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class Main {
    private static final ConcurrentHashMap<String, byte[]> files = new ConcurrentHashMap<>();


    public static void main(String[] args) throws IOException {

        ZipFile zip = new ZipFile("input.jar");
        zip.entries().asIterator().forEachRemaining((entry) -> {
            try {
                files.put(entry.getName(), zip.getInputStream(entry).readAllBytes());
            } catch (IOException e) {
                    throw new RuntimeException(e);
            }
        });
        zip.close();
        
        files.forEach((name, data) -> {
            if (isClassFileFormat(name, data)) {
                ClassWriter classWriter = new ClassWriter();
                ClassParser classFile = new ClassParser(new ClassStream(data), classWriter);
                System.out.println("Processing " + name);
                classFile.parse_stream();
                byte[] buffer = classWriter.getByteArrayOutputStream().toByteArray();
                files.put(name, buffer);
            }
        });

        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("output.jar"));
         zos.setLevel(9);
            files.forEach((name, data) -> {
                try {
                    zos.putNextEntry(new ZipEntry(name));
                    zos.write(data);
                    zos.closeEntry();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            });
        

        zos.close();
    } 

    private static boolean isClassFileFormat(String name, byte[] data) {
        return data.length >= 8 && name.endsWith(".class");
    }
}
Теперь нам нужно написать ClassWriter и ClassStream
ClassWriter:
Expand Collapse Copy
package omg.sertyo;

import lombok.SneakyThrows;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.nio.charset.StandardCharsets;

public final class ClassWriter
{
    private final ByteArrayOutputStream stream;
    private final DataOutputStream writer;

    public ClassWriter() {
        this.stream = new ByteArrayOutputStream();
        this.writer = new DataOutputStream(stream);
    }

    @SneakyThrows
    public void writeByte(final int b)  {
        this.writer.write(b);
    }
    @SneakyThrows
    public void writeTag(int b)  {
        this.writer.writeByte(b);
    }
    @SneakyThrows
    public void writeShort(final int v)  {
        this.writer.writeShort(v);
    }
    @SneakyThrows
    public void write(final int v)  {
        this.writer.writeInt(v);
    }
    @SneakyThrows
    public void write(final long v)  {
        this.writer.writeLong(v);
    }
    @SneakyThrows
    public void write(final float v)  {
        this.writer.writeFloat(v);
    }
    @SneakyThrows
    public void write(final double v)  {
        this.writer.writeDouble(v);
    }
    @SneakyThrows
    public void utf(String string)  {
        byte[] data = string.getBytes(StandardCharsets.UTF_8);
        for (int i = 0; i < data.length; i++) {
            data[i] += 5;
        }
        this.writer.writeShort(data.length);
        this.writer.write(data);
    }
    @SneakyThrows
    public void writeclass(ClassWriter classWriter){
        writer.write(classWriter.getByteArrayOutputStream().toByteArray());
    }
    @SneakyThrows
    public void writebytes(byte[] bytes) {
     writer.write(bytes);
    }
    public ByteArrayOutputStream getByteArrayOutputStream() {
        return this.stream;
    }
}

ClassStream:
Expand Collapse Copy
package omg.sertyo;

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class ClassStream {
    private final DataInputStream reader;

    public ClassStream(byte[] buf) {
        this.reader = new DataInputStream(new ByteArrayInputStream(buf));
    }

    public int readByte() throws IOException {
        return reader.read();
    }

    public int readShort() throws IOException {
        return this.reader.readShort();
    }

    public int readInt() throws IOException {
        return this.reader.readInt();
    }

    public long readLong() throws IOException {
        return this.reader.readLong();
    }

    public float readFloat() throws IOException {
        return this.reader.readFloat();
    }

    public double readDouble() throws IOException {
        return this.reader.readDouble();
    }

    public String readUTF() throws IOException {
        final byte[] array = new byte[this.reader.readUnsignedShort()];
        this.reader.readFully(array);
        return new String(array, StandardCharsets.UTF_8);
    }

    public DataInputStream getReader() {
        return reader;
    }
}
Ну и теперь самое страшное ClassParser p.s я убил на эту залупу дохуя времени

ClassParser:
Expand Collapse Copy
package omg.sertyo;

import lombok.SneakyThrows;

public class ClassParser {

    private final ClassStream classStream;
    private final ClassWriter classWriter;

    public ClassParser(ClassStream classStream, final ClassWriter classWriter) {
        this.classStream = classStream;
        this.classWriter = classWriter;
    }
    int magic;
    int magic2;
    int magic3;
    int magic4;
    @SneakyThrows
    public void parse_stream() {
        //Parse magic
        magic = this.classStream.readByte();
        magic2 = this.classStream.readByte();
        magic3 = this.classStream.readByte();
        magic4 = this.classStream.readByte();
        //Set custom
        magic = 0xDE;
        magic2 = 0xAD;
        magic3 = 0xBE;
        magic4 = 0xEF;
        ClassWriter magicwriter = new ClassWriter();
        magicwriter.writeByte(magic);
        magicwriter.writeByte(magic2);
        magicwriter.writeByte(magic3);
        magicwriter.writeByte(magic4);
        //Set magic value
        classWriter.writeclass(magicwriter);
        //minor and major
        classWriter.writeShort(classStream.readShort());
        classWriter.writeShort(classStream.readShort());

        //constant pool
        final int conspool = classStream.readShort();
        classWriter.writeShort(conspool);
        parseConstant(conspool);

        //flags
        classWriter.writeShort(classStream.readShort());
        // class index
        classWriter.writeShort(classStream.readShort());
        //super class
        classWriter.writeShort(classStream.readShort());
        //class interface
        int interfacesSize = classStream.readShort();
        classWriter.writeShort(interfacesSize);
        for (int i = 0; i < interfacesSize; i++) {
            classWriter.writeShort(classStream.readShort());
        }
        //others
        classWriter.writebytes(classStream.getReader().readAllBytes());
    }
    @SneakyThrows
    void parseConstant(final int length) {
        for (int i = 1; i < length; ++i) {
            final int consttag = classStream.readByte();
            classWriter.writeTag(consttag);

            switch (consttag) {
                case 7: // JVM_CONSTANT_Class
                    classWriter.writeShort(classStream.readShort());
                    break;
                case 8: // JVM_CONSTANT_String
                    classWriter.writeShort(classStream.readShort());
                    break;
                case 9: // JVM_CONSTANT_Fieldref
                    final int shortfield = classStream.readShort();
                    final int shortfield2 = classStream.readShort();
                    classWriter.writeShort(shortfield);
                    classWriter.writeShort(shortfield2);
                    break;
                case 11: // JVM_CONSTANT_InterfaceMethodref
                    final int shortinterface = classStream.readShort();
                    final int shortinterface2 = classStream.readShort();
                    classWriter.writeShort(shortinterface);
                    classWriter.writeShort(shortinterface2);
                    break;
                case 10: // JVM_CONSTANT_Methodref
                    final int shortmethod = classStream.readShort();
                    final int shortmethod2 = classStream.readShort();
                    classWriter.writeShort(shortmethod);
                    classWriter.writeShort(shortmethod2);
                    break;
                case 12: // JVM_CONSTANT_NameAndType
                    final int shortname = classStream.readShort();
                    final int shortname2 = classStream.readShort();
                    classWriter.writeShort(shortname);
                    classWriter.writeShort(shortname2);
                    break;
                case 15: // JVM_CONSTANT_MethodHandle
                    final int bytemethod = classStream.readByte();
                    final int shortmethodhanle = classStream.readShort();
                    classWriter.writeByte(bytemethod);
                    classWriter.writeShort(shortmethodhanle);
                    break;
                case 16: // JVM_CONSTANT_MethodType
                    classWriter.writeShort(classStream.readShort());
                    break;
                case 17: // JVM_CONSTANT_Dynamic
                    final int shortdynamic = classStream.readShort();
                    final int shortdynamic2 = classStream.readShort();
                    classWriter.writeShort(shortdynamic);
                    classWriter.writeShort(shortdynamic2);
                    break;
                case 18: // JVM_CONSTANT_InvokeDynamic
                    final int shortinvoke = classStream.readShort();
                    final int shortinvoke2 = classStream.readShort();
                    classWriter.writeShort(shortinvoke);
                    classWriter.writeShort(shortinvoke2);
                    break;
                case 3: // JVM_CONSTANT_Integer
                    classWriter.write(classStream.readInt());
                    break;
                case 4: // JVM_CONSTANT_Float
                    classWriter.write(classStream.readFloat());
                    break;
                case 5: // JVM_CONSTANT_Long
                    classWriter.write(classStream.readLong());
                    ++i; // Long занимает два индекса
                    break;
                case 6: // JVM_CONSTANT_Double
                    classWriter.write(classStream.readDouble());
                    ++i; // Double занимает два индекса
                    break;
                case 1: // JVM_CONSTANT_Utf8
                    String[] utf = new String[length];

                    String readUTF = classStream.readUTF();
                    utf[i] = readUTF;
                    classWriter.utf(readUTF);
                    break;
                case 19: // JVM_CONSTANT_Module
                    classWriter.writeShort(classStream.readShort());
                    break;
                case 20: // JVM_CONSTANT_Package
                    classWriter.writeShort(classStream.readShort());
                    break;
                default:
                    System.out.println("Unknown constant pool tag: " + consttag);
            }
        }
    }
}
Теперь мы находим любую джарку и тестим на ней. Запускаем Если вы сделали все правильно то у вас не будет ошибок и будет в консоле что то по типу
Processing Main.class
Сразу скажу тут будут ваши классы у меня 1 класс далее мы тестим наше дерьмо с помощью кастомной джавы поидее все должно запускаться без проблем если будут какие то ошибки проблемы (не тупые пишите в дс sertyo1337)
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Всем привет!

Сегодня мы продолжим написание дерьмо защиты, и мы добавим крипту в нашу джаву. Если вы еще не читали прошлую часть то прочитайте.

1*. Для начала мы найдем метод ClassFileParser.cpp и зайдем в метод parse_constant_pool_entries и далее найдем JVM_CONSTANT_Utf8 далее мы увидем utf8_buffer нам нужно его изменить на u1* utf8_buffer = const_cast<u1*>(cfs->current()); далее после строки cfs->skip_u1_fast(utf8_length); мы пишем
code:
Expand Collapse Copy
        if (cfs->custom()) {
          for (int i = 0; i < utf8_length; i++) {
            utf8_buffer[i] -= 5;
          }
      }
но у вас нету метода custom. Сейчас мы его сделаем заходим в класс classFileStream.hpp и после строки static const bool verify; мы пишем bool custom() const; ошибка должна была пропасть. Но мы не реализовали сам метод поэтому мы переходим уже в ClassFileStream.cpp и пишем
method:
Expand Collapse Copy
bool ClassFileStream::custom() const {
  return buffer()[0] != 0xCA && buffer()[1] != 0xFE && buffer()[2] != 0xBA && buffer()[4] != 0xBE;
}
Теперь мы в ClassFileParser.cpp ищем метод parse_stream в нем нам нужно удалить проверку на magic value ибо в будущем мы его будем изменять
delete:
Expand Collapse Copy
  guarantee_property(magic == JAVA_CLASSFILE_MAGIC,
                     "Incompatible magic value %u in class file %s",
                     magic, CHECK);
2*. Далее мы билдим это дерьмо если вы сделали все правильно то должно заработать. После билда мы открываем intellij idea и создаем новый проект с 18 джавой(НЕ НАШЕЙ). И начинаем писать код Создаем 1 класс Main и туда пишем
Main:
Expand Collapse Copy
package omg.sertyo;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class Main {
    private static final ConcurrentHashMap<String, byte[]> files = new ConcurrentHashMap<>();


    public static void main(String[] args) throws IOException {

        ZipFile zip = new ZipFile("input.jar");
        zip.entries().asIterator().forEachRemaining((entry) -> {
            try {
                files.put(entry.getName(), zip.getInputStream(entry).readAllBytes());
            } catch (IOException e) {
                    throw new RuntimeException(e);
            }
        });
        zip.close();
       
        files.forEach((name, data) -> {
            if (isClassFileFormat(name, data)) {
                ClassWriter classWriter = new ClassWriter();
                ClassParser classFile = new ClassParser(new ClassStream(data), classWriter);
                System.out.println("Processing " + name);
                classFile.parse_stream();
                byte[] buffer = classWriter.getByteArrayOutputStream().toByteArray();
                files.put(name, buffer);
            }
        });

        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("output.jar"));
         zos.setLevel(9);
            files.forEach((name, data) -> {
                try {
                    zos.putNextEntry(new ZipEntry(name));
                    zos.write(data);
                    zos.closeEntry();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            });
       

        zos.close();
    }

    private static boolean isClassFileFormat(String name, byte[] data) {
        return data.length >= 8 && name.endsWith(".class");
    }
}
Теперь нам нужно написать ClassWriter и ClassStream
ClassWriter:
Expand Collapse Copy
package omg.sertyo;

import lombok.SneakyThrows;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.nio.charset.StandardCharsets;

public final class ClassWriter
{
    private final ByteArrayOutputStream stream;
    private final DataOutputStream writer;

    public ClassWriter() {
        this.stream = new ByteArrayOutputStream();
        this.writer = new DataOutputStream(stream);
    }

    @SneakyThrows
    public void writeByte(final int b)  {
        this.writer.write(b);
    }
    @SneakyThrows
    public void writeTag(int b)  {
        this.writer.writeByte(b);
    }
    @SneakyThrows
    public void writeShort(final int v)  {
        this.writer.writeShort(v);
    }
    @SneakyThrows
    public void write(final int v)  {
        this.writer.writeInt(v);
    }
    @SneakyThrows
    public void write(final long v)  {
        this.writer.writeLong(v);
    }
    @SneakyThrows
    public void write(final float v)  {
        this.writer.writeFloat(v);
    }
    @SneakyThrows
    public void write(final double v)  {
        this.writer.writeDouble(v);
    }
    @SneakyThrows
    public void utf(String string)  {
        byte[] data = string.getBytes(StandardCharsets.UTF_8);
        for (int i = 0; i < data.length; i++) {
            data[i] += 5;
        }
        this.writer.writeShort(data.length);
        this.writer.write(data);
    }
    @SneakyThrows
    public void writeclass(ClassWriter classWriter){
        writer.write(classWriter.getByteArrayOutputStream().toByteArray());
    }
    @SneakyThrows
    public void writebytes(byte[] bytes) {
     writer.write(bytes);
    }
    public ByteArrayOutputStream getByteArrayOutputStream() {
        return this.stream;
    }
}

ClassStream:
Expand Collapse Copy
package omg.sertyo;

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class ClassStream {
    private final DataInputStream reader;

    public ClassStream(byte[] buf) {
        this.reader = new DataInputStream(new ByteArrayInputStream(buf));
    }

    public int readByte() throws IOException {
        return reader.read();
    }

    public int readShort() throws IOException {
        return this.reader.readShort();
    }

    public int readInt() throws IOException {
        return this.reader.readInt();
    }

    public long readLong() throws IOException {
        return this.reader.readLong();
    }

    public float readFloat() throws IOException {
        return this.reader.readFloat();
    }

    public double readDouble() throws IOException {
        return this.reader.readDouble();
    }

    public String readUTF() throws IOException {
        final byte[] array = new byte[this.reader.readUnsignedShort()];
        this.reader.readFully(array);
        return new String(array, StandardCharsets.UTF_8);
    }

    public DataInputStream getReader() {
        return reader;
    }
}
Ну и теперь самое страшное ClassParser p.s я убил на эту залупу дохуя времени

ClassParser:
Expand Collapse Copy
package omg.sertyo;

import lombok.SneakyThrows;

public class ClassParser {

    private final ClassStream classStream;
    private final ClassWriter classWriter;

    public ClassParser(ClassStream classStream, final ClassWriter classWriter) {
        this.classStream = classStream;
        this.classWriter = classWriter;
    }
    int magic;
    int magic2;
    int magic3;
    int magic4;
    @SneakyThrows
    public void parse_stream() {
        //Parse magic
        magic = this.classStream.readByte();
        magic2 = this.classStream.readByte();
        magic3 = this.classStream.readByte();
        magic4 = this.classStream.readByte();
        //Set custom
        magic = 0xDE;
        magic2 = 0xAD;
        magic3 = 0xBE;
        magic4 = 0xEF;
        ClassWriter magicwriter = new ClassWriter();
        magicwriter.writeByte(magic);
        magicwriter.writeByte(magic2);
        magicwriter.writeByte(magic3);
        magicwriter.writeByte(magic4);
        //Set magic value
        classWriter.writeclass(magicwriter);
        //minor and major
        classWriter.writeShort(classStream.readShort());
        classWriter.writeShort(classStream.readShort());

        //constant pool
        final int conspool = classStream.readShort();
        classWriter.writeShort(conspool);
        parseConstant(conspool);

        //flags
        classWriter.writeShort(classStream.readShort());
        // class index
        classWriter.writeShort(classStream.readShort());
        //super class
        classWriter.writeShort(classStream.readShort());
        //class interface
        int interfacesSize = classStream.readShort();
        classWriter.writeShort(interfacesSize);
        for (int i = 0; i < interfacesSize; i++) {
            classWriter.writeShort(classStream.readShort());
        }
        //others
        classWriter.writebytes(classStream.getReader().readAllBytes());
    }
    @SneakyThrows
    void parseConstant(final int length) {
        for (int i = 1; i < length; ++i) {
            final int consttag = classStream.readByte();
            classWriter.writeTag(consttag);

            switch (consttag) {
                case 7: // JVM_CONSTANT_Class
                    classWriter.writeShort(classStream.readShort());
                    break;
                case 8: // JVM_CONSTANT_String
                    classWriter.writeShort(classStream.readShort());
                    break;
                case 9: // JVM_CONSTANT_Fieldref
                    final int shortfield = classStream.readShort();
                    final int shortfield2 = classStream.readShort();
                    classWriter.writeShort(shortfield);
                    classWriter.writeShort(shortfield2);
                    break;
                case 11: // JVM_CONSTANT_InterfaceMethodref
                    final int shortinterface = classStream.readShort();
                    final int shortinterface2 = classStream.readShort();
                    classWriter.writeShort(shortinterface);
                    classWriter.writeShort(shortinterface2);
                    break;
                case 10: // JVM_CONSTANT_Methodref
                    final int shortmethod = classStream.readShort();
                    final int shortmethod2 = classStream.readShort();
                    classWriter.writeShort(shortmethod);
                    classWriter.writeShort(shortmethod2);
                    break;
                case 12: // JVM_CONSTANT_NameAndType
                    final int shortname = classStream.readShort();
                    final int shortname2 = classStream.readShort();
                    classWriter.writeShort(shortname);
                    classWriter.writeShort(shortname2);
                    break;
                case 15: // JVM_CONSTANT_MethodHandle
                    final int bytemethod = classStream.readByte();
                    final int shortmethodhanle = classStream.readShort();
                    classWriter.writeByte(bytemethod);
                    classWriter.writeShort(shortmethodhanle);
                    break;
                case 16: // JVM_CONSTANT_MethodType
                    classWriter.writeShort(classStream.readShort());
                    break;
                case 17: // JVM_CONSTANT_Dynamic
                    final int shortdynamic = classStream.readShort();
                    final int shortdynamic2 = classStream.readShort();
                    classWriter.writeShort(shortdynamic);
                    classWriter.writeShort(shortdynamic2);
                    break;
                case 18: // JVM_CONSTANT_InvokeDynamic
                    final int shortinvoke = classStream.readShort();
                    final int shortinvoke2 = classStream.readShort();
                    classWriter.writeShort(shortinvoke);
                    classWriter.writeShort(shortinvoke2);
                    break;
                case 3: // JVM_CONSTANT_Integer
                    classWriter.write(classStream.readInt());
                    break;
                case 4: // JVM_CONSTANT_Float
                    classWriter.write(classStream.readFloat());
                    break;
                case 5: // JVM_CONSTANT_Long
                    classWriter.write(classStream.readLong());
                    ++i; // Long занимает два индекса
                    break;
                case 6: // JVM_CONSTANT_Double
                    classWriter.write(classStream.readDouble());
                    ++i; // Double занимает два индекса
                    break;
                case 1: // JVM_CONSTANT_Utf8
                    String[] utf = new String[length];

                    String readUTF = classStream.readUTF();
                    utf[i] = readUTF;
                    classWriter.utf(readUTF);
                    break;
                case 19: // JVM_CONSTANT_Module
                    classWriter.writeShort(classStream.readShort());
                    break;
                case 20: // JVM_CONSTANT_Package
                    classWriter.writeShort(classStream.readShort());
                    break;
                default:
                    System.out.println("Unknown constant pool tag: " + consttag);
            }
        }
    }
}
Теперь мы находим любую джарку и тестим на ней. Запускаем Если вы сделали все правильно то у вас не будет ошибок и будет в консоле что то по типу
Processing Main.class
Сразу скажу тут будут ваши классы у меня 1 класс далее мы тестим наше дерьмо с помощью кастомной джавы поидее все должно запускаться без проблем если будут какие то ошибки проблемы (не тупые пишите в дс sertyo1337)
оо да, у сертио 3 акк
Всем привет!

Сегодня мы продолжим написание дерьмо защиты, и мы добавим крипту в нашу джаву. Если вы еще не читали прошлую часть то прочитайте.

1*. Для начала мы найдем метод ClassFileParser.cpp и зайдем в метод parse_constant_pool_entries и далее найдем JVM_CONSTANT_Utf8 далее мы увидем utf8_buffer нам нужно его изменить на u1* utf8_buffer = const_cast<u1*>(cfs->current()); далее после строки cfs->skip_u1_fast(utf8_length); мы пишем
code:
Expand Collapse Copy
        if (cfs->custom()) {
          for (int i = 0; i < utf8_length; i++) {
            utf8_buffer[i] -= 5;
          }
      }
но у вас нету метода custom. Сейчас мы его сделаем заходим в класс classFileStream.hpp и после строки static const bool verify; мы пишем bool custom() const; ошибка должна была пропасть. Но мы не реализовали сам метод поэтому мы переходим уже в ClassFileStream.cpp и пишем
method:
Expand Collapse Copy
bool ClassFileStream::custom() const {
  return buffer()[0] != 0xCA && buffer()[1] != 0xFE && buffer()[2] != 0xBA && buffer()[4] != 0xBE;
}
Теперь мы в ClassFileParser.cpp ищем метод parse_stream в нем нам нужно удалить проверку на magic value ибо в будущем мы его будем изменять
delete:
Expand Collapse Copy
  guarantee_property(magic == JAVA_CLASSFILE_MAGIC,
                     "Incompatible magic value %u in class file %s",
                     magic, CHECK);
2*. Далее мы билдим это дерьмо если вы сделали все правильно то должно заработать. После билда мы открываем intellij idea и создаем новый проект с 18 джавой(НЕ НАШЕЙ). И начинаем писать код Создаем 1 класс Main и туда пишем
Main:
Expand Collapse Copy
package omg.sertyo;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class Main {
    private static final ConcurrentHashMap<String, byte[]> files = new ConcurrentHashMap<>();


    public static void main(String[] args) throws IOException {

        ZipFile zip = new ZipFile("input.jar");
        zip.entries().asIterator().forEachRemaining((entry) -> {
            try {
                files.put(entry.getName(), zip.getInputStream(entry).readAllBytes());
            } catch (IOException e) {
                    throw new RuntimeException(e);
            }
        });
        zip.close();
       
        files.forEach((name, data) -> {
            if (isClassFileFormat(name, data)) {
                ClassWriter classWriter = new ClassWriter();
                ClassParser classFile = new ClassParser(new ClassStream(data), classWriter);
                System.out.println("Processing " + name);
                classFile.parse_stream();
                byte[] buffer = classWriter.getByteArrayOutputStream().toByteArray();
                files.put(name, buffer);
            }
        });

        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("output.jar"));
         zos.setLevel(9);
            files.forEach((name, data) -> {
                try {
                    zos.putNextEntry(new ZipEntry(name));
                    zos.write(data);
                    zos.closeEntry();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            });
       

        zos.close();
    }

    private static boolean isClassFileFormat(String name, byte[] data) {
        return data.length >= 8 && name.endsWith(".class");
    }
}
Теперь нам нужно написать ClassWriter и ClassStream
ClassWriter:
Expand Collapse Copy
package omg.sertyo;

import lombok.SneakyThrows;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.nio.charset.StandardCharsets;

public final class ClassWriter
{
    private final ByteArrayOutputStream stream;
    private final DataOutputStream writer;

    public ClassWriter() {
        this.stream = new ByteArrayOutputStream();
        this.writer = new DataOutputStream(stream);
    }

    @SneakyThrows
    public void writeByte(final int b)  {
        this.writer.write(b);
    }
    @SneakyThrows
    public void writeTag(int b)  {
        this.writer.writeByte(b);
    }
    @SneakyThrows
    public void writeShort(final int v)  {
        this.writer.writeShort(v);
    }
    @SneakyThrows
    public void write(final int v)  {
        this.writer.writeInt(v);
    }
    @SneakyThrows
    public void write(final long v)  {
        this.writer.writeLong(v);
    }
    @SneakyThrows
    public void write(final float v)  {
        this.writer.writeFloat(v);
    }
    @SneakyThrows
    public void write(final double v)  {
        this.writer.writeDouble(v);
    }
    @SneakyThrows
    public void utf(String string)  {
        byte[] data = string.getBytes(StandardCharsets.UTF_8);
        for (int i = 0; i < data.length; i++) {
            data[i] += 5;
        }
        this.writer.writeShort(data.length);
        this.writer.write(data);
    }
    @SneakyThrows
    public void writeclass(ClassWriter classWriter){
        writer.write(classWriter.getByteArrayOutputStream().toByteArray());
    }
    @SneakyThrows
    public void writebytes(byte[] bytes) {
     writer.write(bytes);
    }
    public ByteArrayOutputStream getByteArrayOutputStream() {
        return this.stream;
    }
}

ClassStream:
Expand Collapse Copy
package omg.sertyo;

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class ClassStream {
    private final DataInputStream reader;

    public ClassStream(byte[] buf) {
        this.reader = new DataInputStream(new ByteArrayInputStream(buf));
    }

    public int readByte() throws IOException {
        return reader.read();
    }

    public int readShort() throws IOException {
        return this.reader.readShort();
    }

    public int readInt() throws IOException {
        return this.reader.readInt();
    }

    public long readLong() throws IOException {
        return this.reader.readLong();
    }

    public float readFloat() throws IOException {
        return this.reader.readFloat();
    }

    public double readDouble() throws IOException {
        return this.reader.readDouble();
    }

    public String readUTF() throws IOException {
        final byte[] array = new byte[this.reader.readUnsignedShort()];
        this.reader.readFully(array);
        return new String(array, StandardCharsets.UTF_8);
    }

    public DataInputStream getReader() {
        return reader;
    }
}
Ну и теперь самое страшное ClassParser p.s я убил на эту залупу дохуя времени

ClassParser:
Expand Collapse Copy
package omg.sertyo;

import lombok.SneakyThrows;

public class ClassParser {

    private final ClassStream classStream;
    private final ClassWriter classWriter;

    public ClassParser(ClassStream classStream, final ClassWriter classWriter) {
        this.classStream = classStream;
        this.classWriter = classWriter;
    }
    int magic;
    int magic2;
    int magic3;
    int magic4;
    @SneakyThrows
    public void parse_stream() {
        //Parse magic
        magic = this.classStream.readByte();
        magic2 = this.classStream.readByte();
        magic3 = this.classStream.readByte();
        magic4 = this.classStream.readByte();
        //Set custom
        magic = 0xDE;
        magic2 = 0xAD;
        magic3 = 0xBE;
        magic4 = 0xEF;
        ClassWriter magicwriter = new ClassWriter();
        magicwriter.writeByte(magic);
        magicwriter.writeByte(magic2);
        magicwriter.writeByte(magic3);
        magicwriter.writeByte(magic4);
        //Set magic value
        classWriter.writeclass(magicwriter);
        //minor and major
        classWriter.writeShort(classStream.readShort());
        classWriter.writeShort(classStream.readShort());

        //constant pool
        final int conspool = classStream.readShort();
        classWriter.writeShort(conspool);
        parseConstant(conspool);

        //flags
        classWriter.writeShort(classStream.readShort());
        // class index
        classWriter.writeShort(classStream.readShort());
        //super class
        classWriter.writeShort(classStream.readShort());
        //class interface
        int interfacesSize = classStream.readShort();
        classWriter.writeShort(interfacesSize);
        for (int i = 0; i < interfacesSize; i++) {
            classWriter.writeShort(classStream.readShort());
        }
        //others
        classWriter.writebytes(classStream.getReader().readAllBytes());
    }
    @SneakyThrows
    void parseConstant(final int length) {
        for (int i = 1; i < length; ++i) {
            final int consttag = classStream.readByte();
            classWriter.writeTag(consttag);

            switch (consttag) {
                case 7: // JVM_CONSTANT_Class
                    classWriter.writeShort(classStream.readShort());
                    break;
                case 8: // JVM_CONSTANT_String
                    classWriter.writeShort(classStream.readShort());
                    break;
                case 9: // JVM_CONSTANT_Fieldref
                    final int shortfield = classStream.readShort();
                    final int shortfield2 = classStream.readShort();
                    classWriter.writeShort(shortfield);
                    classWriter.writeShort(shortfield2);
                    break;
                case 11: // JVM_CONSTANT_InterfaceMethodref
                    final int shortinterface = classStream.readShort();
                    final int shortinterface2 = classStream.readShort();
                    classWriter.writeShort(shortinterface);
                    classWriter.writeShort(shortinterface2);
                    break;
                case 10: // JVM_CONSTANT_Methodref
                    final int shortmethod = classStream.readShort();
                    final int shortmethod2 = classStream.readShort();
                    classWriter.writeShort(shortmethod);
                    classWriter.writeShort(shortmethod2);
                    break;
                case 12: // JVM_CONSTANT_NameAndType
                    final int shortname = classStream.readShort();
                    final int shortname2 = classStream.readShort();
                    classWriter.writeShort(shortname);
                    classWriter.writeShort(shortname2);
                    break;
                case 15: // JVM_CONSTANT_MethodHandle
                    final int bytemethod = classStream.readByte();
                    final int shortmethodhanle = classStream.readShort();
                    classWriter.writeByte(bytemethod);
                    classWriter.writeShort(shortmethodhanle);
                    break;
                case 16: // JVM_CONSTANT_MethodType
                    classWriter.writeShort(classStream.readShort());
                    break;
                case 17: // JVM_CONSTANT_Dynamic
                    final int shortdynamic = classStream.readShort();
                    final int shortdynamic2 = classStream.readShort();
                    classWriter.writeShort(shortdynamic);
                    classWriter.writeShort(shortdynamic2);
                    break;
                case 18: // JVM_CONSTANT_InvokeDynamic
                    final int shortinvoke = classStream.readShort();
                    final int shortinvoke2 = classStream.readShort();
                    classWriter.writeShort(shortinvoke);
                    classWriter.writeShort(shortinvoke2);
                    break;
                case 3: // JVM_CONSTANT_Integer
                    classWriter.write(classStream.readInt());
                    break;
                case 4: // JVM_CONSTANT_Float
                    classWriter.write(classStream.readFloat());
                    break;
                case 5: // JVM_CONSTANT_Long
                    classWriter.write(classStream.readLong());
                    ++i; // Long занимает два индекса
                    break;
                case 6: // JVM_CONSTANT_Double
                    classWriter.write(classStream.readDouble());
                    ++i; // Double занимает два индекса
                    break;
                case 1: // JVM_CONSTANT_Utf8
                    String[] utf = new String[length];

                    String readUTF = classStream.readUTF();
                    utf[i] = readUTF;
                    classWriter.utf(readUTF);
                    break;
                case 19: // JVM_CONSTANT_Module
                    classWriter.writeShort(classStream.readShort());
                    break;
                case 20: // JVM_CONSTANT_Package
                    classWriter.writeShort(classStream.readShort());
                    break;
                default:
                    System.out.println("Unknown constant pool tag: " + consttag);
            }
        }
    }
}
Теперь мы находим любую джарку и тестим на ней. Запускаем Если вы сделали все правильно то у вас не будет ошибок и будет в консоле что то по типу
Processing Main.class
Сразу скажу тут будут ваши классы у меня 1 класс далее мы тестим наше дерьмо с помощью кастомной джавы поидее все должно запускаться без проблем если будут какие то ошибки проблемы (не тупые пишите в дс sertyo1337)
ты че еблан байт 5, сделай 0xUWU
 
практически абсолютно мусорная тема.
1. ужасный код
2. 0 объяснений того, что ты конкретно делаешь, где и зачем

не понимаю, откуда вы вылезаете и зачем, вы ведь даже код не умеете писать так, чтобы это не выглядело как кусок дерьма

bool ClassFileStream::custom() const { return buffer()[0] != 0xCA && buffer()[1] != 0xFE && buffer()[2] != 0xBA && buffer()[4] != 0xBE; }

название функции и реализация - дерьмо. почему это меджик обязательно не должен иметь хоть один байт дефолт меджика? достаточно просто всё тут заменить на ||
обнаружение того, что класс был "обфусцирован" можно как угодно придумать и реализовать, но ты выбрал самый простой и самый бросающийся в глаза метод

int magic; int magic2; int magic3; int magic4;
//Parse magic magic = this.classStream.readByte(); magic2 = this.classStream.readByte(); magic3 = this.classStream.readByte(); magic4 = this.classStream.readByte(); //Set custom magic = 0xDE; magic2 = 0xAD; magic3 = 0xBE; magic4 = 0xEF;

тут вообще без комментариев..
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
практически абсолютно мусорная тема.
1. ужасный код
2. 0 объяснений того, что ты конкретно делаешь, где и зачем

не понимаю, откуда вы вылезаете и зачем, вы ведь даже код не умеете писать так, чтобы это не выглядело как кусок дерьма



название функции и реализация - дерьмо. почему это меджик обязательно не должен иметь хоть один байт дефолт меджика? достаточно просто всё тут заменить на ||
обнаружение того, что класс был "обфусцирован" можно как угодно придумать и реализовать, но ты выбрал самый простой и самый бросающийся в глаза метод




тут вообще без комментариев..
он на дмке портил топовый криптер, он специально хуевый написал чтобы люди не делали недо проты
 
он на дмке портил топовый криптер, он специально хуевый написал чтобы люди не делали недо проты
в чем смысл? школьники не смогут написать что-то реально хорошее, только если не делать всю работу за них
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
в чем смысл? школьники не смогут написать что-то реально хорошее, только если не делать всю работу за них
док-во:
Screenshot_20250215-174413.jpg
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ты осуждаешь его ник?)
не то чтобы, будто мне не должно быть похуй
ты скинул сообщения - я увидел, кринжанул, подметил. ничего более
секретная хуйня, которую я не буду здесь цитировать, мб мне по шапке за это прилетит потому-что
во первых, ты же понимаешь, что хайдить свои сообщения не имеет смысла? ты уже двумя темами насрал, твоя репутация на этом окончена
а во вторых, ты просто берешь, читаешь байты меджика, а потом не используя эти байты врайтишь в эти же переменные) вопрос, нахуя ты читал тогда? если дело в том, что рид стрим не пойдет дальше из-за этого, то можно было бы просто написать фор-луп, который бы выглядел всё так же немного уебищно, но лучше, чем то что ты сделал
 
Назад
Сверху Снизу