Вопрос Env->CallStaticObjectMethod = NULL

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
14 Май 2023
Сообщения
8
Реакции
2

Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:

  • бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
  • маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
  • приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
  • обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.

Спасибо!

Всем привет, хочу получить instance игры, но постоянно при получении jobject через CallStaticObjectMethod (также и с GetStaticObjectField) у меня возвращается NULL (нулевой адрес). Но прикол в том, что когда использую env->IsInstanceOf(jobject, jclass), то возвращает JNI_TRUE, что является странным... Вот, что возвращает консолька:
[INFO] Successfully attached to JVM. JNIEnv*: 000001FFF186BAC0
MinecraftClass is not null!
GetStaticMethodID is not null!
CallStaticObjectMethod is null!
000001FFF1970870
000001FFA62EE688
0000000000000000

Маппинги все правильные с использованием обфускации. Вот код. Уже 2 дня не могу понять, почему возвращает NULL. Пробовал через forge, forgeoptifine, optifine, vanilla, менял версии, jdk и т.д., но все безуспешно...

Вот мой код ниже:
dllmain.cpp:
Expand Collapse Copy
typedef jint(*pJNI_GetCreatedJavaVMs)(JavaVM**, jsize, jsize*);
 
extern FILE* console_buffer1 = nullptr;
 
extern JavaVM* jvm = nullptr;
extern JNIEnv* env = nullptr;
 
bool getEnv()
{
    HMODULE jvmModule = GetModuleHandleA("jvm.dll");
    if (!jvmModule) {
        std::cerr << "[ERROR] Failed to get handle to jvm.dll" << std::endl;
        return false;
    }
 
    auto JNI_GetCreatedJavaVMs = reinterpret_cast<pJNI_GetCreatedJavaVMs>(
        GetProcAddress(jvmModule, "JNI_GetCreatedJavaVMs")
        );
 
    if (!JNI_GetCreatedJavaVMs) {
        std::cerr << "[ERROR] Failed to get address of JNI_GetCreatedJavaVMs" << std::endl;
        return false;
    }
 
    if (JNI_GetCreatedJavaVMs(&jvm, 1, nullptr) != JNI_OK || jvm == nullptr) {
        std::cerr << "[ERROR] Failed to get JavaVM instance" << std::endl;
        return false;
    }
 
    if (jvm->AttachCurrentThread(reinterpret_cast<void**>(&env), nullptr) != JNI_OK || env == nullptr) {
        std::cerr << "[ERROR] Failed to attach current thread to JVM" << std::endl;
        return false;
    }
 
    std::cout << "[INFO] Successfully attached to JVM. JNIEnv*: " << env << std::endl;
    return true;
}
 
bool getInstance()
{
    if (!env) {
        std::cerr << "JNIEnv is null!" << std::endl;
        return false;
    }
    jclass mcClass = env->FindClass("dvp"); // net/minecraft/client/Minecraft для 1.17.1
    //jclass mcClass = env->FindClass("djz"); // net/minecraft/client/Minecraft
    if (!mcClass) {
        std::cerr << "Failed to find Minecraft class!" << std::endl;
        return false;
    }
 
    std::cout << "MinecraftClass is not null!" << std::endl;
    Sleep(1500);
 
    jmethodID method = env->GetStaticMethodID(mcClass, "C", "()Ldvp;"); // getInstance()
    if (!method) {
        std::cerr << "Failed to get static method!" << std::endl;
        return false;
    }
 
    std::cout << "GetStaticMethodID is not null!" << std::endl;
 
    Sleep(1500);
 
    jobject minecraftObj = env->CallStaticObjectMethodA(mcClass, method, nullptr);
    if (env->ExceptionCheck()) { // не ловит
        std::cout << "JNI Exception caught!" << std::endl;
        env->ExceptionDescribe();
        env->ExceptionClear();
    }
    if (!minecraftObj) {
        env->ExceptionDescribe();
        std::cout << "CallStaticObjectMethod is null!" << std::endl;
        std::cout << mcClass << std::endl;
        std::cout << method << std::endl;
        std::cout << minecraftObj << std::endl;
    }
 
    Sleep(3000);
 
    return false;
}
 
 
void MainThread(HMODULE hModule)
{
    AllocConsole();
    freopen_s(&console_buffer1, "CONOUT$", "w", stdout);
    getEnv();
 
    while (true)
    {
        if (!getInstance())
        {
            continue;
        }
        else
        {
            break;
        }
    }
 
    FreeConsole();
    FreeLibraryAndExitThread(hModule, 0);
    fclose(console_buffer1);
}
 
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    {
        CreateThread(0, 0, (LPTHREAD_START_ROUTINE)MainThread, hModule, 0, 0);
    }
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

