4 Commits

Author SHA1 Message Date
326ccd188e v1.1.2 2023-06-11 18:05:58 +03:00
0b0216e41e Pass commandline arguments to the game process
Closes #4
2023-06-11 18:04:24 +03:00
4c0c35ba43 Mark HSR unsafe for third-party launchers 2023-06-10 19:39:57 +03:00
e299d264de Don't include metadata.json in the release archives 2023-06-10 19:37:09 +03:00
7 changed files with 54 additions and 20 deletions

View File

@ -29,6 +29,8 @@ Manual usage instructions:
This tool is capable of starting the games from a different process. This may be useful for spoofing the parent process (SR is known to report it). Use `wine jadeite.exe 'Z:\wine\path\to\game.exe' 'Z:\wine\path\to\launcher.exe'`. `explorer.exe` is used as the default. This tool is capable of starting the games from a different process. This may be useful for spoofing the parent process (SR is known to report it). Use `wine jadeite.exe 'Z:\wine\path\to\game.exe' 'Z:\wine\path\to\launcher.exe'`. `explorer.exe` is used as the default.
To pass commandline arguments to the game, append them after the launcher path: `wine jadeite.exe 'Z:\wine\path\to\game.exe' 'Z:\wine\path\to\launcher.exe' -arg1 -arg2 -arg3`. To use the default launcher process, use `--`: `wine jadeite.exe 'Z:\wine\path\to\game.exe' -- -arg1 -arg2 -arg3`.
### Configuration ### Configuration
These environment variables can be used to configure the behaviour of the tool. These environment variables can be used to configure the behaviour of the tool.

View File

