├── FortniteLauncher.sln
├── FortniteLauncher
├── FortniteLauncher.csproj
├── Program.cs
└── Utilities
│ ├── JSON.cs
│ ├── Suspend.cs
│ └── Win32.cs
└── README.md
/FortniteLauncher.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 16
4 | VisualStudioVersion = 16.0.31205.134
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FortniteLauncher", "FortniteLauncher\FortniteLauncher.csproj", "{B45F0C02-D49E-4A92-983E-0BD8DBCA8221}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {B45F0C02-D49E-4A92-983E-0BD8DBCA8221}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {B45F0C02-D49E-4A92-983E-0BD8DBCA8221}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {B45F0C02-D49E-4A92-983E-0BD8DBCA8221}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {B45F0C02-D49E-4A92-983E-0BD8DBCA8221}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | GlobalSection(ExtensibilityGlobals) = postSolution
23 | SolutionGuid = {2CDA3AD3-51E1-488C-AF87-ACE5BACCA8CE}
24 | EndGlobalSection
25 | EndGlobal
26 |
--------------------------------------------------------------------------------
/FortniteLauncher/FortniteLauncher.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | netcoreapp3.1
6 | LaunchFortnite
7 | ozne
8 | ozne
9 | FortniteLauncher
10 | FortniteLauncher
11 | Fortnite Launcher which bypasses EAC and allows for dll injection and various other things!
12 | ozne
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/FortniteLauncher/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics;
3 | using System.IO;
4 | using System.Net;
5 | using System.Threading;
6 | using Newtonsoft.Json;
7 | using ProcessSuspend;
8 | using JSON;
9 |
10 | namespace FortniteLauncher
11 | {
12 | public class Program
13 | {
14 | static readonly string LocalAppData = Environment.GetEnvironmentVariable("LocalAppData");
15 | static readonly bool WinCheck = Environment.OSVersion.Version < new Version(6, 2);
16 | static string Arguments = "TBD";
17 |
18 | static void Main()
19 | {
20 | Console.Title = "Fortnite Launcher";
21 | if (WinCheck)
22 | {
23 | Console.Title = "Error!";
24 | Console.WriteLine("A version of Windows other than Windows 10 has been detected, please upgrade as it is completely free!\nhttps://www.microsoft.com/en-us/software-download/windows10 :PeepoGlad:");
25 | Console.ReadKey();
26 | Environment.Exit(0);
27 | }
28 | if (File.Exists(LocalAppData + @"\uFortniteLauncher\Settings.json"))
29 | { }
30 | else { ConfigurateFortnitePath(); }
31 |
32 | WebClient webClient = new WebClient();
33 | var FLToken = webClient.DownloadString("https://api.nitestats.com/v1/epic/builds/fltoken");
34 | webClient.Dispose();
35 | FLTokenJson json = JsonConvert.DeserializeObject(FLToken);
36 |
37 | Console.Clear();
38 | Console.WriteLine("FL Token: " + json.fltoken);
39 | Console.WriteLine("Fortnite Build: " + json.version);
40 | Console.WriteLine("\nIf you would like to change your Fortnite path, please enter the letter \'c\' instead of your Exchange Code.");
41 | Console.WriteLine("\n\nExchange Code");
42 | Console.Write("> ");
43 | string exchange = Console.ReadLine();
44 | if (exchange == "" || exchange.Contains(" ") || exchange.Contains("~") || exchange.Contains("-") || exchange.Contains("+") || exchange.Contains("`") || exchange.Contains("!") || exchange.Contains("@") || exchange.Contains("#") || exchange.Contains("$") || exchange.Contains("%") || exchange.Contains("^") || exchange.Contains("&") || exchange.Contains("*") || exchange.Contains("(") || exchange.Contains(")") || exchange.Contains("_") || exchange.Contains("=") || exchange.Contains("[") || exchange.Contains("]") || exchange.Contains("{") || exchange.Contains("}") || exchange.Contains("|") || exchange.Contains(@"\") || exchange.Contains(";") || exchange.Contains(":") || exchange.Contains("\'") || exchange.Contains("\"") || exchange.Contains(",") || exchange.Contains(".") || exchange.Contains("<") || exchange.Contains(">") || exchange.Contains("?") || exchange.Contains("/"))
45 | {
46 | Console.WriteLine("Invalid Exchange Code!");
47 | Thread.Sleep(1300);
48 | Environment.Exit(0);
49 | }
50 | if (exchange == "c")
51 | {
52 | Console.Clear();
53 | ConfigurateFortnitePath();
54 | Main();
55 | Environment.Exit(0);
56 | }
57 |
58 | string GetPath = File.ReadAllText(LocalAppData + @"\uFortniteLauncher\Settings.json");
59 | Settings settings = JsonConvert.DeserializeObject(GetPath);
60 |
61 | Arguments = $"-epicapp=Fortnite -epicenv=Prod -epiclocale=en-us -epicportal -skippatchcheck -NOSSLPINNING -noeac -fromfl=be -fltoken={json.fltoken} -frombe -AUTH_TYPE=exchangecode -AUTH_LOGIN=unused -AUTH_PASSWORD={exchange}";
62 | var client = new Process
63 | {
64 | StartInfo =
65 | {
66 | FileName = settings.Path + @"\FortniteGame\Binaries\Win64\FortniteClient-Win64-Shipping.exe",
67 | Arguments = Arguments,
68 | UseShellExecute = false
69 | }
70 | };
71 | var eac = new Process
72 | {
73 | StartInfo =
74 | {
75 | FileName = settings.Path + @"\FortniteGame\Binaries\Win64\FortniteClient-Win64-Shipping_EAC.exe",
76 | Arguments = Arguments,
77 | UseShellExecute = false
78 | }
79 | };
80 | var launcher = new Process
81 | {
82 | StartInfo =
83 | {
84 | FileName = settings.Path + @"\FortniteGame\Binaries\Win64\FortniteLauncher.exe",
85 | UseShellExecute = false
86 | }
87 | };
88 |
89 | try
90 | {
91 | client.Start();
92 | }
93 | catch
94 | {
95 | Console.Clear();
96 | Console.WriteLine("\nInvalid Fortnite Path!\n");
97 | Thread.Sleep(1100);
98 | Console.Clear();
99 | ConfigurateFortnitePath();
100 | Console.Clear();
101 | Main();
102 | Environment.Exit(0);
103 | }
104 | launcher.Start();
105 | SuspendProcess.Suspend("FortniteLauncher");
106 | eac.Start();
107 | SuspendProcess.Suspend("FortniteClient-Win64-Shipping_EAC");
108 |
109 | client.WaitForExit();
110 | eac.Kill();
111 | launcher.Kill();
112 |
113 | Console.WriteLine("\nozne: This launcher");
114 | Console.WriteLine("VastBlast: NiteStats which is used for grabbing the FL Token");
115 | Thread.Sleep(2600);
116 | }
117 |
118 | public static void ConfigurateFortnitePath()
119 | {
120 | try
121 | { Directory.Delete(LocalAppData + @"\uFortniteLauncher", true); }
122 | catch { }
123 | Directory.CreateDirectory(LocalAppData + @"\uFortniteLauncher");
124 | Console.WriteLine("Fortnite Path (Directory that contains Engine and FortniteGame)");
125 | Console.Write("> ");
126 | string ReadPath = Console.ReadLine();
127 | using (StreamWriter sw = File.CreateText(LocalAppData + @"\uFortniteLauncher\Settings.json"))
128 | {
129 | sw.WriteLine("{");
130 | sw.WriteLine($" \"Path\": \"{ReadPath}\"");
131 | sw.Write("}");
132 | sw.Close();
133 | }
134 | string ReplaceThings = File.ReadAllText(LocalAppData + @"\uFortniteLauncher\Settings.json");
135 | ReplaceThings = ReplaceThings.Replace(@"\", @"\\");
136 | File.WriteAllText(LocalAppData + @"\uFortniteLauncher\Settings.json", ReplaceThings);
137 | return;
138 | }
139 | }
140 | }
141 |
--------------------------------------------------------------------------------
/FortniteLauncher/Utilities/JSON.cs:
--------------------------------------------------------------------------------
1 | namespace JSON
2 | {
3 | public class Settings
4 | {
5 | public string Path { get; set; }
6 | }
7 |
8 | public class FLTokenJson
9 | {
10 | public string version { get; set; }
11 | public string fltoken { get; set; }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/FortniteLauncher/Utilities/Suspend.cs:
--------------------------------------------------------------------------------
1 | using System.Diagnostics;
2 | using System.Threading.Tasks;
3 | using Win32;
4 |
5 | namespace ProcessSuspend
6 | {
7 | public class SuspendProcess
8 | {
9 | // taken from https://stackoverflow.com/questions/71257/suspend-process-in-c-sharp
10 | public static Task Suspend(string text)
11 | {
12 | foreach (Process LeProcess in Process.GetProcesses())
13 | {
14 | if (LeProcess.ProcessName == text)
15 | {
16 | LeProcess.Suspend();
17 | }
18 | }
19 | return Task.CompletedTask;
20 | }
21 | }
22 | }
--------------------------------------------------------------------------------
/FortniteLauncher/Utilities/Win32.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics;
3 | using System.Runtime.InteropServices;
4 |
5 | namespace Win32
6 | {
7 | public static class ProcessExtension
8 | {
9 | [Flags]
10 | public enum ThreadAccess : int
11 | {
12 | TERMINATE = (0x0001),
13 | SUSPEND_RESUME = (0x0002),
14 | GET_CONTEXT = (0x0008),
15 | SET_CONTEXT = (0x0010),
16 | SET_INFORMATION = (0x0020),
17 | QUERY_INFORMATION = (0x0040),
18 | SET_THREAD_TOKEN = (0x0080),
19 | IMPERSONATE = (0x0100),
20 | DIRECT_IMPERSONATION = (0x0200)
21 | }
22 | [DllImport("kernel32.dll")]
23 | static extern IntPtr OpenThread(ThreadAccess dwDesiredAccess, bool bInheritHandle, uint dwThreadId);
24 | [DllImport("kernel32.dll")]
25 | static extern uint SuspendThread(IntPtr hThread);
26 | [DllImport("kernel32.dll")]
27 | static extern int ResumeThread(IntPtr hThread);
28 |
29 | public static void Suspend(this Process process)
30 | {
31 | foreach (ProcessThread thread in process.Threads)
32 | {
33 | var pOpenThread = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)thread.Id);
34 | if (pOpenThread == IntPtr.Zero)
35 | {
36 | break;
37 | }
38 | SuspendThread(pOpenThread);
39 | }
40 | }
41 | public static void Resume(this Process process)
42 | {
43 | foreach (ProcessThread thread in process.Threads)
44 | {
45 | var pOpenThread = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)thread.Id);
46 | if (pOpenThread == IntPtr.Zero)
47 | {
48 | break;
49 | }
50 | ResumeThread(pOpenThread);
51 | }
52 | }
53 | }
54 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | If this was useful for you, please consider giving this repository a star, it means much more than you know!
2 |
3 | At the moment, FortniteLauncher is semi broken.
4 |
5 | Ever since the 16.40 update, you can go in lobby and avoid the game being closed by clicking outside of the box instead of the confirm button, but no matter what after around 20-30 seconds, the game will close automatically.
6 |
7 |
8 | This launcher will likely be completely patched in a future update, when that happens, this repository will become archived and no support will be given for this.
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 | FortniteLauncher
24 |
25 | Simple Fortnite launcher which bypasses EAC and allows for dll injection, it also allows for efficiently using Epic's services on older builds!
26 |
27 |
28 |
29 | CLIENT TO-DO
30 |
31 | You *need* an exchange code generator, this can be done using https://github.com/ThisNils/exchange-code-generator, a Discord bot like AK47, or the manual way.
32 |
33 |
34 |
35 |
36 | CREDIT
37 |
38 | Me: Maintaining the launcher.
39 |
40 | VastBlast: NiteStats, which is used to grab the FLToken.
41 |
42 | Newtonsoft.Json library for reading FLToken, and reading/writing saved path.
43 |
44 |
45 |
46 | EXTRA
47 |
48 | Incase you have any issues, you can contact me on Discord at: ozne#3303
49 |
50 |
--------------------------------------------------------------------------------