• Я зарабатываю 100 000 RUB / месяц на этом сайте!

    А знаешь как? Я всего-лишь публикую (создаю темы), а админ мне платит. Трачу деньги на мороженое, робуксы и сервера в Minecraft. А ещё на паль из Китая. 

    Хочешь так же? Пиши и узнавай условия: https://t.me/alex_redact
    Реклама: https://t.me/yougame_official

Вопрос С++ jni cheat

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
11 Авг 2024
Сообщения
36
Реакции
2
Делаю свой c++ чит на Fabric/Fabric/Vanilla 1.21.1
Для теста сделал пару функций, таких как получение моих координат и хп, и вот в чем проблема, на ваниле все работает замечательно, а вот на forge или fabric у меня метод getInstance в Minecraft классе возвращает null

GetMinecraftInstance:
Expand Collapse Copy
jobject getMinecraftInstance(JNIEnv* env) {

    jclass minecraftClass = env->FindClass(classes::Minecraft::name); \\fgo
    if (!minecraftClass) {
        std::cout << "[ERROR] Minecraft class not found" << std::endl;
        return nullptr;
    }

    jmethodID getInstance = env->GetStaticMethodID(
        minecraftClass,
        "Q",
        "()Lfgo;"
    );

    if (!getInstance) {
        std::cout << "[ERROR] Minecraft.getInstance not found" << std::endl;
        return nullptr;
    }

    return env->CallStaticObjectMethod(minecraftClass, getInstance);
}

То есть все классы он находит, с этим проблем нет, класс Minecraft -> jclass minecraftClass = env->FindClass(classes::Minecraft::name);
метод getInstance -> jmethodID getInstance = env->GetStaticMethodID(minecraftClass, "Q", "()Levi;"); классы находит, но вот когда я вызываю этот метод getIntance
return env->CallStaticObjectMethod(minecraftClass, getInstance);
то есть если я попробую вызвать: jobject minecraftInstance = getMinecraftInstance(g_env);
то он возвращает null:
if (!minecraftInstance) {
std::cout << "[ERROR] Minecraft instance not found" << std::endl; \\СРАБАТЫВАЕТ Minecraft instance not found
return;
}
Что делать, может кто нибудь знает? почему на ваниле все замечательно, а на фордже или фабрике жопа.

Пробовал вообще все, не обф классы по типу: net/..../client/Minecraft не находит, как и field, m_91087_, тоже не находит. Работает только стандартная обфускация по типу evi.O, fgo.Q


Скину мапинги,
Посмотреть вложение 314400
Minecraft -> fgo
Minecraft.getInstance: -> fgo.Q
return_type: n.m.c.Minecraft -> fgo (Minecraft - fgo)
name: getInstance()
obf_name: Q()

Помогите, умные люди, пж)
 

Вложения

  • 1756383251606.png
    1756383251606.png
    40.7 KB · Просмотры: 82
Попробовал:
C++:
Expand Collapse Copy
    jobject getClassLoader(JNIEnv* jniEnv) {
        jobject targetClassLoader = NULL;
        typedef jobjectArray(JNICALL* JVM_GetAllThreads)(JNIEnv* env, jclass dummy);
        JVM_GetAllThreads getAllThreads = (JVM_GetAllThreads)GetProcAddress(GetModuleHandleA("jvm.dll"), "JVM_GetAllThreads");
        jobjectArray threadsArray = getAllThreads(jniEnv, NULL);
        int threadsCount = jniEnv->GetArrayLength(threadsArray);
        for (int i = 0; i < threadsCount; i++) {
            jobject thread = jniEnv->GetObjectArrayElement(threadsArray, i);
            jclass thread_class = jniEnv->FindClass("java/lang/Thread");
            jmethodID getName = jniEnv->GetMethodID(thread_class, "getName", "()Ljava/lang/String;");
            jfieldID ctxClsLoader = jniEnv->GetFieldID(thread_class, "contextClassLoader", "Ljava/lang/ClassLoader;");
            jobject classLoader = jniEnv->GetObjectField(thread, ctxClsLoader);
            targetClassLoader = classLoader;
            
        }
        return targetClassLoader;
    }
    
    jclass getObject(JNIEnv* env, const char* className)
    {
        jstring name = env->NewStringUTF(className);
        cout << "name: " << name << endl;
    
        jobject classLoader = getClassLoader(env);
        cout << "classLoader: " << classLoader << endl;
    
        jmethodID mid = env->GetMethodID(env->GetObjectClass(classLoader), "findClass", "(Ljava/lang/String;)Ljava/lang/Class;");
        cout << "mid: " << mid << endl;
    
        return (jclass)env->CallObjectMethod(classLoader, mid, name);
        env->DeleteLocalRef(name);
    
    }
все так же, класс находит, GetMethodID возвращает null
 
Пробовал вообще все, не обф классы по типу: net/..../client/Minecraft не находит
Там вместо слешей точки по идее должны быть

А вообще попробуй вместо метода достать поле которое возвращает getMinecraft() напрямую
 