@ -14,7 +14,6 @@ cp ./build/injector/jadeite.exe ./out
cp ./build/injector/launcher_payload/launcher_payload.dll ./out cp ./build/injector/launcher_payload/launcher_payload.dll ./out
cp ./build/game_payload/game_payload.dll ./out cp ./build/game_payload/game_payload.dll ./out
cp ./LICENSE.txt ./out cp ./LICENSE.txt ./out
cp ./metadata.json ./out
$strip ./out/*.{exe,dll} $strip ./out/*.{exe,dll}

View File

@ -1,7 +1,10 @@
#include <windows.h> #include <windows.h>
const char ENV_EXE_PATH[] = "JADEITE_TARGET_EXE_PATH"; #define EPFX "__JADEITE_"
const char ENV_DLL_PATH[] = "JADEITE_INJECT_DLL_PATH";
const char ENV_EXE_PATH[] = EPFX"TARGET_EXE_PATH";
const char ENV_DLL_PATH[] = EPFX"INJECT_DLL_PATH";
const char ENV_PROC_CMD[] = EPFX"PROCESS_COMMAND";
static inline void write_protected_process_memory(HANDLE process, void *address, const void *buf, size_t size) { static inline void write_protected_process_memory(HANDLE process, void *address, const void *buf, size_t size) {
DWORD oldProtect; DWORD oldProtect;

View File

@ -16,6 +16,9 @@ BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved) {
// Get the path of the DLL to inject // Get the path of the DLL to inject
char *injectDll = getenv(ENV_DLL_PATH); char *injectDll = getenv(ENV_DLL_PATH);
// Get game commandline
char *cmdline = getenv(ENV_PROC_CMD);
// Compute the working directory path // Compute the working directory path
char workdir[MAX_PATH]; char workdir[MAX_PATH];
strcpy(workdir, targetExe); strcpy(workdir, targetExe);
@ -30,8 +33,8 @@ BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved) {
ZeroMemory(&pi, sizeof(pi)); ZeroMemory(&pi, sizeof(pi));
if (!CreateProcessA( if (!CreateProcessA(
targetExe,
NULL, NULL,
cmdline,
NULL, NULL,
NULL, NULL,
FALSE, FALSE,

View File

@ -7,29 +7,43 @@
const char LAUNCHER_INJECT_DLL[] = "launcher_payload.dll"; const char LAUNCHER_INJECT_DLL[] = "launcher_payload.dll";
const char GAME_INJECT_DLL[] = "game_payload.dll"; const char GAME_INJECT_DLL[] = "game_payload.dll";
#define SHIFT(argc, argv) argc--, argv++
int main(int argc, char **argv) { int main(int argc, char **argv) {
// Read arguments // Read arguments
char *gamePath = NULL; char *gamePath = NULL;
char *launcherPath = NULL; char *launcherPath = NULL;
// Skip executable
SHIFT(argc, argv);
switch (argc) { switch (argc) {
case 1: case 0:
printf("Usage: wine jadeite.exe [game path] <launcher path>\n"); printf("Usage: wine jadeite.exe [game path] <launcher path>\n");
return 0; return 0;
case 2: case 1:
printf("No launcher process specified! Using explorer.exe\n"); gamePath = argv[0];
gamePath = argv[1]; SHIFT(argc, argv);
launcherPath = "C:\\Windows\\explorer.exe";
break; launcherPath = "--";
case 3:
gamePath = argv[1];
launcherPath = argv[2];
break; break;
default: default:
fprintf(stderr, "Too many arguments! (%d)\n", argc); gamePath = argv[0];
return 1; SHIFT(argc, argv);
launcherPath = argv[0];
SHIFT(argc, argv);
break;
} }
// Default launcher path
if (strcmp(launcherPath, "--") == 0) {
printf("No launcher process specified! Using explorer.exe\n");
launcherPath = "C:\\Windows\\explorer.exe";
}
// cd into the injector directory // cd into the injector directory
char injectorPath[MAX_PATH]; char injectorPath[MAX_PATH];
GetModuleFileNameA(GetModuleHandleA(NULL), injectorPath, sizeof(injectorPath)); GetModuleFileNameA(GetModuleHandleA(NULL), injectorPath, sizeof(injectorPath));
@ -48,13 +62,26 @@ int main(int argc, char **argv) {
char launcherPayloadPath[MAX_PATH]; char launcherPayloadPath[MAX_PATH];
GetFullPathNameA(LAUNCHER_INJECT_DLL, sizeof(launcherPayloadPath), launcherPayloadPath, NULL); GetFullPathNameA(LAUNCHER_INJECT_DLL, sizeof(launcherPayloadPath), launcherPayloadPath, NULL);
printf("Starting '%s' via '%s'\n", gameExePath, launcherPath); // Construct commandline for the game process
char cmdline[8192];
sprintf(cmdline, "\"%s\"", gameExePath);
while (argc) {
char arg[8192];
sprintf(arg, " \"%s\"", argv[0]);
strcat(cmdline, arg);
SHIFT(argc, argv);
}
// Set envvars // Set envvars
SetEnvironmentVariableA(ENV_EXE_PATH, gameExePath); SetEnvironmentVariableA(ENV_EXE_PATH, gameExePath);
SetEnvironmentVariableA(ENV_DLL_PATH, gamePayloadPath); SetEnvironmentVariableA(ENV_DLL_PATH, gamePayloadPath);
SetEnvironmentVariableA(ENV_PROC_CMD, cmdline);
// Start the launcher // Start the launcher
printf("Starting '%s' via '%s'\n", gameExePath, launcherPath);
STARTUPINFO si; STARTUPINFO si;
ZeroMemory(&si, sizeof(si)); ZeroMemory(&si, sizeof(si));

View File

@ -1,4 +1,4 @@
project('jadeite', 'c', version: '1.1.1') project('jadeite', 'c', version: '1.1.2')
nasm = find_program('nasm') nasm = find_program('nasm')
gen_res = find_program('gen_resources.sh') gen_res = find_program('gen_resources.sh')

View File

@ -1,6 +1,6 @@
{ {
"jadeite": { "jadeite": {
"version": "1.1.1" "version": "1.1.2"
}, },
"games": { "games": {
"hi3rd": { "hi3rd": {
@ -11,11 +11,11 @@
}, },
"hsr": { "hsr": {
"global": { "global": {
"status": "verified", "status": "unsafe",
"version": "1.1.0" "version": "1.1.0"
}, },
"china": { "china": {
"status": "verified", "status": "unsafe",
"version": "1.1.0" "version": "1.1.0"
} }
} }