Очень надеюсь найти уже решение...
 
попробуй юзать CallStaticObjectMethod без A: env->CallStaticObjectMethod(mcClass, method);
 
у тебя файндкласс лочится на дефолте, тебе нужно брать класслоадер из текущего потока
 
попробуй юзать CallStaticObjectMethod без A: env->CallStaticObjectMethod(mcClass, method);
я пробовал как через A, V и простой... Может дело в класслоадере хз
у тебя файндкласс лочится на дефолте, тебе нужно брать класслоадер из текущего потока
хочешь сказать, типо мне надо сначала найти java/lang/ClassLoader и потом использовать функцию findclass и уже потом вызывать getInstance() на основе этой findClass, а не env->FindClass()? Просто не совсем понял, что ты имеешь ввиду
 
Последнее редактирование:
я пробовал как через A, V и простой... Может дело в класслоадере хз

хочешь сказать, типо мне надо сначала найти java/lang/ClassLoader и потом использовать функцию findclass и уже потом вызывать getInstance() на основе этой findClass, а не env->FindClass()? Просто не совсем понял, что ты имеешь ввиду
Если юзаешь модлоадеры, то надо получать классы через их класслоадеры, например, в Fabric это KnotClassLoader
Если ты сидишь на ваниле - то оно должно и так работать, по крайней мере, на 1.21.4 работает с дефолтным env->FindClass
 
Если юзаешь модлоадеры, то надо получать классы через их класслоадеры, например, в Fabric это KnotClassLoader
Если ты сидишь на ваниле - то оно должно и так работать, по крайней мере, на 1.21.4 работает с дефолтным env->FindClass
ну я пробовал ванильку 1.16.5 и 1.17.1 и не работало. попробую на 1.21 может получится. Как раз на новые версии буду готов xd
Если юзаешь модлоадеры, то надо получать классы через их класслоадеры, например, в Fabric это KnotClassLoader
Если ты сидишь на ваниле - то оно должно и так работать, по крайней мере, на 1.21.4 работает с дефолтным env->FindClass
ну я еще попробую найти ClassLoader.findClass, просто сама проблема именно в CallStaticObjectMethod. Может реально чет надо подгружать, хотя в туторах на ют на тот же 1.8.9 не надо было...
 
у тебя файндкласс лочится на дефолте, тебе нужно брать класслоадер из текущего потока
Какого еще текущего потока :roflanEbalo:
Держу в курсе, что getContextClassLoader может не хранить нужный класс лоадер, но ладно, если мы не выходим за пределы форджа ванильного, то сомнительно, но окей

Раз уж заговорили про поток (но мне кажется этот метод довольно странным), то вот хацк придуманный ток что

ClassLoader classLoader = null;
Map<Thread, StackTraceElement[]> stackTraces = Thread.getAllStackTraces();

for(Thread t : stackTraces.keySet()) {
if(t.getName().equals("Client thread")) { // возможно название потока было изменено в последних версиях, не проверял
classLoader = t.getContextClassLoader();
break;
}
}

