diff options
| author | Wither OrNot | 2025-02-13 14:49:35 +0000 |
|---|---|---|
| committer | Wither OrNot | 2025-02-13 14:49:37 +0000 |
| commit | 0d59561bee4cf7db10d53a8aa58952ae65e856b5 (patch) | |
| tree | b2ddb66c883dd2ef75426de4c080f3121f0a8658 /TSforgeCLI/Program.cs | |
| download | TSforge-0d59561bee4cf7db10d53a8aa58952ae65e856b5.zip | |
Initial commit1.0.0
Co-authored-by: neko <[email protected]>
Co-authored-by: Lyssa <[email protected]>
Co-authored-by: abbodi1406 <[email protected]>
Diffstat (limited to 'TSforgeCLI/Program.cs')
| -rw-r--r-- | TSforgeCLI/Program.cs | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/TSforgeCLI/Program.cs b/TSforgeCLI/Program.cs new file mode 100644 index 0000000..158af82 --- /dev/null +++ b/TSforgeCLI/Program.cs @@ -0,0 +1,244 @@ +namespace TSforgeCLI +{ + using System; + using LibTSforge; + using LibTSforge.Activators; + using LibTSforge.Modifiers; + + public class Program + { + private class Options + { + public bool Dump = false; + public string DumpFilePath = "dump.dat"; + public string EncrFilePath = null; + public bool Load = false; + public string LoadFilePath = "load.dat"; + public bool KMS4k = false; + public bool AVMA4k = false; + public bool ZCID = false; + public bool TimerReset = false; + public bool RearmReset = false; + public bool DeleteUniqueId = false; + public bool InstallGenPKey = false; + public bool KMSHostCharge = false; + public bool TamperedFlagsDelete = false; + public bool KeyChangeLockDelete = false; + public bool? Production = null; + public PSVersion? Version = null; + public Guid ActivationId = Guid.Empty; + public bool ShowHelp = false; + } + + public static void Main(string[] args) + { + Logger.WriteLine("TSforge (c) MASSGRAVE 2025"); + + try + { + if (args.Length == 0) + { + DisplayUsage(); + return; + } + + Options options = ParseArguments(args); + + if (options.ShowHelp) + { + DisplayUsage(); + return; + } + + PSVersion version = options.Version ?? Utils.DetectVersion(); + bool production = options.Production ?? Utils.DetectCurrentKey(); + + if (options.Dump) + { + Utils.DumpStore(version, production, options.DumpFilePath, options.EncrFilePath); + } + else if (options.Load) + { + Utils.LoadStore(version, production, options.LoadFilePath); + } + else if (options.KMS4k) + { + KMS4k.Activate(version, production, options.ActivationId); + } + else if (options.AVMA4k) + { + AVMA4k.Activate(version, production, options.ActivationId); + } + else if (options.ZCID) + { + ZeroCID.Activate(version, production, options.ActivationId); + } + else if (options.TimerReset) + { + GracePeriodReset.Reset(version, production); + } + else if (options.DeleteUniqueId) + { + UniqueIdDelete.DeleteUniqueId(version, production, options.ActivationId); + } + else if (options.RearmReset) + { + RearmReset.Reset(version, production); + } + else if (options.InstallGenPKey) + { + GenPKeyInstall.InstallGenPKey(version, production, options.ActivationId); + } + else if (options.KMSHostCharge) + { + KMSHostCharge.Charge(version, options.ActivationId, production); + } + else if (options.TamperedFlagsDelete) + { + TamperedFlagsDelete.DeleteTamperFlags(version, production); + } + else if (options.KeyChangeLockDelete) + { + KeyChangeLockDelete.Delete(version, production); + } + else + { + DisplayUsage(); + } + } + catch (Exception e) + { +#if DEBUG + throw; +#else + Logger.WriteLine("Fatal error: " + e.ToString()); + Environment.Exit(1); +#endif + } + } + + private static Options ParseArguments(string[] args) + { + Options options = new Options(); + for (int i = 0; i < args.Length; i++) + { + string arg = args[i].Trim().ToLowerInvariant(); + switch (arg) + { + case "/dump": + options.Dump = true; + if (i + 1 < args.Length && !args[i + 1].StartsWith("/")) + { + options.DumpFilePath = args[++i]; + } + if (i + 1 < args.Length && !args[i + 1].StartsWith("/")) + { + options.EncrFilePath = args[++i]; + } + break; + case "/load": + options.Load = true; + if (i + 1 < args.Length && !args[i + 1].StartsWith("/")) + { + options.LoadFilePath = args[++i]; + } + break; + case "/kms4k": + options.KMS4k = true; + break; + case "/avma4k": + options.AVMA4k = true; + break; + case "/zcid": + options.ZCID = true; + break; + case "/ver": + options.Version = i + 1 < args.Length ? ParseVersion(args[++i]) : throw new ArgumentException("/ver requires a version argument."); + break; + case "/rtmr": + options.TimerReset = true; + break; + case "/?": + options.ShowHelp = true; + break; + case "/duid": + options.DeleteUniqueId = true; + break; + case "/rrmc": + options.RearmReset = true; + break; + case "/igpk": + options.InstallGenPKey = true; + break; + case "/kmsc": + options.KMSHostCharge = true; + break; + case "/test": + options.Production = false; + break; + case "/prod": + options.Production = true; + break; + case "/ctpr": + options.TamperedFlagsDelete = true; + break; + case "/revl": + options.KeyChangeLockDelete = true; + break; + default: + try + { + options.ActivationId = new Guid(arg); + } + catch (FormatException) + { + Logger.WriteLine("Argument doesn't exist or the specified activation ID is invalid."); + options.ShowHelp = true; + break; + } + break; + } + } + + return options; + } + + private static void DisplayUsage() + { + string exeName = typeof(Program).Namespace; + Logger.WriteLine("Usage: " + exeName + " [/dump <filePath> (<encrFilePath>)] [/load <filePath>] [/kms4k] [/avma4k] [/zcid] [/rtmr] [/duid] [/igpk] [/kmsc] [/ctpr] [/revl] [/prod] [/test] [<activation id>] [/ver <version override>]"); + Logger.WriteLine("Options:"); + Logger.WriteLine("\t/dump <filePath> (<encrFilePath>) Dump and decrypt the physical store to the specified path."); + Logger.WriteLine("\t/load <filePath> Load and re-encrypt the physical store from the specified path."); + Logger.WriteLine("\t/kms4k Activate using KMS4k. Only supports KMS-activatable editions."); + Logger.WriteLine("\t/avma4k Activate using AVMA4k. Only supports Windows Server 2012 R2+."); + Logger.WriteLine("\t/zcid Activate using ZeroCID. Only supports phone-activatable editions."); + Logger.WriteLine("\t/rtmr Reset grace/evaluation period timers."); + Logger.WriteLine("\t/rrmc Reset the rearm count."); + Logger.WriteLine("\t/duid Delete product key Unique ID used in online key validation."); + Logger.WriteLine("\t/igpk Install auto-generated/fake product key according to the specified Activation ID"); + Logger.WriteLine("\t/kmsc Reset the charged count on the local KMS server to 25. Requires an activated KMS host."); + Logger.WriteLine("\t/ctpr Remove the tamper flags that get set in the physical store when sppsvc detects an attempt to tamper with it."); + Logger.WriteLine("\t/revl Remove the key change lock in evaluation edition store."); + Logger.WriteLine("\t/prod Use SPP production key."); + Logger.WriteLine("\t/test Use SPP test key."); + Logger.WriteLine("\t/ver <version> Override the detected version. Available versions: vista, 7, 8early, 8, blue, modern."); + Logger.WriteLine("\t<activation id> A specific activation ID. Useful if you want to activate specific addons like ESU."); + Logger.WriteLine("\t/? Display this help message."); + } + + private static PSVersion ParseVersion(string ver) + { + switch (ver.Trim().ToLowerInvariant()) + { + case "vista": return PSVersion.Vista; + case "7": return PSVersion.Win7; + case "8early": return PSVersion.Win8Early; + case "8": return PSVersion.Win8; + case "blue": return PSVersion.WinBlue; + case "modern": return PSVersion.WinModern; + default: throw new ArgumentException("Invalid version specified."); + } + } + } +} |
