#include #include #include const char LAUNCHER_INJECT_DLL[] = "launcher_payload.dll"; const char GAME_INJECT_DLL[] = "game_payload.dll"; int main(int argc, char **argv) { // Read arguments char *gamePath = NULL; char *launcherPath = NULL; switch (argc) { case 1: printf("Usage: wine jadeite.exe [game path] \n"); return 0; case 2: printf("No launcher process specified! Using explorer.exe\n"); gamePath = argv[1]; launcherPath = "C:\\Windows\\explorer.exe"; break; case 3: gamePath = argv[1]; launcherPath = argv[2]; break; default: fprintf(stderr, "Too many arguments! (%d)\n", argc); return 1; } // cd into the injector directory char injectorPath[MAX_PATH]; GetModuleFileNameA(GetModuleHandleA(NULL), injectorPath, sizeof(injectorPath)); char *lastSep = strrchr(injectorPath, '\\'); *lastSep = '\0'; SetCurrentDirectoryA(injectorPath); // Compute absolute paths char gameExePath[MAX_PATH]; GetFullPathNameA(gamePath, sizeof(gameExePath), gameExePath, NULL); char gamePayloadPath[MAX_PATH]; GetFullPathNameA(GAME_INJECT_DLL, sizeof(gamePayloadPath), gamePayloadPath, NULL); char launcherPayloadPath[MAX_PATH]; GetFullPathNameA(LAUNCHER_INJECT_DLL, sizeof(launcherPayloadPath), launcherPayloadPath, NULL); printf("Starting \"%s\" via \"%s\"\n", gameExePath, launcherPath); // Set envvars SetEnvironmentVariableA(ENV_EXE_PATH, gameExePath); SetEnvironmentVariableA(ENV_DLL_PATH, gamePayloadPath); // Start the launcher STARTUPINFO si; ZeroMemory(&si, sizeof(si)); PROCESS_INFORMATION pi; si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); if (!CreateProcessA( launcherPath, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi )) { fprintf(stderr, "Could not start process! (%ld)\n", GetLastError()); exit(1); } printf("Started launcher process (%ld)\n", pi.dwProcessId); // Inject void *payloadStart = &_binary_ipayload_o_p_payload_bin_start; size_t payloadSize = (size_t)&_binary_ipayload_o_p_payload_bin_size; // yes this is valid inject(pi.hProcess, payloadStart, payloadSize, launcherPayloadPath); // Resume the process ResumeThread(pi.hThread); return 0; }