[FEATURE] Update guard interface

This commit is contained in:
Gravit 2020-03-30 09:52:00 +07:00
parent 144b15701b
commit 8e1cf303ac
No known key found for this signature in database
GPG key ID: 061981E1E85D3216
10 changed files with 47 additions and 255 deletions

View file

@ -4,7 +4,10 @@
import pro.gravit.launcher.client.events.ClientEngineInitPhase; import pro.gravit.launcher.client.events.ClientEngineInitPhase;
import pro.gravit.launcher.client.events.ClientExitPhase; import pro.gravit.launcher.client.events.ClientExitPhase;
import pro.gravit.launcher.client.events.ClientPreGuiPhase; import pro.gravit.launcher.client.events.ClientPreGuiPhase;
import pro.gravit.launcher.guard.LauncherGuardInterface;
import pro.gravit.launcher.guard.LauncherGuardManager; import pro.gravit.launcher.guard.LauncherGuardManager;
import pro.gravit.launcher.guard.LauncherNoGuard;
import pro.gravit.launcher.guard.LauncherWrapperGuard;
import pro.gravit.launcher.gui.NoRuntimeProvider; import pro.gravit.launcher.gui.NoRuntimeProvider;
import pro.gravit.launcher.gui.RuntimeProvider; import pro.gravit.launcher.gui.RuntimeProvider;
import pro.gravit.launcher.managers.ClientGsonManager; import pro.gravit.launcher.managers.ClientGsonManager;
@ -40,6 +43,7 @@ public static X509Certificate[] getCertificates(Class<?> clazz) {
public static final AtomicBoolean IS_CLIENT = new AtomicBoolean(false); public static final AtomicBoolean IS_CLIENT = new AtomicBoolean(false);
public static ClientLauncherProcess.ClientParams clientParams; public static ClientLauncherProcess.ClientParams clientParams;
public static LauncherGuardInterface guard;
public static void checkClass(Class<?> clazz) throws SecurityException { public static void checkClass(Class<?> clazz) throws SecurityException {
LauncherTrustManager trustManager = Launcher.getConfig().trustManager; LauncherTrustManager trustManager = Launcher.getConfig().trustManager;
@ -146,6 +150,7 @@ private LauncherEngine() {
public void start(String... args) throws Throwable { public void start(String... args) throws Throwable {
//Launcher.modulesManager = new ClientModuleManager(this); //Launcher.modulesManager = new ClientModuleManager(this);
LauncherEngine.guard = tryGetStdGuard();
ClientPreGuiPhase event = new ClientPreGuiPhase(null); ClientPreGuiPhase event = new ClientPreGuiPhase(null);
LauncherEngine.modulesManager.invokeEvent(event); LauncherEngine.modulesManager.invokeEvent(event);
runtimeProvider = event.runtimeProvider; runtimeProvider = event.runtimeProvider;
@ -186,6 +191,18 @@ public void start(String... args) throws Throwable {
runtimeProvider.run(args); runtimeProvider.run(args);
} }
public static LauncherGuardInterface tryGetStdGuard()
{
switch (Launcher.getConfig().guardType)
{
case "no":
return new LauncherNoGuard();
case "wrapper":
return new LauncherWrapperGuard();
}
return null;
}
public static LauncherEngine clientInstance() { public static LauncherEngine clientInstance() {
return new LauncherEngine(); return new LauncherEngine();
} }

View file

@ -41,14 +41,9 @@
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@Deprecated
public final class ClientLauncher { public final class ClientLauncher {
public static int getClientJVMBits() {
return LauncherGuardManager.guard.getClientJVMBits();
}
private static final class ClassPathFileVisitor extends SimpleFileVisitor<Path> { private static final class ClassPathFileVisitor extends SimpleFileVisitor<Path> {
private final Stream.Builder<Path> result; private final Stream.Builder<Path> result;
@ -336,7 +331,7 @@ public static Process launch(
container.write(new ParamContainer(params, profile, assetHDir, clientHDir)); container.write(new ParamContainer(params, profile, assetHDir, clientHDir));
checkJVMBitsAndVersion(); checkJVMBitsAndVersion();
LogHelper.debug("Resolving JVM binary"); LogHelper.debug("Resolving JVM binary");
Path javaBin = LauncherGuardManager.getGuardJavaBinPath(); Path javaBin = null;
context.javaBin = javaBin; context.javaBin = javaBin;
context.clientProfile = profile; context.clientProfile = profile;
context.playerProfile = params.pp; context.playerProfile = params.pp;
@ -369,7 +364,6 @@ public static Process launch(
context.args.add("-Djava.library.path=".concat(params.clientDir.resolve(NATIVES_DIR).toString())); // Add Native Path context.args.add("-Djava.library.path=".concat(params.clientDir.resolve(NATIVES_DIR).toString())); // Add Native Path
//context.args.add("-javaagent:".concat(pathLauncher)); //context.args.add("-javaagent:".concat(pathLauncher));
ClientHookManager.clientLaunchHook.hook(context); ClientHookManager.clientLaunchHook.hook(context);
LauncherGuardManager.guard.addCustomParams(context);
context.args.add(ClientLauncher.class.getName()); context.args.add(ClientLauncher.class.getName());
ClientHookManager.clientLaunchFinallyHook.hook(context); ClientHookManager.clientLaunchFinallyHook.hook(context);
@ -380,7 +374,6 @@ public static Process launch(
LogHelper.debug("Launching client instance"); LogHelper.debug("Launching client instance");
ProcessBuilder builder = new ProcessBuilder(context.args); ProcessBuilder builder = new ProcessBuilder(context.args);
context.builder = builder; context.builder = builder;
LauncherGuardManager.guard.addCustomEnv(context);
//else //else
//builder.environment().put("CLASSPATH", classPathString.toString()); //builder.environment().put("CLASSPATH", classPathString.toString());
EnvHelper.addEnv(builder); EnvHelper.addEnv(builder);

View file

@ -6,7 +6,7 @@
import java.nio.file.Path; import java.nio.file.Path;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
@Deprecated
public class ClientLauncherContext { public class ClientLauncherContext {
public Path javaBin; public Path javaBin;
public final List<String> args = new LinkedList<>(); public final List<String> args = new LinkedList<>();

View file

@ -1,6 +1,8 @@
package pro.gravit.launcher.client; package pro.gravit.launcher.client;
import pro.gravit.launcher.Launcher; import pro.gravit.launcher.Launcher;
import pro.gravit.launcher.LauncherEngine;
import pro.gravit.launcher.guard.LauncherGuardInterface;
import pro.gravit.launcher.guard.LauncherGuardManager; import pro.gravit.launcher.guard.LauncherGuardManager;
import pro.gravit.launcher.hasher.HashedDir; import pro.gravit.launcher.hasher.HashedDir;
import pro.gravit.launcher.profiles.ClientProfile; import pro.gravit.launcher.profiles.ClientProfile;
@ -24,9 +26,9 @@
public class ClientLauncherProcess { public class ClientLauncherProcess {
private transient Process process; private transient Process process;
private final transient Boolean[] waitWriteParams = new Boolean[] {false}; private final transient Boolean[] waitWriteParams = new Boolean[] {false};
public final Path executeFile; public Path executeFile;
public final Path workDir; public Path workDir;
public final Path javaDir; public Path javaDir;
public final ClientParams params = new ClientParams(); public final ClientParams params = new ClientParams();
public final List<String> jvmArgs = new LinkedList<>(); public final List<String> jvmArgs = new LinkedList<>();
public final List<String> systemClientArgs = new LinkedList<>(); public final List<String> systemClientArgs = new LinkedList<>();
@ -42,18 +44,24 @@ public ClientLauncherProcess(Path executeFile, Path workDir, Path javaDir, Strin
this.mainClass = mainClass; this.mainClass = mainClass;
} }
public ClientLauncherProcess(Path clientDir, Path assetDir, Path javaDir,
ClientProfile profile, PlayerProfile playerProfile, String accessToken,
HashedDir clientHDir, HashedDir assetHDir, HashedDir jvmHDir) {
this(clientDir, assetDir, javaDir, clientDir.resolve("resourcepacks"), profile, playerProfile, accessToken, clientHDir, assetHDir, jvmHDir);
}
public ClientLauncherProcess(Path clientDir, Path assetDir, public ClientLauncherProcess(Path clientDir, Path assetDir,
ClientProfile profile, PlayerProfile playerProfile, String accessToken, ClientProfile profile, PlayerProfile playerProfile, String accessToken,
HashedDir clientHDir, HashedDir assetHDir, HashedDir jvmHDir) { HashedDir clientHDir, HashedDir assetHDir, HashedDir jvmHDir) {
this(clientDir, assetDir, clientDir.resolve("resourcepacks"), profile, playerProfile, accessToken, clientHDir, assetHDir, jvmHDir); this(clientDir, assetDir, Paths.get(System.getProperty("java.home")), clientDir.resolve("resourcepacks"), profile, playerProfile, accessToken, clientHDir, assetHDir, jvmHDir);
} }
public ClientLauncherProcess(Path clientDir, Path assetDir, Path resourcePackDir, public ClientLauncherProcess(Path clientDir, Path assetDir, Path javaDir, Path resourcePackDir,
ClientProfile profile, PlayerProfile playerProfile, String accessToken, ClientProfile profile, PlayerProfile playerProfile, String accessToken,
HashedDir clientHDir, HashedDir assetHDir, HashedDir jvmHDir) { HashedDir clientHDir, HashedDir assetHDir, HashedDir jvmHDir) {
this.executeFile = LauncherGuardManager.getGuardJavaBinPath();
this.workDir = clientDir.toAbsolutePath(); this.workDir = clientDir.toAbsolutePath();
this.javaDir = Paths.get(System.getProperty("java.home")); this.javaDir = javaDir;
this.executeFile = IOHelper.resolveJavaBin(this.javaDir);
this.mainClass = ClientLauncherEntryPoint.class.getName(); this.mainClass = ClientLauncherEntryPoint.class.getName();
this.params.clientDir = this.workDir.toString(); this.params.clientDir = this.workDir.toString();
this.params.resourcePackDir = resourcePackDir.toAbsolutePath().toString(); this.params.resourcePackDir = resourcePackDir.toAbsolutePath().toString();
@ -193,6 +201,7 @@ private void addModernClientArgs(Collection<String> args) {
} }
public void start(boolean pipeOutput) throws IOException, InterruptedException { public void start(boolean pipeOutput) throws IOException, InterruptedException {
if(isStarted) throw new IllegalStateException("Process already started"); if(isStarted) throw new IllegalStateException("Process already started");
if(LauncherEngine.guard != null) LauncherEngine.guard.applyGuardParams(this);
List<String> processArgs = new LinkedList<>(); List<String> processArgs = new LinkedList<>();
processArgs.add(executeFile.toString()); processArgs.add(executeFile.toString());
processArgs.addAll(jvmArgs); processArgs.addAll(jvmArgs);
@ -212,6 +221,7 @@ public void start(boolean pipeOutput) throws IOException, InterruptedException {
LogHelper.debug("Commandline: %s", Arrays.toString(processArgs.toArray())); LogHelper.debug("Commandline: %s", Arrays.toString(processArgs.toArray()));
ProcessBuilder processBuilder = new ProcessBuilder(processArgs); ProcessBuilder processBuilder = new ProcessBuilder(processArgs);
EnvHelper.addEnv(processBuilder); EnvHelper.addEnv(processBuilder);
processBuilder.environment().put("JAVA_HOME", javaDir.toAbsolutePath().toString());
processBuilder.environment().putAll(systemEnv); processBuilder.environment().putAll(systemEnv);
processBuilder.directory(workDir.toFile()); processBuilder.directory(workDir.toFile());
processBuilder.inheritIO(); processBuilder.inheritIO();

View file

@ -1,21 +1,9 @@
package pro.gravit.launcher.guard; package pro.gravit.launcher.guard;
import pro.gravit.launcher.client.ClientLauncherContext; import pro.gravit.launcher.client.ClientLauncherProcess;
import java.nio.file.Path;
public interface LauncherGuardInterface { public interface LauncherGuardInterface {
String getName(); String getName();
Path getJavaBinPath(); void applyGuardParams(ClientLauncherProcess process);
int getClientJVMBits();
void init(boolean clientInstance);
void addCustomParams(ClientLauncherContext context);
void addCustomEnv(ClientLauncherContext context);
void setProtectToken(String token);
} }

View file

@ -9,31 +9,5 @@ public class LauncherGuardManager {
public static LauncherGuardInterface guard; public static LauncherGuardInterface guard;
public static void initGuard(boolean clientInstance) { public static void initGuard(boolean clientInstance) {
if(guard == null)
{
LauncherConfig config = Launcher.getConfig();
switch (config.guardType) {
case "stdguard": {
guard = new LauncherStdGuard();
break;
}
case "wrapper": {
guard = new LauncherWrapperGuard();
break;
}
case "java": {
guard = new LauncherJavaGuard();
break;
}
default: {
guard = new LauncherNoGuard();
}
}
}
guard.init(clientInstance);
}
public static Path getGuardJavaBinPath() {
return guard.getJavaBinPath();
} }
} }

View file

@ -1,51 +0,0 @@
package pro.gravit.launcher.guard;
import pro.gravit.launcher.client.ClientLauncher;
import pro.gravit.launcher.client.ClientLauncherContext;
import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.JVMHelper;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections;
public class LauncherJavaGuard implements LauncherGuardInterface {
@Override
public String getName() {
return "java";
}
@Override
public Path getJavaBinPath() {
if (JVMHelper.OS_TYPE == JVMHelper.OS.MUSTDIE)
return IOHelper.resolveJavaBin(ClientLauncher.getJavaBinPath());
else
return IOHelper.resolveJavaBin(Paths.get(System.getProperty("java.home")));
}
@Override
public int getClientJVMBits() {
return JVMHelper.OS_BITS;
}
@Override
public void init(boolean clientInstance) {
}
@Override
public void addCustomParams(ClientLauncherContext context) {
Collections.addAll(context.args, "-cp");
Collections.addAll(context.args, context.pathLauncher);
}
@Override
public void addCustomEnv(ClientLauncherContext context) {
}
@Override
public void setProtectToken(String token) {
//Skip
}
}

View file

@ -1,6 +1,7 @@
package pro.gravit.launcher.guard; package pro.gravit.launcher.guard;
import pro.gravit.launcher.client.ClientLauncherContext; import pro.gravit.launcher.client.ClientLauncherContext;
import pro.gravit.launcher.client.ClientLauncherProcess;
import pro.gravit.utils.helper.IOHelper; import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.JVMHelper; import pro.gravit.utils.helper.JVMHelper;
import pro.gravit.utils.helper.LogHelper; import pro.gravit.utils.helper.LogHelper;
@ -16,33 +17,7 @@ public String getName() {
} }
@Override @Override
public Path getJavaBinPath() { public void applyGuardParams(ClientLauncherProcess process) {
return IOHelper.resolveJavaBin(Paths.get(System.getProperty("java.home"))); //IGNORED
}
@Override
public int getClientJVMBits() {
return JVMHelper.JVM_BITS;
}
@Override
public void init(boolean clientInstance) {
LogHelper.warning("Using noGuard interface");
}
@Override
public void addCustomParams(ClientLauncherContext context) {
Collections.addAll(context.args, "-cp");
Collections.addAll(context.args, context.pathLauncher);
}
@Override
public void addCustomEnv(ClientLauncherContext context) {
}
@Override
public void setProtectToken(String token) {
//Skip
} }
} }

View file

@ -1,85 +0,0 @@
package pro.gravit.launcher.guard;
import pro.gravit.launcher.Launcher;
import pro.gravit.launcher.LauncherConfig;
import pro.gravit.launcher.client.ClientLauncher;
import pro.gravit.launcher.client.ClientLauncherContext;
import pro.gravit.launcher.client.DirBridge;
import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.JVMHelper;
import pro.gravit.utils.helper.UnpackHelper;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections;
import java.util.Map;
//Стандартный интерфейс для всех AntiInject
public class LauncherStdGuard implements LauncherGuardInterface {
public String protectToken;
public Path javaBinPath;
@Override
public String getName() {
return "stdguard";
}
@Override
public Path getJavaBinPath() {
if (JVMHelper.OS_TYPE == JVMHelper.OS.MUSTDIE) {
javaBinPath = ClientLauncher.getJavaBinPath();
String projectName = Launcher.getConfig().projectName;
String wrapperUnpackName = (javaBinPath == null ? JVMHelper.JVM_BITS : JVMHelper.OS_BITS) == 64 ? projectName.concat("64.exe") : projectName.concat("32.exe");
return DirBridge.getGuardDir().resolve(wrapperUnpackName);
} else
return IOHelper.resolveJavaBin(Paths.get(System.getProperty("java.home")));
}
@Override
public int getClientJVMBits() {
//При использовании GravitGuard без своей джавы
//Если при запуске лаунчера используется 32 бит джава, а ОС 64бит
//То в окне настроек будет отображаться >1.б доступной памяти
//Однако при выставлении >1.б JVM x32 работать откажеться
return JVMHelper.OS_BITS;
}
@Override
public void init(boolean clientInstance) {
try {
String projectName = Launcher.getConfig().projectName;
UnpackHelper.unpack(Launcher.getResourceURL("wrapper64.exe", "guard"), DirBridge.getGuardDir().resolve(projectName.concat("64.exe")));
UnpackHelper.unpack(Launcher.getResourceURL("AntiInject64.dll", "guard"), DirBridge.getGuardDir().resolve("AntiInject64.dll"));
UnpackHelper.unpack(Launcher.getResourceURL("wrapper32.exe", "guard"), DirBridge.getGuardDir().resolve(projectName.concat("32.exe")));
UnpackHelper.unpack(Launcher.getResourceURL("AntiInject32.dll", "guard"), DirBridge.getGuardDir().resolve("AntiInject32.dll"));
} catch (IOException e) {
throw new SecurityException(e);
}
}
@Override
public void addCustomParams(ClientLauncherContext context) {
Collections.addAll(context.args, "-Djava.class.path=".concat(context.pathLauncher));
}
@Override
public void addCustomEnv(ClientLauncherContext context) {
Map<String, String> env = context.builder.environment();
if (javaBinPath == null)
env.put("JAVA_HOME", System.getProperty("java.home"));
else
env.put("JAVA_HOME", javaBinPath.toAbsolutePath().toString());
LauncherConfig config = Launcher.getConfig();
env.put("GUARD_USERNAME", context.playerProfile.username);
env.put("GUARD_PROJECTNAME", config.projectName);
if (protectToken != null)
env.put("GUARD_TOKEN", protectToken);
}
@Override
public void setProtectToken(String token) {
protectToken = token;
}
}

View file

@ -3,6 +3,7 @@
import pro.gravit.launcher.Launcher; import pro.gravit.launcher.Launcher;
import pro.gravit.launcher.LauncherConfig; import pro.gravit.launcher.LauncherConfig;
import pro.gravit.launcher.client.ClientLauncherContext; import pro.gravit.launcher.client.ClientLauncherContext;
import pro.gravit.launcher.client.ClientLauncherProcess;
import pro.gravit.launcher.client.DirBridge; import pro.gravit.launcher.client.DirBridge;
import pro.gravit.utils.helper.IOHelper; import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.JVMHelper; import pro.gravit.utils.helper.JVMHelper;
@ -16,30 +17,21 @@
public class LauncherWrapperGuard implements LauncherGuardInterface { public class LauncherWrapperGuard implements LauncherGuardInterface {
public String protectToken;
@Override @Override
public String getName() { public String getName() {
return "wrapper"; return "wrapper";
} }
@Override @Override
public Path getJavaBinPath() { public void applyGuardParams(ClientLauncherProcess process) {
if (JVMHelper.OS_TYPE == JVMHelper.OS.MUSTDIE) { if (JVMHelper.OS_TYPE == JVMHelper.OS.MUSTDIE) {
String projectName = Launcher.getConfig().projectName; String projectName = Launcher.getConfig().projectName;
String wrapperUnpackName = JVMHelper.JVM_BITS == 64 ? projectName.concat("64.exe") : projectName.concat("32.exe"); String wrapperUnpackName = JVMHelper.JVM_BITS == 64 ? projectName.concat("64.exe") : projectName.concat("32.exe");
return DirBridge.getGuardDir().resolve(wrapperUnpackName); process.executeFile = DirBridge.getGuardDir().resolve(wrapperUnpackName);
} else }
return IOHelper.resolveJavaBin(Paths.get(System.getProperty("java.home")));
} }
@Override public LauncherWrapperGuard() {
public int getClientJVMBits() {
return JVMHelper.JVM_BITS;
}
@Override
public void init(boolean clientInstance) {
try { try {
String wrapperName = JVMHelper.JVM_BITS == 64 ? "wrapper64.exe" : "wrapper32.exe"; String wrapperName = JVMHelper.JVM_BITS == 64 ? "wrapper64.exe" : "wrapper32.exe";
String projectName = Launcher.getConfig().projectName; String projectName = Launcher.getConfig().projectName;
@ -51,25 +43,4 @@ public void init(boolean clientInstance) {
throw new SecurityException(e); throw new SecurityException(e);
} }
} }
@Override
public void addCustomParams(ClientLauncherContext context) {
Collections.addAll(context.args, "-Djava.class.path=".concat(context.pathLauncher));
}
@Override
public void addCustomEnv(ClientLauncherContext context) {
Map<String, String> env = context.builder.environment();
env.put("JAVA_HOME", System.getProperty("java.home"));
LauncherConfig config = Launcher.getConfig();
env.put("GUARD_USERNAME", context.playerProfile.username);
env.put("GUARD_PROJECTNAME", config.projectName);
if (protectToken != null)
env.put("GUARD_TOKEN", protectToken);
}
@Override
public void setProtectToken(String token) {
protectToken = token;
}
} }