fix payload loading and bootstrap path

This commit is contained in:
nitrogenoliquido committed 2026-10-14 22:24:30 -05:00
1 parent e908ab2355
commit 82004f6b5e
2 files changed
+11 -16

No files matched your search

+1 -1
View File
@@ -22,7 +22,7 @@ private:
static bool ExtractPayloadJar(HMODULE hModule, const MinecraftInfo& mcInfo, std::wstring& outJarPath);
static bool AddJarToClassLoader(JNIEnv* env, jobject classLoader, const std::wstring& jarPath);
static bool DefinePayloadClasses(JNIEnv* env, jobject classLoader, const std::wstring& jarPath);
static bool LaunchBootstrap(JNIEnv* env, jobject classLoader, const MinecraftInfo& mcInfo, HMODULE hModule);
static bool LaunchBootstrap(JNIEnv* env, jobject classLoader, const MinecraftInfo& mcInfo, const std::wstring& jarPath);
};
} // namespace SlinkyNative
+10 -15
View File
@@ -40,9 +40,6 @@ InjectionStatus PayloadLoader::LoadAndStart(HMODULE hModule, const MinecraftInfo
// Read and define dev.slinky classes
DefinePayloadClasses(env, mcInfo.classLoader, jarPath);
// Delete temporary jar immediately after loading
DeleteFileW(jarPath.c_str());
// Register native bridge methods
if (!NativeBridge::Register(env, mcInfo.classLoader)) {
Logger::Log(L"FINAL STATUS: FAILED");
@@ -50,7 +47,7 @@ InjectionStatus PayloadLoader::LoadAndStart(HMODULE hModule, const MinecraftInfo
}
// Launch Bootstrap
if (!LaunchBootstrap(env, mcInfo.classLoader, mcInfo, hModule)) {
if (!LaunchBootstrap(env, mcInfo.classLoader, mcInfo, jarPath)) {
Logger::Log(L"bootstrap failed; unloading");
Logger::Log(L"FINAL STATUS: FAILED");
return InjectionStatus::Failed;
@@ -378,7 +375,7 @@ bool PayloadLoader::DefinePayloadClasses(JNIEnv* env, jobject classLoader, const
jsize byteLen = env->GetArrayLength(classBytesArr);
jbyte* rawBytes = env->GetByteArrayElements(classBytesArr, nullptr);
if (rawBytes) {
jclass definedClass = env->DefineClass(className.c_str(), classLoader, rawBytes, byteLen);
jclass definedClass = env->DefineClass(nullptr, classLoader, rawBytes, byteLen);
if (definedClass) {
definedCount++;
env->DeleteLocalRef(definedClass);
@@ -408,7 +405,7 @@ bool PayloadLoader::DefinePayloadClasses(JNIEnv* env, jobject classLoader, const
return true;
}
bool PayloadLoader::LaunchBootstrap(JNIEnv* env, jobject classLoader, const MinecraftInfo& mcInfo, HMODULE hModule) {
bool PayloadLoader::LaunchBootstrap(JNIEnv* env, jobject classLoader, const MinecraftInfo& mcInfo, const std::wstring& jarPath) {
jclass bootstrapClass = nullptr;
if (classLoader) {
@@ -440,20 +437,18 @@ bool PayloadLoader::LaunchBootstrap(JNIEnv* env, jobject classLoader, const Mine
return false;
}
wchar_t dllPath[MAX_PATH] = { 0 };
GetModuleFileNameW(hModule, dllPath, MAX_PATH);
int u8Len = WideCharToMultiByte(CP_UTF8, 0, dllPath, -1, nullptr, 0, nullptr, nullptr);
std::vector<char> u8DllPath(u8Len);
WideCharToMultiByte(CP_UTF8, 0, dllPath, -1, u8DllPath.data(), u8Len, nullptr, nullptr);
int u8Len = WideCharToMultiByte(CP_UTF8, 0, jarPath.c_str(), -1, nullptr, 0, nullptr, nullptr);
std::vector<char> u8JarPath(u8Len);
WideCharToMultiByte(CP_UTF8, 0, jarPath.c_str(), -1, u8JarPath.data(), u8Len, nullptr, nullptr);
jstring jMapping = env->NewStringUTF(mcInfo.mappingName.c_str());
jstring jDllPath = env->NewStringUTF(u8DllPath.data());
jstring jPayloadPath = env->NewStringUTF(u8JarPath.data());
Logger::Log(L"Bootstrap.start calling with mapping=%hs", mcInfo.mappingName.c_str());
env->CallStaticVoidMethod(bootstrapClass, startMethod, jMapping, jDllPath);
Logger::Log(L"Bootstrap.start calling with mapping=%hs, payload=%ls", mcInfo.mappingName.c_str(), jarPath.c_str());
env->CallStaticVoidMethod(bootstrapClass, startMethod, jMapping, jPayloadPath);
env->DeleteLocalRef(jMapping);
env->DeleteLocalRef(jDllPath);
env->DeleteLocalRef(jPayloadPath);
env->DeleteLocalRef(bootstrapClass);
if (env->ExceptionCheck()) {