#include #include #include BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved) { // Only listen for attach if (reason != DLL_PROCESS_ATTACH) { return TRUE; } // Get target EXE path char *targetExe = getenv(ENV_EXE_PATH); // Get the path of the DLL to inject char *injectDll = getenv(ENV_DLL_PATH); // Get game commandline char *cmdline = getenv(ENV_PROC_CMD); // Compute the working directory path char workdir[MAX_PATH]; strcpy(workdir, targetExe); *(strrchr(workdir, '\\')) = '\0'; // Start the game STARTUPINFO si; ZeroMemory(&si, sizeof(si)); PROCESS_INFORMATION pi; si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); if (!CreateProcessA( NULL, cmdline, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, workdir, &si, &pi )) { char message[64]; sprintf(message, "Failed to start game process: %ld", GetLastError()); MessageBoxA(NULL, message, "Jadeite Launcher Payload", MB_OK | MB_ICONERROR); exit(1); } // Inject void *payloadStart = &_binary_lpayload_o_p_payload_bin_start; size_t payloadSize = (size_t)&_binary_lpayload_o_p_payload_bin_size; inject(pi.hProcess, payloadStart, payloadSize, injectDll); // Optional: wait for user input before resuming (useful for debugging) char *waitEnabled = getenv("WAIT_BEFORE_RESUME"); if (waitEnabled && strcmp(waitEnabled, "") != 0) { char message[64]; sprintf(message, "PID: %ld. Press OK to continue", pi.dwProcessId); MessageBoxA(NULL, message, "Jadeite Launcher Payload", MB_OK | MB_ICONINFORMATION); } // Resume the process ResumeThread(pi.hThread); // The launcher process should now hang untill the game terminates WaitForSingleObject(pi.hProcess, INFINITE); return TRUE; }