if(classLoader == null) {
// ну не нашли, бывает =(
}

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

Ещё можно вхукаться в какую-нибудь нативную функцию, которую вызывает ТОЛЬКО поток игры и там уже всё делать, но опять же это такие костыли что KEK

ну я пробовал ванильку 1.16.5 и 1.17.1 и не работало. попробую на 1.21 может получится. Как раз на новые версии буду готов xd

ну я еще попробую найти ClassLoader.findClass, просто сама проблема именно в CallStaticObjectMethod. Может реально чет надо подгружать, хотя в туторах на ют на тот же 1.8.9 не надо было...
Потому-что хуйня связанная с класс лоадером была сделана для платформы под моды для майнкрафта, оптифайн это просто грубо "инлайнутый" мод в мцп
Рекомендую сначала изучить весь "округ" майнкрафта, в том числе сам майнкрафт, чтобы не напарываться на такие "проблемы", и отталкиваться бы не стоило от старейшей версии (1.8.9), которая вышла хуй знает в каком году: изменения ? Не, не слышали
 
Последнее редактирование:
Какого еще текущего потока :roflanEbalo:
Держу в курсе, что getContextClassLoader может не хранить нужный класс лоадер, но ладно, если мы не выходим за пределы форджа ванильного, то сомнительно, но окей

Раз уж заговорили про поток (но мне кажется этот метод довольно странным), то вот хацк придуманный ток что

ClassLoader classLoader = null;
Map<Thread, StackTraceElement[]> stackTraces = Thread.getAllStackTraces();

for(Thread t : stackTraces.keySet()) {
if(t.getName().equals("Client thread")) { // возможно название потока было изменено в последних версиях, не проверял
classLoader = t.getContextClassLoader();
break;
}
}

if(classLoader == null) {
// ну не нашли, бывает =(
}

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

Ещё можно вхукаться в какую-нибудь нативную функцию, которую вызывает ТОЛЬКО поток игры и там уже всё делать, но опять же это такие костыли что KEK


Потому-что хуйня связанная с класс лоадером была сделана для платформы под моды для майнкрафта, оптифайн это просто грубо "инлайнутый" мод в мцп
Рекомендую сначала изучить весь "округ" майнкрафта, в том числе сам майнкрафт, чтобы не напарываться на такие "проблемы", и отталкиваться бы не стоило от старейшей версии (1.8.9), которая вышла хуй знает в каком году: изменения ? Не, не слышали
т.е. мне просто надо найти правильный класслоадер, верно?
ну
Какого еще текущего потока :roflanEbalo:
Держу в курсе, что getContextClassLoader может не хранить нужный класс лоадер, но ладно, если мы не выходим за пределы форджа ванильного, то сомнительно, но окей

Раз уж заговорили про поток (но мне кажется этот метод довольно странным), то вот хацк придуманный ток что

ClassLoader classLoader = null;
Map<Thread, StackTraceElement[]> stackTraces = Thread.getAllStackTraces();

for(Thread t : stackTraces.keySet()) {
if(t.getName().equals("Client thread")) { // возможно название потока было изменено в последних версиях, не проверял
classLoader = t.getContextClassLoader();
break;
}
}

if(classLoader == null) {
// ну не нашли, бывает =(
}

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

Ещё можно вхукаться в какую-нибудь нативную функцию, которую вызывает ТОЛЬКО поток игры и там уже всё делать, но опять же это такие костыли что KEK


Потому-что хуйня связанная с класс лоадером была сделана для платформы под моды для майнкрафта, оптифайн это просто грубо "инлайнутый" мод в мцп
Рекомендую сначала изучить весь "округ" майнкрафта, в том числе сам майнкрафт, чтобы не напарываться на такие "проблемы", и отталкиваться бы не стоило от старейшей версии (1.8.9), которая вышла хуй знает в каком году: изменения ? Не, не слышали
ну я если не могу найти необходимую информацию и зависаю на одном, то для этого и созданы форумы. поэтому я и обратился за помощью...
 
