[FIX] Влезаем в лаунчер через agent. (#202)

* [FIX] Правки градла.

* [FEATURE] Скрипт для скачивания.

* [DOCS] Правки readme.

* [FIX][DOCS] Удален неактуальная папка docs.

* [DOCS] Готов readme.

* [FIX] Launcher sign.

* [FEATURE] Модули по новому.

* [FIX] Способ влезть в лаунчер через agent.

* [ANY] Обновлены модули (там фикс JarSigner).

* [FEATURE] ListDownloader.
This commit is contained in:
Zaxar163 2019-03-28 11:54:18 +03:00 committed by Gravit
parent 0194ab7a5b
commit 695758aa18
11 changed files with 81 additions and 48 deletions

View file

@ -1,6 +1,8 @@
def mainClassName = "ru.gravit.launchserver.LaunchServer" def mainClassName = "ru.gravit.launchserver.LaunchServer"
def mainAgentName = "ru.gravit.launchserver.StarterAgent" def mainAgentName = "ru.gravit.launchserver.StarterAgent"
evaluationDependsOn(':Launcher')
repositories { repositories {
maven { maven {
url "https://oss.sonatype.org/content/repositories/snapshots" url "https://oss.sonatype.org/content/repositories/snapshots"

View file

@ -15,6 +15,8 @@
import java.util.List; import java.util.List;
public class ClientLauncherWrapper { public class ClientLauncherWrapper {
public static final String MAGIC_ARG = "-Djdk.attach.allowAttachSelf";
public static void main(String[] arguments) throws IOException, InterruptedException { public static void main(String[] arguments) throws IOException, InterruptedException {
LogHelper.printVersion("Launcher"); LogHelper.printVersion("Launcher");
LogHelper.printLicense("Launcher"); LogHelper.printLicense("Launcher");
@ -36,6 +38,8 @@ public static void main(String[] arguments) throws IOException, InterruptedExcep
JVMHelper.addSystemPropertyToArgs(args, DirBridge.CUSTOMDIR_PROPERTY); JVMHelper.addSystemPropertyToArgs(args, DirBridge.CUSTOMDIR_PROPERTY);
JVMHelper.addSystemPropertyToArgs(args, DirBridge.USE_CUSTOMDIR_PROPERTY); JVMHelper.addSystemPropertyToArgs(args, DirBridge.USE_CUSTOMDIR_PROPERTY);
JVMHelper.addSystemPropertyToArgs(args, DirBridge.USE_OPTDIR_PROPERTY); JVMHelper.addSystemPropertyToArgs(args, DirBridge.USE_OPTDIR_PROPERTY);
Collections.addAll(args, MAGIC_ARG);
Collections.addAll(args, "-XX:+DisableAttachMechanism");
Collections.addAll(args, "-javaagent:".concat(pathLauncher)); Collections.addAll(args, "-javaagent:".concat(pathLauncher));
Collections.addAll(args, "-cp"); Collections.addAll(args, "-cp");
Collections.addAll(args, pathLauncher); Collections.addAll(args, pathLauncher);

View file

@ -11,6 +11,7 @@
import ru.gravit.launcher.profiles.ClientProfile; import ru.gravit.launcher.profiles.ClientProfile;
import ru.gravit.launcher.profiles.PlayerProfile; import ru.gravit.launcher.profiles.PlayerProfile;
import ru.gravit.launcher.request.Request; import ru.gravit.launcher.request.Request;
import ru.gravit.launcher.request.update.LegacyLauncherRequest;
import ru.gravit.launcher.serialize.HInput; import ru.gravit.launcher.serialize.HInput;
import ru.gravit.launcher.serialize.HOutput; import ru.gravit.launcher.serialize.HOutput;
import ru.gravit.launcher.serialize.stream.StreamObject; import ru.gravit.launcher.serialize.stream.StreamObject;
@ -34,8 +35,6 @@
import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.PosixFilePermission; import java.nio.file.attribute.PosixFilePermission;
import java.util.*; import java.util.*;
import java.util.Timer;
import java.util.concurrent.TimeUnit;
public final class ClientLauncher { public final class ClientLauncher {
private static Gson gson = new Gson(); private static Gson gson = new Gson();
@ -301,7 +300,6 @@ private static void launch(ClientProfile profile, Params params) throws Throwabl
public static Process launch( public static Process launch(
HashedDir assetHDir, HashedDir clientHDir, HashedDir assetHDir, HashedDir clientHDir,
ClientProfile profile, Params params, boolean pipeOutput) throws Throwable { ClientProfile profile, Params params, boolean pipeOutput) throws Throwable {
// Write params file (instead of CLI; Mustdie32 API can't handle command line > 32767 chars)
LogHelper.debug("Writing ClientLauncher params"); LogHelper.debug("Writing ClientLauncher params");
ClientLauncherContext context = new ClientLauncherContext(); ClientLauncherContext context = new ClientLauncherContext();
clientStarted = false; clientStarted = false;
@ -368,6 +366,7 @@ public static Process launch(
// Add classpath and main class // Add classpath and main class
String pathLauncher = IOHelper.getCodeSource(ClientLauncher.class).toString(); String pathLauncher = IOHelper.getCodeSource(ClientLauncher.class).toString();
context.pathLauncher = pathLauncher; context.pathLauncher = pathLauncher;
Collections.addAll(context.args, ClientLauncherWrapper.MAGIC_ARG);
Collections.addAll(context.args, profile.getJvmArgs()); Collections.addAll(context.args, profile.getJvmArgs());
profile.pushOptionalJvmArgs(context.args); profile.pushOptionalJvmArgs(context.args);
Collections.addAll(context.args, "-Djava.library.path=".concat(params.clientDir.resolve(NATIVES_DIR).toString())); // Add Native Path Collections.addAll(context.args, "-Djava.library.path=".concat(params.clientDir.resolve(NATIVES_DIR).toString())); // Add Native Path
@ -434,7 +433,6 @@ public static void main(String... args) throws Throwable {
engine.runtimeProvider.init(true); engine.runtimeProvider.init(true);
engine.runtimeProvider.preLoad(); engine.runtimeProvider.preLoad();
LauncherGuardManager.initGuard(true); LauncherGuardManager.initGuard(true);
// Read and delete params file
LogHelper.debug("Reading ClientLauncher params"); LogHelper.debug("Reading ClientLauncher params");
Params params; Params params;
ClientProfile profile; ClientProfile profile;
@ -445,8 +443,6 @@ public static void main(String... args) throws Throwable {
try (HInput input = new HInput(socket.getInputStream())) { try (HInput input = new HInput(socket.getInputStream())) {
params = new Params(input); params = new Params(input);
profile = gson.fromJson(input.readString(0), ClientProfile.class); profile = gson.fromJson(input.readString(0), ClientProfile.class);
// Read hdirs
assetHDir = new HashedDir(input); assetHDir = new HashedDir(input);
clientHDir = new HashedDir(input); clientHDir = new HashedDir(input);
} }
@ -462,8 +458,8 @@ public static void main(String... args) throws Throwable {
Launcher.modulesManager.initModules(); Launcher.modulesManager.initModules();
// Verify ClientLauncher sign and classpath // Verify ClientLauncher sign and classpath
LogHelper.debug("Verifying ClientLauncher sign and classpath"); LogHelper.debug("Verifying ClientLauncher sign and classpath");
//TODO: GO TO DIGEST //Warning - experimental.
//SecurityHelper.verifySign(LegacyLauncherRequest.BINARY_PATH, params.launcherDigest, publicKey); SecurityHelper.verifySign(LegacyLauncherRequest.BINARY_PATH, params.launcherDigest, Launcher.getConfig().publicKey);
LinkedList<Path> classPath = resolveClassPathList(params.clientDir, profile.getClassPath()); LinkedList<Path> classPath = resolveClassPathList(params.clientDir, profile.getClassPath());
for (Path classpathURL : classPath) { for (Path classpathURL : classPath) {
LauncherAgent.addJVMClassPath(classpathURL.toAbsolutePath().toString()); LauncherAgent.addJVMClassPath(classpathURL.toAbsolutePath().toString());

View file

@ -4,6 +4,7 @@
dependencies { dependencies {
compile project(':libLauncher') compile project(':libLauncher')
compile 'org.java-websocket:Java-WebSocket:1.3.9' compile 'org.java-websocket:Java-WebSocket:1.3.9'
compile 'org.apache.httpcomponents:httpclient:4.5.7'
compileOnly 'com.google.guava:guava:26.0-jre' compileOnly 'com.google.guava:guava:26.0-jre'
compile files('../compat/authlib/authlib-clean.jar') compile files('../compat/authlib/authlib-clean.jar')
} }

View file

@ -0,0 +1,52 @@
package ru.gravit.launcher.downloader;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Path;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.LaxRedirectStrategy;
import ru.gravit.utils.helper.IOHelper;
public class ListDownloader {
public void download(String base, List<String> applies, Path dstDirFile) throws IOException, URISyntaxException {
try(CloseableHttpClient httpclient = HttpClients.custom()
.setRedirectStrategy(new LaxRedirectStrategy())
.build()) {
HttpGet get = null;
for (String apply : applies) {
URI u = new URL(base.concat(apply)).toURI();
if (get == null) get = new HttpGet(u);
else {
get.reset();
get.setURI(u);
}
httpclient.execute(get, new FileDownloadResponseHandler(dstDirFile.resolve(apply)));
}
}
}
static class FileDownloadResponseHandler implements ResponseHandler<Path> {
private final Path target;
public FileDownloadResponseHandler(Path target) {
this.target = target;
}
@Override
public Path handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
InputStream source = response.getEntity().getContent();
IOHelper.transfer(source, this.target);
return this.target;
}
}
}

View file

@ -1,4 +1,9 @@
# Modification of the launcher sashok724's v3 from Gravit [![Build Status](https://travis-ci.com/GravitLauncher/Launcher.svg?branch=master)](https://travis-ci.com/GravitLauncher/Launcher) # Modification of the launcher sashok724's v3 from Gravit [![Build Status](https://travis-ci.com/GravitLauncher/Launcher.svg?branch=master)](https://travis-ci.com/GravitLauncher/Launcher)
* Discord channel: https://discord.gg/aJK6nMN * Discord channel: https://discord.gg/aJK6nMN
* [See license](LICENSE) * [See license](LICENSE)
* Changes: [ru-ru](docs/RU-changes.md#Изменения) [en-us](docs/EN-changes.md#changes) * [See code of conduct](CODE_OF_CONDUCT.md)
* [WIKI](https://launcher.gravit.pro)
* Get it (requires cURL):
```sh
curl -s https://raw.githubusercontent.com/GravitLauncher/Launcher/master/get_it.sh | sh
```

View file

@ -1,19 +0,0 @@
# Changes
* Build with Gradle
* The code is free of many dirty "hacks" that depend on the implementation and undocumented features of a particular JVM
* Removed JVM installation
* Brute-force attack protection
* Launcher compiles and runs with JDK 10
* Patched launchwrapper with Java 10 support
* ClassPath is not visible in the start line
* Symlinks are fully allowed without restrictions
* Removed an undocumented feature which allowed to use JavaScript plugins on server side
* Various improvements and bugfixes
* Split into 5 modules instead of two
* The old bypasses don't work
* Partially modified structure of the classes
* Bug fixes in the main branch of the launcher
* Ability to install different skins on different servers
* Send HWID
* Flexible exe settings when building
* And much more!

View file

@ -1,19 +0,0 @@
# Изменения
* Сборка Gradle
* Код избавлен от множества грязных "хаков", зависящих от реализации и недокументированных особенностей конкретной JVM
* Вырезана установка своей JVM
* Защита от брута пароля
* Лаунчер комплируется и запускается с JDK 10
* Патч launchwrapper с поддержкой Java 10
* ClassPath не виден в строке запуска
* Полностью разрешены симлинки без ограничений
* Вырезана недокументированная возможность использования JavaScript плагинов на стороне сервера
* Различные исправления и доработки
* Разбиение на 5 модулей вместо двух
* Старые обходы не работают
* Частично изменена структура классов
* Исправления багов из основной ветки лаунчера
* Возможность устанавливать разные скины на разные сервера
* Отправка HWID
* Гибкая настройка параметров exe при сборке
* И многое другое!

4
get_it.sh Executable file
View file

@ -0,0 +1,4 @@
#!/bin/sh
git clone https://github.com/GravitLauncher/Launcher.git
sed -i 's/git@github.com:/https:\/\/github.com\//' .gitmodules
git submodule update --init --recursive

7
module.gradle Normal file
View file

@ -0,0 +1,7 @@
dependencies {
compileOnly project(':LaunchServer')
}
jar {
from { configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) } }
}

@ -1 +1 @@
Subproject commit be22f5b74912bda8df26ce888af994f330cc8934 Subproject commit 8df678bed74b671ba0f0866f8f215fd42e467c03