From 908936c76c003bc48e14a2cc7491f2b9ba6afffa Mon Sep 17 00:00:00 2001 From: Alessandro Autiero Date: Tue, 27 Sep 2022 22:00:31 +0200 Subject: [PATCH] Added nullrhi option --- assets/binaries/console.dll | Bin 302592 -> 302592 bytes lib/src/controller/game_controller.dart | 7 +- lib/src/model/fortnite_version.dart | 24 +++--- lib/src/page/info_page.dart | 2 +- lib/src/util/injector.dart | 2 +- lib/src/util/patcher.dart | 40 +++++++++ lib/src/widget/add_local_version.dart | 2 +- lib/src/widget/launch_button.dart | 106 ++++++++++++++++++++---- lib/src/widget/smart_switch.dart | 4 +- lib/src/widget/version_selector.dart | 3 +- lib/test.dart | 73 ++++++++++++++++ pubspec.yaml | 5 +- 12 files changed, 226 insertions(+), 42 deletions(-) create mode 100644 lib/src/util/patcher.dart create mode 100644 lib/test.dart diff --git a/assets/binaries/console.dll b/assets/binaries/console.dll index ecb5dadd3227a298a631c45c292160f2bba3a7eb..788eee40899d7570e9bb4ef098201e0f4cb62204 100644 GIT binary patch delta 53862 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≷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 z�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 Lg{|yg=x_fU|6^0; delta 53293 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 _storage.write("host", value)); - host.listen((value) => username.text = _storage.read("${host.value ? 'host' : 'game'}_username") ?? ""); - started = RxBool(false); } diff --git a/lib/src/model/fortnite_version.dart b/lib/src/model/fortnite_version.dart index 19b7f5f..d8c91e1 100644 --- a/lib/src/model/fortnite_version.dart +++ b/lib/src/model/fortnite_version.dart @@ -12,33 +12,29 @@ class FortniteVersion { FortniteVersion({required this.name, required this.location}); - static File findExecutable(Directory directory, String name) { - if(path.basename(directory.path) == "FortniteGame"){ - return File("$directory/Binaries/Win64/$name"); - } - + static File? findExecutable(Directory directory, String name) { try{ - var gameDirectory = directory.listSync(recursive: true) - .firstWhereOrNull((element) => path.basename(element.path) == "FortniteGame"); - if(gameDirectory == null){ - return File("${directory.path}/Binaries/Win64/$name"); + var result = directory.listSync(recursive: true) + .firstWhereOrNull((element) => path.basename(element.path) == name); + if(result == null){ + return null; } - return File("${gameDirectory.path}/Binaries/Win64/$name"); + return File(result.path); }catch(_){ - return File("${directory.path}/Binaries/Win64/$name"); + return null; } } - File get executable { + File? get executable { return findExecutable(location, "FortniteClient-Win64-Shipping.exe"); } - File get launcher { + File? get launcher { return findExecutable(location, "FortniteLauncher.exe"); } - File get eacExecutable { + File? get eacExecutable { return findExecutable(location, "FortniteClient-Win64-Shipping_EAC.exe"); } diff --git a/lib/src/page/info_page.dart b/lib/src/page/info_page.dart index eab5eb4..1d79417 100644 --- a/lib/src/page/info_page.dart +++ b/lib/src/page/info_page.dart @@ -31,7 +31,7 @@ class InfoPage extends StatelessWidget { ), const Expanded( child: Align( - alignment: Alignment.bottomLeft, child: Text("Version 3.6${kDebugMode ? '-DEBUG' : ''}"))) + alignment: Alignment.bottomLeft, child: Text("Version 3.7${kDebugMode ? '-DEBUG' : ''}"))) ], ); } diff --git a/lib/src/util/injector.dart b/lib/src/util/injector.dart index d0b1676..5b24863 100644 --- a/lib/src/util/injector.dart +++ b/lib/src/util/injector.dart @@ -12,7 +12,7 @@ Future injectDll(int pid, String dll) async { var process = await shell.run("./injector.exe -p $pid --inject \"$dll\""); var success = process.outText.contains("Successfully injected module"); if (!success) { - injectLogFile.writeAsString(process.outText, mode: FileMode.append); + injectLogFile.writeAsString(process.outText); } return success; diff --git a/lib/src/util/patcher.dart b/lib/src/util/patcher.dart new file mode 100644 index 0000000..812c916 --- /dev/null +++ b/lib/src/util/patcher.dart @@ -0,0 +1,40 @@ +import 'dart:io'; +import 'dart:typed_data'; + +final Uint8List _original = Uint8List.fromList([ + 45, 0, 105, 0, 110, 0, 118, 0, 105, 0, 116, 0, 101, 0, 115, 0, 101, 0, 115, 0, 115, 0, 105, 0, 111, 0, 110, 0, 32, 0, 45, 0, 105, 0, 110, 0, 118, 0, 105, 0, 116, 0, 101, 0, 102, 0, 114, 0, 111, 0, 109, 0, 32, 0, 45, 0, 112, 0, 97, 0, 114, 0, 116, 0, 121, 0, 95, 0, 106, 0, 111, 0, 105, 0, 110, 0, 105, 0, 110, 0, 102, 0, 111, 0, 95, 0, 116, 0, 111, 0, 107, 0, 101, 0, 110, 0, 32, 0, 45, 0, 114, 0, 101, 0, 112, 0, 108, 0, 97, 0, 121, 0 +]); + +final Uint8List _patched = Uint8List.fromList([ + 45, 0, 108, 0, 111, 0, 103, 0, 32, 0, 45, 0, 110, 0, 111, 0, 115, 0, 112, 0, 108, 0, 97, 0, 115, 0, 104, 0, 32, 0, 45, 0, 110, 0, 111, 0, 115, 0, 111, 0, 117, 0, 110, 0, 100, 0, 32, 0, 45, 0, 110, 0, 117, 0, 108, 0, 108, 0, 114, 0, 104, 0, 105, 0, 32, 0, 45, 0, 117, 0, 115, 0, 101, 0, 111, 0, 108, 0, 100, 0, 105, 0, 116, 0, 101, 0, 109, 0, 99, 0, 97, 0, 114, 0, 100, 0, 115, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0 +]); + +Future patchExe(File file) async { + if(_original.length != _patched.length){ + throw Exception("Cannot mutate length of binary file"); + } + + var read = await file.readAsBytes(); + var length = await file.length(); + var offset = 0; + var counter = 0; + while(offset < length){ + if(read[offset] == _original[counter]){ + counter++; + }else { + counter = 0; + } + + offset++; + if(counter == _original.length){ + for(var index = 0; index < _patched.length; index++){ + read[offset - counter + index] = _patched[index]; + } + + await file.writeAsBytes(read, mode: FileMode.write); + return true; + } + } + + return false; +} \ No newline at end of file diff --git a/lib/src/widget/add_local_version.dart b/lib/src/widget/add_local_version.dart index a34bea6..701c50d 100644 --- a/lib/src/widget/add_local_version.dart +++ b/lib/src/widget/add_local_version.dart @@ -98,7 +98,7 @@ class AddLocalVersion extends StatelessWidget { return "Directory doesn't exist"; } - if (!FortniteVersion.findExecutable(directory, "FortniteClient-Win64-Shipping.exe").existsSync()) { + if (FortniteVersion.findExecutable(directory, "FortniteClient-Win64-Shipping.exe") == null) { return "Invalid game path"; } diff --git a/lib/src/widget/launch_button.dart b/lib/src/widget/launch_button.dart index a30b7ec..246e3e4 100644 --- a/lib/src/widget/launch_button.dart +++ b/lib/src/widget/launch_button.dart @@ -8,6 +8,7 @@ import 'package:reboot_launcher/src/controller/game_controller.dart'; import 'package:reboot_launcher/src/controller/server_controller.dart'; import 'package:reboot_launcher/src/util/injector.dart'; import 'package:reboot_launcher/src/util/binary.dart'; +import 'package:reboot_launcher/src/util/patcher.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:win32_suspend_process/win32_suspend_process.dart'; @@ -35,7 +36,7 @@ class _LaunchButtonState extends State { child: Obx(() => Tooltip( message: _gameController.started.value ? "Close the running Fortnite instance" : "Launch a new Fortnite instance", child: Button( - onPressed: () => _onPressed(context), + onPressed: _onPressed, child: Text(_gameController.started.value ? "Close" : "Launch") ), )), @@ -43,7 +44,7 @@ class _LaunchButtonState extends State { ); } - void _onPressed(BuildContext context) async { + void _onPressed() async { if (_gameController.username.text.isEmpty) { showSnackbar( context, const Snackbar(content: Text("Please type a username"))); @@ -84,38 +85,103 @@ class _LaunchButtonState extends State { try { _updateServerState(true); var version = _gameController.selectedVersionObs.value!; - if (await version.launcher.exists()) { - _gameController.launcherProcess = await Process.start(version.launcher.path, []); + var hosting = _gameController.host.value; + if (version.launcher != null) { + _gameController.launcherProcess = await Process.start(version.launcher!.path, []); Win32Process(_gameController.launcherProcess!.pid).suspend(); } - if (await version.eacExecutable.exists()) { - _gameController.eacProcess = await Process.start(version.eacExecutable.path, []); + if (version.eacExecutable != null) { + _gameController.eacProcess = await Process.start(version.eacExecutable!.path, []); Win32Process(_gameController.eacProcess!.pid).suspend(); } - _gameController.gameProcess = await Process.start(version.executable.path, _createProcessArguments()) - ..exitCode.then((_) => _onStop()) + if(hosting){ + await patchExe(version.executable!); + } + + _gameController.gameProcess = await Process.start(version.executable!.path, _createProcessArguments()) + ..exitCode.then((_) => _onEnd()) ..outLines.forEach(_onGameOutput); - _injectOrShowError("cranium.dll"); + await _injectOrShowError("cranium.dll"); + + if(hosting){ + _showServerLaunchingWarning(); + } } catch (exception) { - _updateServerState(false); + _closeDialogIfOpen(); _onError(exception); } } - void _onGameOutput(line) { + void _onEnd() { + _closeDialogIfOpen(); + _onStop(); + } + + void _closeDialogIfOpen() { + if(!mounted){ + return; + } + + var route = ModalRoute.of(context); + if(route != null && !route.isCurrent){ + Navigator.of(context).pop(false); + } + } + + void _showServerLaunchingWarning() async { + var result = await showDialog( + context: context, + builder: (context) => ContentDialog( + content: const InfoLabel( + label: "Launching reboot server...", + child: SizedBox( + width: double.infinity, + child: ProgressBar() + ) + ), + actions: [ + SizedBox( + width: double.infinity, + child: FilledButton( + onPressed: () { + Navigator.of(context).pop(false); + _onStop(); + }, + style: ButtonStyle( + backgroundColor: ButtonState.all(Colors.red)), + child: const Text('Cancel'), + ) + ) + ], + ) + ); + + if(result != null && result){ + return; + } + + _onStop(); + } + + void _onGameOutput(String line) { if (line.contains("FOnlineSubsystemGoogleCommon::Shutdown()")) { _onStop(); return; } - if (line.contains("[UFortUIManagerWidget_NUI::SetUIState]") && line.contains("FrontEnd")) { - _injectOrShowError(_gameController.host.value ? "reboot.dll" : "console.dll"); + if (line.contains("Game Engine Initialized") && !_gameController.host.value) { + _injectOrShowError("console.dll"); + } + + if(line.contains("added to UI Party led ") && _gameController.host.value){ + _injectOrShowError("reboot.dll") + .then((value) => Navigator.of(context).pop(true)); } } - Future _onError(exception) { + Future _onError(Object exception) { return showDialog( context: context, builder: (context) => ContentDialog( @@ -127,7 +193,7 @@ class _LaunchButtonState extends State { SizedBox( width: double.infinity, child: FilledButton( - onPressed: () => Navigator.of(context).pop(), + onPressed: () => Navigator.of(context).pop(true), style: ButtonStyle( backgroundColor: ButtonState.all(Colors.red)), child: const Text('Close'), @@ -141,7 +207,7 @@ class _LaunchButtonState extends State { _gameController.kill(); } - void _injectOrShowError(String binary) async { + Future _injectOrShowError(String binary) async { var gameProcess = _gameController.gameProcess; if (gameProcess == null) { return; @@ -166,7 +232,7 @@ class _LaunchButtonState extends State { } List _createProcessArguments() { - return [ + var args = [ "-epicapp=Fortnite", "-epicenv=Prod", "-epiclocale=en-us", @@ -179,5 +245,11 @@ class _LaunchButtonState extends State { "-AUTH_PASSWORD=Rebooted", "-AUTH_TYPE=epic" ]; + + if(_gameController.host.value){ + args.addAll(["-log", "-nullrhi", "-nosplash", "-nosound", "-unattended"]); + } + + return args; } } diff --git a/lib/src/widget/smart_switch.dart b/lib/src/widget/smart_switch.dart index d1581da..4dde298 100644 --- a/lib/src/widget/smart_switch.dart +++ b/lib/src/widget/smart_switch.dart @@ -50,11 +50,11 @@ class _SmartSwitchState extends State { double get _uncheckedOpacity => widget.enabled ? 0.8 : 0.5; - void _onChanged(checked) { + void _onChanged(bool checked) { if (!widget.enabled) { return; } - setState(() => widget.value(checked)); + setState(() => widget.value.value = checked); } } diff --git a/lib/src/widget/version_selector.dart b/lib/src/widget/version_selector.dart index 06146fd..cf19472 100644 --- a/lib/src/widget/version_selector.dart +++ b/lib/src/widget/version_selector.dart @@ -15,6 +15,7 @@ import 'package:reboot_launcher/src/model/fortnite_version.dart'; import 'package:reboot_launcher/src/controller/game_controller.dart'; import 'package:reboot_launcher/src/widget/scan_local_version.dart'; +import 'package:url_launcher/url_launcher.dart'; import '../controller/build_controller.dart'; @@ -142,7 +143,7 @@ class VersionSelector extends StatelessWidget { switch (result) { case 0: Navigator.of(context).pop(); - Process.run("explorer.exe", [version.location.path]); + launchUrl(version.location.uri); break; case 1: diff --git a/lib/test.dart b/lib/test.dart new file mode 100644 index 0000000..18b8cab --- /dev/null +++ b/lib/test.dart @@ -0,0 +1,73 @@ +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:hex/hex.dart'; + +const String _original = "2d0069006e007600690074006500730065007300730069006f006e0020002d0069006e007600690074006500660072006f006d0020002d00700061007200740079005f006a006f0069006e0069006e0066006f005f0074006f006b0065006e0020002d007200650070006c0061007900"; +const String _patched = "2d006c006f00670020002d006e006f00730070006c0061007300680020002d006e006f0073006f0075006e00640020002d006e0075006c006c0072006800690020002d007500730065006f006c0064006900740065006d00630061007200640073002000200020002000200020002000"; +final Uint8List _originalBinary = Uint8List.fromList([ + 45, 0, 105, 0, 110, 0, 118, 0, 105, 0, 116, 0, 101, 0, 115, 0, 101, 0, 115, 0, 115, 0, 105, 0, 111, 0, 110, 0, 32, 0, 45, 0, 105, 0, 110, 0, 118, 0, 105, 0, 116, 0, 101, 0, 102, 0, 114, 0, 111, 0, 109, 0, 32, 0, 45, 0, 112, 0, 97, 0, 114, 0, 116, 0, 121, 0, 95, 0, 106, 0, 111, 0, 105, 0, 110, 0, 105, 0, 110, 0, 102, 0, 111, 0, 95, 0, 116, 0, 111, 0, 107, 0, 101, 0, 110, 0, 32, 0, 45, 0, 114, 0, 101, 0, 112, 0, 108, 0, 97, 0, 121, 0 +]); + +final Uint8List _patchedBinary = Uint8List.fromList([ + 45, 0, 108, 0, 111, 0, 103, 0, 32, 0, 45, 0, 110, 0, 111, 0, 115, 0, 112, 0, 108, 0, 97, 0, 115, 0, 104, 0, 32, 0, 45, 0, 110, 0, 111, 0, 115, 0, 111, 0, 117, 0, 110, 0, 100, 0, 32, 0, 45, 0, 110, 0, 117, 0, 108, 0, 108, 0, 114, 0, 104, 0, 105, 0, 32, 0, 45, 0, 117, 0, 115, 0, 101, 0, 111, 0, 108, 0, 100, 0, 105, 0, 116, 0, 101, 0, 109, 0, 99, 0, 97, 0, 114, 0, 100, 0, 115, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0 +]); + +Future patchExeHex(File file) async { + Future replaceBinary(File file, String original, String replacement) async { + var read = await file.readAsBytes(); + var hex = HEX.encode(read); + var fixed = hex.replaceAll(original, replacement); + return fixed; + } + + return await replaceBinary(file, _original, _patched); +} + +Future patchExeBinary(File file) async { + Future replaceBinary(File file, Uint8List original, Uint8List replacement) async { + if(original.length != replacement.length){ + throw Exception("Cannot mutate length of binary file"); + } + + var read = await file.readAsBytes(); + var length = await file.length(); + var offset = 0; + var counter = 0; + while(offset < length){ + if(read[offset] == original[counter]){ + counter++; + }else { + counter = 0; + } + + offset++; + if(counter == original.length){ + for(var index = 0; index < replacement.length; index++){ + read[offset - counter + index] = replacement[index]; + } + + return HEX.encode(read); + } + } + + throw Exception("No match"); + } + + return await replaceBinary(file, _originalBinary, _patchedBinary); +} + +void main() async { + var file = File("D:\\Fortnite73\\FortniteGame\\Binaries\\Win64\\FortniteClient-Win64-Shipping.exe"); + var hexed = await patchExeHex(file); + var binary = await patchExeBinary(file); + var offset = 0; + while(offset < hexed.length){ + if(hexed[offset] != binary[offset]){ + print("Difference ${hexed[offset]} != ${binary[offset]} at $offset"); + } + + offset++; + } + print(hexed == binary); +} \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index f2b31e8..7314386 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: reboot_launcher description: Launcher for project reboot -version: "3.6.0" +version: "3.7.0" publish_to: 'none' @@ -29,6 +29,7 @@ dependencies: get: ^4.6.5 get_storage: ^2.0.3 window_manager: ^0.2.7 + hex: ^0.2.0 dev_dependencies: flutter_test: @@ -48,7 +49,7 @@ msix_config: display_name: Reboot Launcher publisher_display_name: Auties00 identity_name: 31868Auties00.RebootLauncher - msix_version: 3.6.0.0 + msix_version: 3.7.0.0 publisher: CN=E6CD08C6-DECF-4034-A3EB-2D5FA2CA8029 logo_path: ./assets/icons/reboot.ico architecture: x64