From 62ffbe673249ac321de9a1736c9fefd5e0c4be75 Mon Sep 17 00:00:00 2001 From: atom0s Date: Mon, 4 Apr 2022 21:37:35 -0700 Subject: [PATCH] Core: Added Steamless.CLI to run Steamless from the command line. Core: Bumped version to 3.0.0.15 --- Steamless.CLI/App.config | 6 + Steamless.CLI/Program.cs | 250 +++++++++++++++++++++++ Steamless.CLI/Properties/AssemblyInfo.cs | 40 ++++ Steamless.CLI/Steamless.CLI.csproj | 65 ++++++ Steamless.CLI/steam.ico | Bin 0 -> 99678 bytes Steamless.sln | 10 + Steamless/Properties/AssemblyInfo.cs | 4 +- 7 files changed, 373 insertions(+), 2 deletions(-) create mode 100644 Steamless.CLI/App.config create mode 100644 Steamless.CLI/Program.cs create mode 100644 Steamless.CLI/Properties/AssemblyInfo.cs create mode 100644 Steamless.CLI/Steamless.CLI.csproj create mode 100644 Steamless.CLI/steam.ico diff --git a/Steamless.CLI/App.config b/Steamless.CLI/App.config new file mode 100644 index 0000000..88fa402 --- /dev/null +++ b/Steamless.CLI/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Steamless.CLI/Program.cs b/Steamless.CLI/Program.cs new file mode 100644 index 0000000..053cc5f --- /dev/null +++ b/Steamless.CLI/Program.cs @@ -0,0 +1,250 @@ +/** + * Steamless - Copyright (c) 2015 - 2022 atom0s [atom0s@live.com] + * + * This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/ or send a letter to + * Creative Commons, PO Box 1866, Mountain View, CA 94042, USA. + * + * By using Steamless, you agree to the above license and its terms. + * + * Attribution - You must give appropriate credit, provide a link to the license and indicate if changes were + * made. You must do so in any reasonable manner, but not in any way that suggests the licensor + * endorses you or your use. + * + * Non-Commercial - You may not use the material (Steamless) for commercial purposes. + * + * No-Derivatives - If you remix, transform, or build upon the material (Steamless), you may not distribute the + * modified material. You are, however, allowed to submit the modified works back to the original + * Steamless project in attempt to have it added to the original project. + * + * You may not apply legal terms or technological measures that legally restrict others + * from doing anything the license permits. + * + * No warranties are given. + */ + +namespace Steamless.CLI +{ + using Steamless.API; + using Steamless.API.Events; + using Steamless.API.Model; + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using System.Reflection; + + internal class Program + { + /// + /// Steamless API Version + /// + /// Main define for this is within DataService.cs and should match that value. + /// + private static readonly Version SteamlessApiVersion = new Version(1, 0); + + /// + /// Steamless logging service. + /// + private static readonly API.Services.LoggingService LoggingService = new API.Services.LoggingService(); + + /// + /// Prints the Steamless header information. + /// + static void PrintHeader() + { + Console.WriteLine(" _________ __ .__ "); + Console.WriteLine(" / _____// |_ ____ _____ _____ | | ____ ______ ______"); + Console.WriteLine(" \\_____ \\\\ __\\/ __ \\\\__ \\ / \\| | _/ __ \\ / ___// ___/"); + Console.WriteLine(" / \\| | \\ ___/ / __ \\| Y Y \\ |_\\ ___/ \\___ \\ \\___ \\ "); + Console.WriteLine("/_______ /|__| \\___ >____ /__|_| /____/\\___ >____ >____ >"); + Console.WriteLine(" \\/ \\/ \\/ \\/ \\/ \\/ \\/ \n"); + Console.WriteLine("Steamless - SteamStub DRM Remover"); + Console.WriteLine("by atom0s\n"); + Console.WriteLine("GitHub : https://github.com/atom0s/Steamless"); + Console.WriteLine("Homepage : https://atom0s.com"); + Console.WriteLine("Donations : https://paypal.me/atom0s"); + Console.WriteLine("Donations : https://github.com/sponsors/atom0s"); + Console.WriteLine("Donations : https://patreon.com/atom0s\n"); + } + + /// + /// Prints the Steamless command line help information. + /// + static void PrintHelp() + { + Console.WriteLine("Usage:"); + Console.WriteLine(" Steamless.CLI.exe [options] [file]\n"); + Console.WriteLine("Options:"); + Console.WriteLine(" --quiet"); + Console.WriteLine(" --keepbind - Keeps the .bind section in the unpacked file."); + Console.WriteLine(" --keepstub - Keeps the DOS stub in the unpacked file."); + Console.WriteLine(" --dumppayload - Dumps the stub payload to disk."); + Console.WriteLine(" --dumpdrmp - Dumps the SteamDRMP.dll to disk."); + Console.WriteLine(" --realign - Realigns the unpacked file sections."); + Console.WriteLine(" --recalcchecksum - Recalculates the unpacked file checksum."); + Console.WriteLine(" --exp - Use experimental features."); + } + + /// + /// Obtains a list of available Steamless plugins. + /// + /// + static List GetSteamlessPlugins() + { + try + { + // The list of valid plugins.. + var plugins = new List(); + + // Build a path to the plugins folder.. + var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins"); + + // Loop the DLL files and attempt to load them.. + foreach (var dll in Directory.GetFiles(path, "*.dll")) + { + // Skip the Steamless.API.dll file.. + if (dll.ToLower().Contains("steamless.api.dll")) + continue; + + try + { + // Load the assembly.. + var asm = Assembly.Load(File.ReadAllBytes(dll)); + + // Locate the class inheriting the plugin base.. + var baseClass = asm.GetTypes().SingleOrDefault(t => t.BaseType == typeof(SteamlessPlugin)); + if (baseClass == null) + continue; + + // Locate the SteamlessApiVersion attribute on the base class.. + var baseAttr = baseClass.GetCustomAttributes(typeof(SteamlessApiVersionAttribute), false); + if (baseAttr.Length == 0) + continue; + + // Validate the interface version.. + var apiVersion = (SteamlessApiVersionAttribute)baseAttr[0]; + if (apiVersion.Version != SteamlessApiVersion) + continue; + + // Create an instance of the plugin.. + var plugin = (SteamlessPlugin)Activator.CreateInstance(baseClass); + if (!plugin.Initialize(LoggingService)) + continue; + + plugins.Add(plugin); + } + catch + { + } + } + + // Order the plugins by their name.. + return plugins.OrderBy(p => p.Name).ToList(); + } + catch + { + return new List(); + } + } + + /// + /// Application entry point. + /// + /// + static int Main(string[] args) + { + PrintHeader(); + + var opts = new SteamlessOptions(); + var file = string.Empty; + + // Process command line arguments for the various Steamless options.. + foreach (var arg in args) + { + if (arg.ToLower() == "--quiet") + opts.VerboseOutput = false; + if (arg.ToLower() == "--keepbind") + opts.KeepBindSection = true; + if (arg.ToLower() == "--keepstub") + opts.ZeroDosStubData = false; + if (arg.ToLower() == "--dumppayload") + opts.DumpPayloadToDisk = true; + if (arg.ToLower() == "--dumpdrmp") + opts.DumpSteamDrmpToDisk = true; + if (arg.ToLower() == "--realign") + opts.DontRealignSections = false; + if (arg.ToLower() == "--recalcchecksum") + opts.RecalculateFileChecksum = true; + if (arg.ToLower() == "--exp") + opts.UseExperimentalFeatures = true; + if (!arg.StartsWith("--")) + file = arg; + } + + // Prepare the logging service.. + LoggingService.AddLogMessage += (sender, e) => + { + if (!opts.VerboseOutput && e.MessageType == LogMessageType.Debug) + return; + + try + { + if (sender != null) + e.Message = $"[{sender.GetType().Assembly.GetName().Name}] {e.Message}"; + else + e.Message = $"[Steamless] {e.Message}"; + } + catch + { + } + + Console.WriteLine(e.Message); + }; + + // Ensure an input file was given.. + if (string.IsNullOrEmpty(file)) + { + PrintHelp(); + return 1; + } + + // Ensure the input file exists.. + if (!File.Exists(file)) + { + LoggingService.OnAddLogMessage(null, new LogMessageEventArgs("Invalid input file given; cannot continue.", LogMessageType.Error)); + return 1; + } + + // Collect the list of available plugins.. + var plugins = GetSteamlessPlugins(); + plugins.ForEach(p => LoggingService.OnAddLogMessage(null, new LogMessageEventArgs($"Loaded plugin: {p.Name} - by {p.Author} (v.{p.Version})", LogMessageType.Success))); + + // Ensure plugins were found and loaded.. + if (plugins.Count == 0) + { + LoggingService.OnAddLogMessage(null, new LogMessageEventArgs("No plugins were loaded; be sure to fully extract Steamless before running!", LogMessageType.Error)); + return 1; + } + + // Loop through the plugins and try to unpack the file.. + foreach (var p in plugins) + { + // Check if the plugin can process the file.. + if (p.CanProcessFile(file)) + { + var ret = p.ProcessFile(file, opts); + + LoggingService.OnAddLogMessage(null, !ret + ? new LogMessageEventArgs("Failed to unpack file.", LogMessageType.Error) + : new LogMessageEventArgs("Successfully unpacked file!", LogMessageType.Success)); + + if (ret) return 0; + } + } + + LoggingService.OnAddLogMessage(null, new LogMessageEventArgs("All unpackers failed to unpack file.", LogMessageType.Error)); + return 1; + } + } +} \ No newline at end of file diff --git a/Steamless.CLI/Properties/AssemblyInfo.cs b/Steamless.CLI/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..9717d32 --- /dev/null +++ b/Steamless.CLI/Properties/AssemblyInfo.cs @@ -0,0 +1,40 @@ +/** + * Steamless - Copyright (c) 2015 - 2022 atom0s [atom0s@live.com] + * + * This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/ or send a letter to + * Creative Commons, PO Box 1866, Mountain View, CA 94042, USA. + * + * By using Steamless, you agree to the above license and its terms. + * + * Attribution - You must give appropriate credit, provide a link to the license and indicate if changes were + * made. You must do so in any reasonable manner, but not in any way that suggests the licensor + * endorses you or your use. + * + * Non-Commercial - You may not use the material (Steamless) for commercial purposes. + * + * No-Derivatives - If you remix, transform, or build upon the material (Steamless), you may not distribute the + * modified material. You are, however, allowed to submit the modified works back to the original + * Steamless project in attempt to have it added to the original project. + * + * You may not apply legal terms or technological measures that legally restrict others + * from doing anything the license permits. + * + * No warranties are given. + */ + +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("Steamless.CLI")] +[assembly: AssemblyDescription("Removes the SteamStub DRM protection from Steam applications.")] +[assembly: AssemblyConfiguration("Release")] +[assembly: AssemblyCompany("atom0s")] +[assembly: AssemblyProduct("Steamless")] +[assembly: AssemblyCopyright("Copyright © atom0s 2015 - 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: ComVisible(false)] +[assembly: Guid("d128d7ad-2e6f-43bd-ba36-bea3b9b77437")] +[assembly: AssemblyVersion("3.0.0.15")] +[assembly: AssemblyFileVersion("3.0.0.15")] \ No newline at end of file diff --git a/Steamless.CLI/Steamless.CLI.csproj b/Steamless.CLI/Steamless.CLI.csproj new file mode 100644 index 0000000..0bed712 --- /dev/null +++ b/Steamless.CLI/Steamless.CLI.csproj @@ -0,0 +1,65 @@ + + + + + Debug + AnyCPU + {D128D7AD-2E6F-43BD-BA36-BEA3B9B77437} + Exe + Steamless.CLI + Steamless.CLI + v4.5.2 + 512 + true + true + + + x86 + true + full + false + ..\Steamless\bin\x86\Debug\ + DEBUG;TRACE + prompt + 4 + + + x86 + pdbonly + true + ..\Steamless\bin\x86\Debug\ + TRACE + prompt + 4 + + + steam.ico + + + + + + + + + + + + + + + + + + + + + {56c95629-3b34-47fe-b988-04274409294f} + Steamless.API + + + + + + + \ No newline at end of file diff --git a/Steamless.CLI/steam.ico b/Steamless.CLI/steam.ico new file mode 100644 index 0000000000000000000000000000000000000000..13ce3824950423917e82c2164a6670938a3721e6 GIT binary patch literal 99678 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 UAdx^KfkXm{1QH4Si%H=B0G|^MApigX literal 0 HcmV?d00001 diff --git a/Steamless.sln b/Steamless.sln index 8baeba8..fb5b69e 100644 --- a/Steamless.sln +++ b/Steamless.sln @@ -23,6 +23,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Steamless.Unpacker.Variant2 EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Steamless.Unpacker.Variant10.x86", "Steamless.Unpacker.Variant10.x86\Steamless.Unpacker.Variant10.x86.csproj", "{02B58AB0-9B00-4B31-8D61-9D22D13D2C4A}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Steamless.CLI", "Steamless.CLI\Steamless.CLI.csproj", "{D128D7AD-2E6F-43BD-BA36-BEA3B9B77437}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -111,6 +113,14 @@ Global {02B58AB0-9B00-4B31-8D61-9D22D13D2C4A}.Release|Any CPU.Build.0 = Release|Any CPU {02B58AB0-9B00-4B31-8D61-9D22D13D2C4A}.Release|x86.ActiveCfg = Release|Any CPU {02B58AB0-9B00-4B31-8D61-9D22D13D2C4A}.Release|x86.Build.0 = Release|Any CPU + {D128D7AD-2E6F-43BD-BA36-BEA3B9B77437}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D128D7AD-2E6F-43BD-BA36-BEA3B9B77437}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D128D7AD-2E6F-43BD-BA36-BEA3B9B77437}.Debug|x86.ActiveCfg = Debug|Any CPU + {D128D7AD-2E6F-43BD-BA36-BEA3B9B77437}.Debug|x86.Build.0 = Debug|Any CPU + {D128D7AD-2E6F-43BD-BA36-BEA3B9B77437}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D128D7AD-2E6F-43BD-BA36-BEA3B9B77437}.Release|Any CPU.Build.0 = Release|Any CPU + {D128D7AD-2E6F-43BD-BA36-BEA3B9B77437}.Release|x86.ActiveCfg = Release|Any CPU + {D128D7AD-2E6F-43BD-BA36-BEA3B9B77437}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Steamless/Properties/AssemblyInfo.cs b/Steamless/Properties/AssemblyInfo.cs index 37114f7..5641ccf 100644 --- a/Steamless/Properties/AssemblyInfo.cs +++ b/Steamless/Properties/AssemblyInfo.cs @@ -37,5 +37,5 @@ using System.Windows; [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)] -[assembly: AssemblyVersion("3.0.0.14")] -[assembly: AssemblyFileVersion("3.0.0.14")] \ No newline at end of file +[assembly: AssemblyVersion("3.0.0.15")] +[assembly: AssemblyFileVersion("3.0.0.15")] \ No newline at end of file