Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос JNI | DLL | 1.21.1 FORGE | C++ | Проблема с getInstance()

dllmain.cpp
dllmain:
Expand Collapse Copy
#include "pch.h"
#include <jni.h>
#include <iostream>
#include "MinecraftMappings.h"
using namespace std;
JavaVM* g_jvm = nullptr;
JNIEnv* g_env = nullptr;

void InitConsole() {
    AllocConsole();
    FILE* fDummy;
    freopen_s(&fDummy, "CONOUT$", "w", stdout);
    freopen_s(&fDummy, "CONOUT$", "w", stderr);
    freopen_s(&fDummy, "CONIN$", "r", stdin);
    std::cout.clear();
    std::clog.clear();
    std::cerr.clear();
    std::cin.clear();
  
    SetConsoleTitleA("Minecraft JNI Cheat - Debug Console");
    std::cout << "[+] Console initialized!" << std::endl;
}

bool InitJNI() {
    std::cout << "[*] Initializing JNI..." << std::endl;
  
    JavaVM* jvmBuf[1];
    jsize nVMs;
    jint result = JNI_GetCreatedJavaVMs(jvmBuf, 1, &nVMs);
  
    if (result != JNI_OK || nVMs == 0) {
        std::cerr << "Failed to find JavaVM! Error: " << result << std::endl;
        return false;
    }
  
    g_jvm = jvmBuf[0];
    std::cout << "JavaVM found: 0x" << std::hex << (uintptr_t)g_jvm << std::dec << std::endl;
  
    // Attach current thread to JVM
    result = g_jvm->AttachCurrentThread((void**)&g_env, nullptr);
    if (result != JNI_OK) {
        std::cerr << "Failed to attach thread!Error: " << result << std::endl;
        return false;
    }
  
    std::cout << "Thread attached to JVM" << std::endl;
    std::cout << "JNIEnv ready: 0x" << std::hex << (uintptr_t)g_env << std::dec << std::endl;
    return true;
}