ну я если не могу найти необходимую информацию и зависаю на одном, то для этого и созданы форумы. поэтому я и обратился за помощью...
Ну форумы то созданы, а люди по твоему это кто) Без людей и форум перестанет иметь смысл существования. Любой чел посмотрев на тебя бы подумал "очередной пастерок, который ничего не умеет и пытается лезть куда то ничего не хотев делать сам" и ведь они будут отчасти правы, ибо разумный человек пойдет разбираться со своей проблемой сам, логически пытаться мыслить и отталкиваться от той информации, что он имеет, а не сидеть в надежде, что ему кто-то поможет на форуме. Так устроена жизнь, понимаешь?

Это твои проблемы, если ты не хочешь изучать то, что у тебя хранится на компе - сурсы игры, сурсы джавы, псевдокод либок и т.д., а также это твои проблемы, если ты не умеешь мыслить логически и решать проблемы. Никто тебе тут не будет помогать, потому-что это невыгодно. Ты ведь ничего взамен не дашь человеку, ну и что с того что вы например даже познакомитесь) Ты то ему кто будешь? Пастер максимум и всё, который не может ничего предоставить выгодное взамен.

Можешь забыть про доброту здесь, ведь такие как ты этой добротой злоупотребляют постоянно. Одно дело, когда человек один раз попросит что-то и потом начинает всё самостоятельно пытаться делать, а другое когда вылезают пастеры, которые один за другим задают вопросы не пытаясь хоть как-то самостоятельно информацию найти
 
Последнее редактирование:
Какого еще текущего потока :roflanEbalo:
Держу в курсе, что getContextClassLoader может не хранить нужный класс лоадер, но ладно, если мы не выходим за пределы форджа ванильного, то сомнительно, но окей

Раз уж заговорили про поток (но мне кажется этот метод довольно странным), то вот хацк придуманный ток что

ClassLoader classLoader = null;
Map<Thread, StackTraceElement[]> stackTraces = Thread.getAllStackTraces();

for(Thread t : stackTraces.keySet()) {
if(t.getName().equals("Client thread")) { // возможно название потока было изменено в последних версиях, не проверял
classLoader = t.getContextClassLoader();
break;
}
}

if(classLoader == null) {
// ну не нашли, бывает =(
}

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

Ещё можно вхукаться в какую-нибудь нативную функцию, которую вызывает ТОЛЬКО поток игры и там уже всё делать, но опять же это такие костыли что KEK
спасибо, что расписал в чем я не прав, я не сильно разбираюсь в jni
 
Ну форумы то созданы, а люди по твоему это кто) Без людей и форум перестанет иметь смысл существования. Любой чел посмотрев на тебя бы подумал "очередной пастерок, который ничего не умеет и пытается лезть куда то ничего не хотев делать сам" и ведь они будут отчасти правы, ибо разумный человек пойдет разбираться со своей проблемой сам, логически пытаться мыслить и отталкиваться от той информации, что он имеет, а не сидеть в надежде, что ему кто-то поможет на форуме. Так устроена жизнь, понимаешь?

Это твои проблемы, если ты не хочешь изучать то, что у тебя хранится на компе - сурсы игры, сурсы джавы, псевдокод либок и т.д., а также это твои проблемы, если ты не умеешь мыслить логически и решать проблемы. Никто тебе тут не будет помогать, потому-что это невыгодно. Ты ведь ничего взамен не дашь человеку, ну и что с того что вы например даже познакомитесь) Ты то ему кто будешь? Пастер максимум и всё, который не может ничего предоставить выгодное взамен.