Последнее редактирование:
Попробовал:
C++:
Expand Collapse Copy
    jobject getClassLoader(JNIEnv* jniEnv) {
        jobject targetClassLoader = NULL;
        typedef jobjectArray(JNICALL* JVM_GetAllThreads)(JNIEnv* env, jclass dummy);
        JVM_GetAllThreads getAllThreads = (JVM_GetAllThreads)GetProcAddress(GetModuleHandleA("jvm.dll"), "JVM_GetAllThreads");
        jobjectArray threadsArray = getAllThreads(jniEnv, NULL);
        int threadsCount = jniEnv->GetArrayLength(threadsArray);
        for (int i = 0; i < threadsCount; i++) {
            jobject thread = jniEnv->GetObjectArrayElement(threadsArray, i);
            jclass thread_class = jniEnv->FindClass("java/lang/Thread");
            jmethodID getName = jniEnv->GetMethodID(thread_class, "getName", "()Ljava/lang/String;");
            jfieldID ctxClsLoader = jniEnv->GetFieldID(thread_class, "contextClassLoader", "Ljava/lang/ClassLoader;");
            jobject classLoader = jniEnv->GetObjectField(thread, ctxClsLoader);
            targetClassLoader = classLoader;
           
        }
        return targetClassLoader;
    }
   
    jclass getObject(JNIEnv* env, const char* className)
    {
        jstring name = env->NewStringUTF(className);
        cout << "name: " << name << endl;
   
        jobject classLoader = getClassLoader(env);
        cout << "classLoader: " << classLoader << endl;
   
        jmethodID mid = env->GetMethodID(env->GetObjectClass(classLoader), "findClass", "(Ljava/lang/String;)Ljava/lang/Class;");
        cout << "mid: " << mid << endl;
   
        return (jclass)env->CallObjectMethod(classLoader, mid, name);
        env->DeleteLocalRef(name);
   
    }
все так же, класс находит, GetMethodID возвращает null
интересно, а почему это contextClassLoader в Thread должен иметь нужный класс лоадер всегда))
Там вместо слешей точки по идее должны быть
джава методы требуют такое, но не JNIEnv::FindClass
 
Потому что у фабрика Minecraft instance отдаёт
MinecraftClient mc = MinecraftClient.getInstance();
а не Minecraft
 

Вложения

  • 1756507406965.png
    1756507406965.png
    39.8 KB · Просмотры: 37
Потому что у фабрика Minecraft instance отдаёт
MinecraftClient mc = MinecraftClient.getInstance();
а не Minecraft
Спасибо все кто помог, проблему уже решил самостоятельно, Дело не в классах и так далее. Пришлось реально пошевелить мозгами, ни одна нейросеть мне не помогла, ни платная, ни бесплатная. Вообщем если кому то помочь с решением данной проблемы, пишите в личку, еще раз всем спасибо!все работает!
Потому что у фабрика Minecraft instance отдаёт
MinecraftClient mc = MinecraftClient.getInstance();
а не Minecraft
кстати, люксембург, я тебя помню, ты мне помогал давненько, ты очень хороший чел, респект таким людям, здоровья тебе и твоим близким, бро
интересно, а почему это contextClassLoader в Thread должен иметь нужный класс лоадер всегда))

джава методы требуют такое, но не JNIEnv::FindClass
да, в этом и проблема, Нужно получть Thread-14(Class Loader) и через фордж класс лоадер загружать классы
Спасибо все кто помог, проблему уже решил самостоятельно, Дело не в классах и так далее. Пришлось реально пошевелить мозгами, ни одна нейросеть мне не помогла, ни платная, ни бесплатная. Вообщем если кому то помочь с решением данной проблемы, пишите в личку, еще раз всем спасибо!все работает!

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

да, в этом и проблема, Нужно получть Thread-14 и через фордж класс лоадер загружать классы
Кстати, появилась еще одна проблема)) Когда вызываю метод getModelViewMatrix из RenderSystem мне отказывает, тк просит поток Render System. И вообщем тут костыли идут, делать мультипоток и переключаться между ними такой себе вариант, ну реально плохой, я думал пробовать хукать opengl и доставать gl_ModelViewProjectionMatrix но че то нихуя не вышло))) опять мозгоебка

Я вот думаю попробовать написать мод который выводит матрицы на экран, а потом искать их адреса и получать напрямую из памяти, но такого мода не нашел, у меня нет ни intellij idea, нету сред разработки модов, а так же и знаний в их разработке, если тут есть добрые люди, можете пожалуйста скинуть такой мод, или помочь найти другой вариант, спасибо!
 
Последнее редактирование:
я думал пробовать хукать opengl и доставать gl_ModelViewProjectionMatrix но че то нихуя не вышло))) опять мозгоебка
Скорее всего потому-что контекст OpenGL привязан к тому-же потоку на котором висит RenderSystem, сам по себе кубач потоки ограничивать не должен, это как раз таки должен делать OpenGL потому-что он нихрена не мультипоточный и мьютексов на функциях у него нет

Я вот думаю попробовать написать мод который выводит матрицы на экран, а потом искать их адреса и получать напрямую из памяти
Ну эт не просто будет мне кажется, памятью матрицы то будет владеть скорее всего драйвер, да и саму матрицу ты не найдёшь как поле в API OpenGL, всё через функции делается
 
Скорее всего потому-что контекст OpenGL привязан к тому-же потоку на котором висит RenderSystem, сам по себе кубач потоки ограничивать не должен, это как раз таки должен делать OpenGL потому-что он нихрена не мультипоточный и мьютексов на функциях у него нет


Ну эт не просто будет мне кажется, памятью матрицы то будет владеть скорее всего драйвер, да и саму матрицу ты не найдёшь как поле в API OpenGL, всё через функции делается
не думаю, в памяти точно будет матрица, по другому никак
 
Назад
Сверху Снизу