// Main cheat thread
DWORD WINAPI MainThread(LPVOID lpParam) {
    InitConsole();
  
    std::cout << "========================================" << std::endl;
    std::cout << "  Minecraft JNI Client" << std::endl;
    std::cout << "========================================" << std::endl;
  
    Sleep(500);
    if (!InitJNI()) {
        std::cerr << "!JNI" << std::endl;
        Sleep(3000);
        FreeConsole();
        FreeLibraryAndExitThread((HMODULE)lpParam, 0);
        return 1;
    }
  
    std::cout << "\n[+] JNI initialized successfully!" << std::endl;
    std::cout << "\n[*] Press END to unload cheat..." << std::endl;
    std::cout << "========================================\n" << std::endl;
  
    // ============================================
    // ============================================

    //instance
    jclass mcClass = g_env->FindClass("net/minecraft/client/Minecraft");
    if (!mcClass) {
        cout << "!mineClass" << endl;
    }
    else {
        cout << "mcClass getted" << endl;
        jmethodID IDgetInstance = g_env->GetStaticMethodID(mcClass, MC::Methods::GET_INSTANCE, MC::Signatures::GET_INSTANCE_RET);
        if (!IDgetInstance) {
            cout << "!IDgetInstance" << endl;
        }
        else {
            cout << "IDgetInstance getted" << endl;
            jobject getInstance = g_env->CallStaticObjectMethod(mcClass, IDgetInstance);
            if (!getInstance) {
                cout << "!getInstance" << endl;
            }
            else {
                cout << "Succesful getted Instance!" << endl;

            }

        }

    }

    while (true) {
        if (GetAsyncKeyState(VK_END) & 1) {
            std::cout << "[*] Unloading..." << std::endl;
            break;
        }
      
      
        Sleep(100);
    }
  
    // ============================================
    // ============================================
  
    if (g_jvm && g_env) {
        g_jvm->DetachCurrentThread();
        std::cout << "[+] Detached from JVM" << std::endl;
    }
  
    std::cout << "[+] Cheat unloaded" << std::endl;
    Sleep(1000);
    FreeConsole();
  
    FreeLibraryAndExitThread((HMODULE)lpParam, 0);
    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
    switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
        DisableThreadLibraryCalls(hModule);
        CreateThread(nullptr, 0, MainThread, hModule, 0, nullptr);
        break;
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

Mappings
Mappings:
Expand Collapse Copy
#pragma once
// Minecraft 1.21.1 Mappings
// Источник: Yarn mappings + Mojang mappings

namespace MC {
    // Основные классы
    namespace Classes {
        // Minecraft Client (главный класс)
        constexpr const char* MINECRAFT = "net/minecraft/client/Minecraft";
        constexpr const char* MINECRAFT_YARN = "net/minecraft/class_310";  // Yarn mapping
      
        // Player
        constexpr const char* LOCAL_PLAYER = "net/minecraft/client/player/LocalPlayer";
        constexpr const char* LOCAL_PLAYER_YARN = "net/minecraft/class_746";
      
        // Entity
        constexpr const char* ENTITY = "net/minecraft/world/entity/Entity";
        constexpr const char* ENTITY_YARN = "net/minecraft/class_1297";
      
        // Level/World
        constexpr const char* CLIENT_LEVEL = "net/minecraft/client/multiplayer/ClientLevel";
        constexpr const char* CLIENT_LEVEL_YARN = "net/minecraft/class_638";
      
        // Game Renderer
        constexpr const char* GAME_RENDERER = "net/minecraft/client/renderer/GameRenderer";
        constexpr const char* GAME_RENDERER_YARN = "net/minecraft/class_757";
    }
  
    // Методы Minecraft класса
    namespace Methods {
        // getInstance() - получить инстанс Minecraft
        constexpr const char* GET_INSTANCE = "getInstance";
        constexpr const char* GET_INSTANCE_YARN = "method_1551";
      
        // getPlayer() - получить игрока
        constexpr const char* GET_PLAYER = "getPlayer";
        constexpr const char* GET_PLAYER_YARN = "method_1548";
    }
  
    // Поля Minecraft класса
    namespace Fields {
        // player - текущий игрок
        constexpr const char* PLAYER = "player";
        constexpr const char* PLAYER_YARN = "field_1724";
        constexpr const char* PLAYER_SIG = "Lnet/minecraft/client/player/LocalPlayer;";
        constexpr const char* PLAYER_SIG_YARN = "Lnet/minecraft/class_746;";
      
        // level - текущий мир
        constexpr const char* LEVEL = "level";
        constexpr const char* LEVEL_YARN = "field_1687";
        constexpr const char* LEVEL_SIG = "Lnet/minecraft/client/multiplayer/ClientLevel;";
        constexpr const char* LEVEL_SIG_YARN = "Lnet/minecraft/class_638;";
      
        // gameRenderer - рендерер игры
        constexpr const char* GAME_RENDERER = "gameRenderer";
        constexpr const char* GAME_RENDERER_YARN = "field_1773";
        constexpr const char* GAME_RENDERER_SIG = "Lnet/minecraft/client/renderer/GameRenderer;";
        constexpr const char* GAME_RENDERER_SIG_YARN = "Lnet/minecraft/class_757;";
    }
  
    // Методы Entity
    namespace EntityMethods {
        // getX() - получить X координату
        constexpr const char* GET_X = "getX";
        constexpr const char* GET_X_YARN = "method_23317";
      
        // getY() - получить Y координату
        constexpr const char* GET_Y = "getY";
        constexpr const char* GET_Y_YARN = "method_23318";
      
        // getZ() - получить Z координату
        constexpr const char* GET_Z = "getZ";
        constexpr const char* GET_Z_YARN = "method_23321";
      
        // setPos() - установить позицию
        constexpr const char* SET_POS = "setPos";
        constexpr const char* SET_POS_YARN = "method_5814";
        constexpr const char* SET_POS_SIG = "(DDD)V";
    }
  
    // Поля Entity
    namespace EntityFields {
        // x, y, z координаты (могут быть приватными)
        constexpr const char* X = "x";
        constexpr const char* Y = "y";
        constexpr const char* Z = "z";
      
        // onGround - на земле ли
        constexpr const char* ON_GROUND = "onGround";
        constexpr const char* ON_GROUND_YARN = "field_5957";
    }
  
    // Методы LocalPlayer
    namespace PlayerMethods {
        // getHealth() - получить здоровье
        constexpr const char* GET_HEALTH = "getHealth";
        constexpr const char* GET_HEALTH_YARN = "method_6032";
        constexpr const char* GET_HEALTH_SIG = "()F";
      
        // setHealth() - установить здоровье
        constexpr const char* SET_HEALTH = "setHealth";
        constexpr const char* SET_HEALTH_YARN = "method_6074";
        constexpr const char* SET_HEALTH_SIG = "(F)V";
      
        // isCreative() - креатив ли
        constexpr const char* IS_CREATIVE = "isCreative";
        constexpr const char* IS_CREATIVE_YARN = "method_7337";
        constexpr const char* IS_CREATIVE_SIG = "()Z";
    }
  
    // Сигнатуры методов
    namespace Signatures {
        // getInstance() возвращает Minecraft
        constexpr const char* GET_INSTANCE_RET = "()Lnet/minecraft/client/Minecraft;";
        constexpr const char* GET_INSTANCE_RET_YARN = "()Lnet/minecraft/class_310;";
      
        // Пустой метод
        constexpr const char* VOID_METHOD = "()V";
      
        // Boolean метод
        constexpr const char* BOOLEAN_METHOD = "()Z";
      
        // Float метод
        constexpr const char* FLOAT_METHOD = "()F";
      
        // Double метод
        constexpr const char* DOUBLE_METHOD = "()D";
    }
}

Лог с консоли

[+] Console initialized!
========================================
Minecraft JNI Client
========================================
[*] Initializing JNI...
JavaVM found: 0x7ffe7b0d17c0
Thread attached to JVM
JNIEnv ready: 0x1931830a090

[+] JNI initialized successfully!

[*] Press END to unload cheat...
========================================

mcClass getted
IDgetInstance getted
!getInstance <-Не получает getInstance()

В чем может быть проблема?, долго пытался решить так и не получилось
Просто попробуй перестать кодить через чат гпт
 
Назад
Сверху Снизу