Можешь забыть про доброту здесь, ведь такие как ты этой добротой злоупотребляют постоянно. Одно дело, когда человек один раз попросит что-то и потом начинает всё самостоятельно пытаться делать, а другое когда вылезают пастеры, которые один за другим задают вопросы не пытаясь хоть как-то самостоятельно информацию найти
я на протяжении последних 2х недель разбирал Ripterms Ghost (с перерывами), но я там просто не заметил кода с ClassLoader. Возможно я слепой, но в данный момент я просто хотел попросить помощи
Ну форумы то созданы, а люди по твоему это кто) Без людей и форум перестанет иметь смысл существования. Любой чел посмотрев на тебя бы подумал "очередной пастерок, который ничего не умеет и пытается лезть куда то ничего не хотев делать сам" и ведь они будут отчасти правы, ибо разумный человек пойдет разбираться со своей проблемой сам, логически пытаться мыслить и отталкиваться от той информации, что он имеет, а не сидеть в надежде, что ему кто-то поможет на форуме. Так устроена жизнь, понимаешь?

Это твои проблемы, если ты не хочешь изучать то, что у тебя хранится на компе - сурсы игры, сурсы джавы, псевдокод либок и т.д., а также это твои проблемы, если ты не умеешь мыслить логически и решать проблемы. Никто тебе тут не будет помогать, потому-что это невыгодно. Ты ведь ничего взамен не дашь человеку, ну и что с того что вы например даже познакомитесь) Ты то ему кто будешь? Пастер максимум и всё, который не может ничего предоставить выгодное взамен.

Можешь забыть про доброту здесь, ведь такие как ты этой добротой злоупотребляют постоянно. Одно дело, когда человек один раз попросит что-то и потом начинает всё самостоятельно пытаться делать, а другое когда вылезают пастеры, которые один за другим задают вопросы не пытаясь хоть как-то самостоятельно информацию найти
ну ты можешь глянуть мою историю. я почти никогда тут не спрашиваю и пытаюсь находить сам в гугле / чатгпт / других форумах с готовыми и нужными для меня ответами. я просто не понял свою проблему и застрял. мне нужен был толчек чтобы понять суть моей тупости. я же не попросил скинуть мне готовый код, а дать информацию, где я проебался
Ну форумы то созданы, а люди по твоему это кто) Без людей и форум перестанет иметь смысл существования. Любой чел посмотрев на тебя бы подумал "очередной пастерок, который ничего не умеет и пытается лезть куда то ничего не хотев делать сам" и ведь они будут отчасти правы, ибо разумный человек пойдет разбираться со своей проблемой сам, логически пытаться мыслить и отталкиваться от той информации, что он имеет, а не сидеть в надежде, что ему кто-то поможет на форуме. Так устроена жизнь, понимаешь?

Это твои проблемы, если ты не хочешь изучать то, что у тебя хранится на компе - сурсы игры, сурсы джавы, псевдокод либок и т.д., а также это твои проблемы, если ты не умеешь мыслить логически и решать проблемы. Никто тебе тут не будет помогать, потому-что это невыгодно. Ты ведь ничего взамен не дашь человеку, ну и что с того что вы например даже познакомитесь) Ты то ему кто будешь? Пастер максимум и всё, который не может ничего предоставить выгодное взамен.

Можешь забыть про доброту здесь, ведь такие как ты этой добротой злоупотребляют постоянно. Одно дело, когда человек один раз попросит что-то и потом начинает всё самостоятельно пытаться делать, а другое когда вылезают пастеры, которые один за другим задают вопросы не пытаясь хоть как-то самостоятельно информацию найти
я лишь хочу спросить о том, что проблема нулевого CallObjectMethod/GetObjectField (также со Static) может на 95% (или выше) являться именно через проблему с ClassLoader. Я не прошу чтоб мне написали готовый код с его работой
 
я лишь хочу спросить о том, что проблема нулевого CallObjectMethod/GetObjectField (также со Static) может на 95% (или выше) являться именно через проблему с ClassLoader. Я не прошу чтоб мне написали готовый код с его работой
100% дело в нём
 
Назад
Сверху Снизу