From 6d759899d85939c95f2b97c8e041d7b4865208f9 Mon Sep 17 00:00:00 2001 From: WitherOrNot Date: Sat, 1 Mar 2025 02:01:39 -0500 Subject: Add partial support (zcid, rtmr, non-functional kms4k) for vista Co-authored-by: InvoxiPlayGames <22731889+InvoxiPlayGames@users.noreply.github.com> --- TSforgeCLI/Program.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'TSforgeCLI/Program.cs') diff --git a/TSforgeCLI/Program.cs b/TSforgeCLI/Program.cs index 158af82..8581b5c 100644 --- a/TSforgeCLI/Program.cs +++ b/TSforgeCLI/Program.cs @@ -4,6 +4,7 @@ namespace TSforgeCLI using LibTSforge; using LibTSforge.Activators; using LibTSforge.Modifiers; + using LibTSforge.SPP; public class Program { @@ -55,11 +56,11 @@ namespace TSforgeCLI if (options.Dump) { - Utils.DumpStore(version, production, options.DumpFilePath, options.EncrFilePath); + SPPUtils.DumpStore(version, production, options.DumpFilePath, options.EncrFilePath); } else if (options.Load) { - Utils.LoadStore(version, production, options.LoadFilePath); + SPPUtils.LoadStore(version, production, options.LoadFilePath); } else if (options.KMS4k) { @@ -91,7 +92,7 @@ namespace TSforgeCLI } else if (options.KMSHostCharge) { - KMSHostCharge.Charge(version, options.ActivationId, production); + KMSHostCharge.Charge(version, production, options.ActivationId); } else if (options.TamperedFlagsDelete) { -- cgit v1.2.3 From accbed0c514fc4ad1eaf5691cb89421f0485b5d6 Mon Sep 17 00:00:00 2001 From: Lyssa Date: Wed, 2 Apr 2025 14:34:11 +0400 Subject: fix build --- LibTSforge/Activators/ZeroCID.cs | 3 ++- TSforgeCLI/Program.cs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'TSforgeCLI/Program.cs') diff --git a/LibTSforge/Activators/ZeroCID.cs b/LibTSforge/Activators/ZeroCID.cs index 255eea2..1675173 100644 --- a/LibTSforge/Activators/ZeroCID.cs +++ b/LibTSforge/Activators/ZeroCID.cs @@ -111,7 +111,8 @@ namespace LibTSforge.Activators try { shortauth = BitConverter.ToUInt64(Convert.FromBase64String(uniqueId.Split('&')[1]), 0); - } catch + } + catch { throw new FormatException("Key Unique ID has invalid format."); } diff --git a/TSforgeCLI/Program.cs b/TSforgeCLI/Program.cs index 8581b5c..2c636b4 100644 --- a/TSforgeCLI/Program.cs +++ b/TSforgeCLI/Program.cs @@ -52,7 +52,7 @@ namespace TSforgeCLI } PSVersion version = options.Version ?? Utils.DetectVersion(); - bool production = options.Production ?? Utils.DetectCurrentKey(); + bool production = options.Production ?? SPPUtils.DetectCurrentKey(); if (options.Dump) { -- cgit v1.2.3 From 6c2df14898532996db6f23a220513e9d52eb6430 Mon Sep 17 00:00:00 2001 From: Lyssa Date: Wed, 2 Apr 2025 20:00:42 +0400 Subject: remove 8early --- LibTSforge/Common.cs | 1 - TSforgeCLI/Program.cs | 3 +-- vista.dat | Bin 21788 -> 0 bytes 3 files changed, 1 insertion(+), 3 deletions(-) delete mode 100644 vista.dat (limited to 'TSforgeCLI/Program.cs') diff --git a/LibTSforge/Common.cs b/LibTSforge/Common.cs index 75e31e4..b9c274a 100644 --- a/LibTSforge/Common.cs +++ b/LibTSforge/Common.cs @@ -10,7 +10,6 @@ namespace LibTSforge { Vista, Win7, - Win8Early, Win8, WinBlue, WinModern diff --git a/TSforgeCLI/Program.cs b/TSforgeCLI/Program.cs index 2c636b4..865e51d 100644 --- a/TSforgeCLI/Program.cs +++ b/TSforgeCLI/Program.cs @@ -223,7 +223,7 @@ namespace TSforgeCLI 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 Override the detected version. Available versions: vista, 7, 8early, 8, blue, modern."); + Logger.WriteLine("\t/ver Override the detected version. Available versions: vista, 7, 8, blue, modern."); Logger.WriteLine("\t A specific activation ID. Useful if you want to activate specific addons like ESU."); Logger.WriteLine("\t/? Display this help message."); } @@ -234,7 +234,6 @@ namespace TSforgeCLI { 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; diff --git a/vista.dat b/vista.dat deleted file mode 100644 index 97ff497..0000000 Binary files a/vista.dat and /dev/null differ -- cgit v1.2.3 From 17a7c90245ccd45b6e32d8bbe01a1a3eddeeae4d Mon Sep 17 00:00:00 2001 From: Wither OrNot Date: Thu, 3 Apr 2025 18:22:33 -0400 Subject: miscellaneous fixes --- LibTSforge/Activators/AVMA4K.cs | 2 +- LibTSforge/Common.cs | 9 ++++++--- LibTSforge/SPP/SPPUtils.cs | 4 ++-- LibTSforge/TokenStore/TokenStoreModern.cs | 1 + TSforgeCLI/Program.cs | 2 ++ 5 files changed, 12 insertions(+), 6 deletions(-) (limited to 'TSforgeCLI/Program.cs') diff --git a/LibTSforge/Activators/AVMA4K.cs b/LibTSforge/Activators/AVMA4K.cs index ec09daf..2127652 100644 --- a/LibTSforge/Activators/AVMA4K.cs +++ b/LibTSforge/Activators/AVMA4K.cs @@ -8,7 +8,7 @@ namespace LibTSforge.Activators { public static void Activate(PSVersion version, bool production, Guid actId) { - if (version != PSVersion.WinModern) + if (version != PSVersion.WinModern && version != PSVersion.WinBlue) { throw new NotSupportedException("AVMA licenses are not available for this product."); } diff --git a/LibTSforge/Common.cs b/LibTSforge/Common.cs index b9c274a..4d61770 100644 --- a/LibTSforge/Common.cs +++ b/LibTSforge/Common.cs @@ -183,6 +183,12 @@ namespace LibTSforge public static class Utils { + [DllImport("kernel32.dll")] + public static extern uint GetSystemDefaultLCID(); + + [DllImport("kernel32.dll")] + public static extern bool Wow64EnableWow64FsRedirection(bool Wow64FsEnableRedirection); + public static string DecodeString(byte[] data) { return Encoding.Unicode.GetString(data).Trim('\0'); @@ -193,9 +199,6 @@ namespace LibTSforge return Encoding.Unicode.GetBytes(str + '\0'); } - [DllImport("kernel32.dll")] - public static extern uint GetSystemDefaultLCID(); - public static uint CRC32(byte[] data) { const uint polynomial = 0x04C11DB7; diff --git a/LibTSforge/SPP/SPPUtils.cs b/LibTSforge/SPP/SPPUtils.cs index 1a6ef62..5621305 100644 --- a/LibTSforge/SPP/SPPUtils.cs +++ b/LibTSforge/SPP/SPPUtils.cs @@ -33,7 +33,7 @@ namespace LibTSforge.SPP bool stopped = false; - for (int i = 0; stopped == false && i < 360; i++) + for (int i = 0; stopped == false && i < 1080; i++) { try { @@ -48,7 +48,7 @@ namespace LibTSforge.SPP } catch (InvalidOperationException ex) { - Logger.WriteLine("Warning: Stopping sppsvc failed, retrying. Details:" + ex.Message); + Logger.WriteLine("Warning: Stopping sppsvc failed, retrying. Details: " + ex.Message); System.Threading.Thread.Sleep(500); continue; } diff --git a/LibTSforge/TokenStore/TokenStoreModern.cs b/LibTSforge/TokenStore/TokenStoreModern.cs index cfb35d0..ee51e7a 100644 --- a/LibTSforge/TokenStore/TokenStoreModern.cs +++ b/LibTSforge/TokenStore/TokenStoreModern.cs @@ -30,6 +30,7 @@ namespace LibTSforge.TokenStore BinaryReader reader = new BinaryReader(TokensFile); do { + reader.ReadUInt32(); nextBlock = reader.ReadUInt32(); for (int i = 0; i < ENTRIES_PER_BLOCK; i++) diff --git a/TSforgeCLI/Program.cs b/TSforgeCLI/Program.cs index 865e51d..86945d5 100644 --- a/TSforgeCLI/Program.cs +++ b/TSforgeCLI/Program.cs @@ -35,6 +35,8 @@ namespace TSforgeCLI { Logger.WriteLine("TSforge (c) MASSGRAVE 2025"); + Utils.Wow64EnableWow64FsRedirection(false); + try { if (args.Length == 0) -- cgit v1.2.3 From 28acb8012f3471262aa999071fbadde5ebe7edf9 Mon Sep 17 00:00:00 2001 From: Wither OrNot Date: Fri, 4 Apr 2025 03:43:27 -0400 Subject: add /siid option --- LibTSforge/Modifiers/SetIIDParams.cs | 69 ++++++++++++++++++++++++++++++++ LibTSforge/SPP/ProductKey.cs | 6 +-- TSforgeCLI/Program.cs | 76 ++++++++++++++++++++++++++++-------- 3 files changed, 130 insertions(+), 21 deletions(-) create mode 100644 LibTSforge/Modifiers/SetIIDParams.cs (limited to 'TSforgeCLI/Program.cs') diff --git a/LibTSforge/Modifiers/SetIIDParams.cs b/LibTSforge/Modifiers/SetIIDParams.cs new file mode 100644 index 0000000..d7fa2c5 --- /dev/null +++ b/LibTSforge/Modifiers/SetIIDParams.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using LibTSforge.PhysicalStore; +using LibTSforge.SPP; + +namespace LibTSforge.Modifiers +{ + public static class SetIIDParams + { + public static void SetParams(PSVersion version, bool production, Guid actId, PKeyAlgorithm algorithm, int group, int serial, ulong security) + { + if (version == PSVersion.Vista) throw new NotSupportedException("This feature is not supported on Windows Vista/Server 2008."); + + Guid appId; + + if (actId == Guid.Empty) + { + appId = SLApi.WINDOWS_APP_ID; + actId = SLApi.GetDefaultActivationID(appId, true); + + if (actId == Guid.Empty) + { + throw new Exception("No applicable activation IDs found."); + } + } + else + { + appId = SLApi.GetAppId(actId); + } + + Guid pkeyId = SLApi.GetInstalledPkeyID(actId); + + SPPUtils.KillSPP(version); + + Logger.WriteLine("Writing TrustedStore data..."); + + using (IPhysicalStore store = SPPUtils.GetStore(version, production)) + { + string key = string.Format("SPPSVC\\{0}\\{1}", appId, actId); + PSBlock keyBlock = store.GetBlock(key, pkeyId.ToString()); + + if (keyBlock == null) + { + throw new InvalidDataException("Failed to get product key data for activation ID " + actId + "."); + } + + VariableBag pkb = new VariableBag(keyBlock.Data, version); + + ProductKey pkey = new ProductKey + { + Group = group, + Serial = serial, + Security = security, + Algorithm = algorithm, + Upgrade = false + }; + + string blockName = version == PSVersion.Win7 ? "SppPkeyShortAuthenticator" : "SppPkeyPhoneActivationData"; + pkb.SetBlock(blockName, pkey.GetPhoneData(version)); + store.SetBlock(key, pkeyId.ToString(), pkb.Serialize()); + } + + Logger.WriteLine("Successfully set IID parameters."); + } + } +} diff --git a/LibTSforge/SPP/ProductKey.cs b/LibTSforge/SPP/ProductKey.cs index ce454d8..ae48893 100644 --- a/LibTSforge/SPP/ProductKey.cs +++ b/LibTSforge/SPP/ProductKey.cs @@ -249,10 +249,8 @@ namespace LibTSforge.SPP { if (version == PSVersion.Win7) { - Random rnd = new Random(Group * 1000000000 + Serial); - byte[] data = new byte[8]; - rnd.NextBytes(data); - return data; + ulong shortauth = ((ulong)Group << 41) | ((ulong)Security << 31) | ((ulong)Serial << 1) | (Upgrade ? (ulong)1 : 0); + return BitConverter.GetBytes(shortauth); } int serialHigh = Serial / 1000000; diff --git a/TSforgeCLI/Program.cs b/TSforgeCLI/Program.cs index 86945d5..2c72265 100644 --- a/TSforgeCLI/Program.cs +++ b/TSforgeCLI/Program.cs @@ -25,10 +25,15 @@ namespace TSforgeCLI public bool KMSHostCharge = false; public bool TamperedFlagsDelete = false; public bool KeyChangeLockDelete = false; + public bool SetIIDParams = false; public bool? Production = null; public PSVersion? Version = null; public Guid ActivationId = Guid.Empty; public bool ShowHelp = false; + public PKeyAlgorithm? Algorithm = null; + public int Group = 0; + public int Serial = 0; + public ulong Security = 0; } public static void Main(string[] args) @@ -103,6 +108,10 @@ namespace TSforgeCLI else if (options.KeyChangeLockDelete) { KeyChangeLockDelete.Delete(version, production); + } + else if (options.SetIIDParams) + { + SetIIDParams.SetParams(version, production, options.ActivationId, options.Algorithm.Value, options.Group, options.Serial, options.Security); } else { @@ -187,6 +196,38 @@ namespace TSforgeCLI break; case "/revl": options.KeyChangeLockDelete = true; + break; + case "/siid": + options.SetIIDParams = true; + + if (args.Length - i - 1 < 4) throw new ArgumentException("Not enough arguments specified."); + + string algoType = args[++i]; + + if (algoType == "5") + { + options.Algorithm = PKeyAlgorithm.PKEY2005; + } + else if (algoType == "9") + { + options.Algorithm = PKeyAlgorithm.PKEY2009; + } + else + { + throw new ArgumentException("Invalid key algorithm specified."); + } + + try + { + options.Group = int.Parse(args[++i]); + options.Serial = int.Parse(args[++i]); + options.Security = ulong.Parse(args[++i]); + } + catch + { + throw new ArgumentException("Failed to parse key parameters."); + } + break; default: try @@ -211,23 +252,24 @@ namespace TSforgeCLI string exeName = typeof(Program).Namespace; Logger.WriteLine("Usage: " + exeName + " [/dump ()] [/load ] [/kms4k] [/avma4k] [/zcid] [/rtmr] [/duid] [/igpk] [/kmsc] [/ctpr] [/revl] [/prod] [/test] [] [/ver ]"); Logger.WriteLine("Options:"); - Logger.WriteLine("\t/dump () Dump and decrypt the physical store to the specified path."); - Logger.WriteLine("\t/load 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 Override the detected version. Available versions: vista, 7, 8, blue, modern."); - Logger.WriteLine("\t A specific activation ID. Useful if you want to activate specific addons like ESU."); - Logger.WriteLine("\t/? Display this help message."); + Logger.WriteLine("\t/dump () Dump and decrypt the physical store to the specified path."); + Logger.WriteLine("\t/load 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/siid <5/9> Set Installation ID parameters independently of installed key. 5/9 argument specifies PKEY200[5/9] key algorithm."); + Logger.WriteLine("\t/prod Use SPP production key."); + Logger.WriteLine("\t/test Use SPP test key."); + Logger.WriteLine("\t/ver Override the detected version. Available versions: vista, 7, 8, blue, modern."); + Logger.WriteLine("\t 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) -- cgit v1.2.3 From f6353e567a585f9f456627b050f5c8b63767bf0e Mon Sep 17 00:00:00 2001 From: Lyssa Date: Sun, 6 Apr 2025 19:27:33 +0400 Subject: remove redundant break --- TSforgeCLI/Program.cs | 1 - 1 file changed, 1 deletion(-) (limited to 'TSforgeCLI/Program.cs') diff --git a/TSforgeCLI/Program.cs b/TSforgeCLI/Program.cs index 2c72265..7c1a50b 100644 --- a/TSforgeCLI/Program.cs +++ b/TSforgeCLI/Program.cs @@ -238,7 +238,6 @@ namespace TSforgeCLI { Logger.WriteLine("Argument doesn't exist or the specified activation ID is invalid."); options.ShowHelp = true; - break; } break; } -- cgit v1.2.3 From 0c8b1efaa9005de1d101ebab5e66117edfaec3b2 Mon Sep 17 00:00:00 2001 From: Lyssa Date: Mon, 7 Apr 2025 19:19:24 +0400 Subject: Minor fixups --- LibTSforge/Activators/AVMA4K.cs | 22 +++++------- LibTSforge/Activators/KMS4K.cs | 12 +++---- LibTSforge/Activators/ZeroCID.cs | 13 ++++--- LibTSforge/Crypto/PhysStoreCrypto.cs | 38 ++++++++++---------- LibTSforge/Modifiers/GenPKeyInstall.cs | 12 +++---- LibTSforge/Modifiers/GracePeriodReset.cs | 4 +-- LibTSforge/Modifiers/KMSHostCharge.cs | 12 +++---- LibTSforge/Modifiers/KeyChangeLockDelete.cs | 5 ++- LibTSforge/Modifiers/RearmReset.cs | 4 +-- LibTSforge/Modifiers/SetIIDParams.cs | 12 +++---- LibTSforge/Modifiers/TamperedFlagsDelete.cs | 6 ++-- LibTSforge/Modifiers/UniqueIdDelete.cs | 5 ++- LibTSforge/PhysicalStore/Common.cs | 4 +-- LibTSforge/PhysicalStore/PhysicalStoreModern.cs | 48 +++++++++++++------------ LibTSforge/PhysicalStore/PhysicalStoreVista.cs | 4 +-- LibTSforge/PhysicalStore/PhysicalStoreWin7.cs | 4 +-- LibTSforge/PhysicalStore/VariableBag.cs | 3 +- LibTSforge/SPP/PKeyConfig.cs | 7 +--- LibTSforge/SPP/ProductKey.cs | 26 +++++++------- LibTSforge/SPP/SLAPI.cs | 27 ++++++-------- LibTSforge/SPP/SPPUtils.cs | 10 +++--- LibTSforge/SPP/SPSys.cs | 2 +- LibTSforge/TokenStore/Common.cs | 4 +-- LibTSforge/TokenStore/TokenStoreModern.cs | 14 +++----- TSforgeCLI/Program.cs | 42 +++++++++++----------- 25 files changed, 157 insertions(+), 183 deletions(-) (limited to 'TSforgeCLI/Program.cs') diff --git a/LibTSforge/Activators/AVMA4K.cs b/LibTSforge/Activators/AVMA4K.cs index 2127652..51b546a 100644 --- a/LibTSforge/Activators/AVMA4K.cs +++ b/LibTSforge/Activators/AVMA4K.cs @@ -1,8 +1,8 @@ namespace LibTSforge.Activators { using System; - using LibTSforge.PhysicalStore; - using LibTSforge.SPP; + using PhysicalStore; + using SPP; public static class AVMA4k { @@ -42,24 +42,20 @@ namespace LibTSforge.Activators { string key = string.Format("SPPSVC\\{0}\\{1}", appId, actId); - ulong unknown = 0; - ulong time1; - ulong crcBindTime = (ulong)DateTime.UtcNow.ToFileTime(); - ulong timerTime; - - ulong expiry = Constants.TimerMax; - long creationTime = BitConverter.ToInt64(store.GetBlock("__##USERSEP##\\$$_RESERVED_$$\\NAMESPACE__", "__##USERSEP-RESERVED##__$$GLOBAL-CREATION-TIME$$").Data, 0); long tickCount = BitConverter.ToInt64(store.GetBlock("__##USERSEP##\\$$_RESERVED_$$\\NAMESPACE__", "__##USERSEP-RESERVED##__$$GLOBAL-TICKCOUNT-UPTIME$$").Data, 0); long deltaTime = BitConverter.ToInt64(store.GetBlock(key, "__##USERSEP-RESERVED##__$$UP-TIME-DELTA$$").Data, 0); - time1 = (ulong)(creationTime + tickCount + deltaTime); - timerTime = crcBindTime / 10000; + const ulong unknown = 0; + ulong time1 = (ulong)(creationTime + tickCount + deltaTime); + ulong crcBindTime = (ulong)DateTime.UtcNow.ToFileTime(); + ulong timerTime = crcBindTime / 10000; + ulong expiry = Constants.TimerMax; expiry /= 10000; VariableBag avmaBinding = new VariableBag(version); - avmaBinding.Blocks.AddRange(new CRCBlockModern[] + avmaBinding.Blocks.AddRange(new[] { new CRCBlockModern { @@ -97,7 +93,7 @@ namespace LibTSforge.Activators store.DeleteBlock(key, storeVal); store.DeleteBlock(key, timerVal); - store.AddBlocks(new PSBlock[] + store.AddBlocks(new[] { new PSBlock { diff --git a/LibTSforge/Activators/KMS4K.cs b/LibTSforge/Activators/KMS4K.cs index a68e263..6287c39 100644 --- a/LibTSforge/Activators/KMS4K.cs +++ b/LibTSforge/Activators/KMS4K.cs @@ -2,8 +2,8 @@ namespace LibTSforge.Activators { using System; using System.IO; - using LibTSforge.PhysicalStore; - using LibTSforge.SPP; + using PhysicalStore; + using SPP; public class KMS4k { @@ -78,7 +78,7 @@ namespace LibTSforge.Activators writer.Write(Constants.UniversalHWIDBlock); byte[] kmsData = writer.GetBytes(); - store.AddBlocks(new PSBlock[] + store.AddBlocks(new[] { new PSBlock { @@ -121,7 +121,7 @@ namespace LibTSforge.Activators VariableBag kmsBinding = new VariableBag(version); - kmsBinding.Blocks.AddRange(new CRCBlockModern[] + kmsBinding.Blocks.AddRange(new[] { new CRCBlockModern { @@ -145,7 +145,7 @@ namespace LibTSforge.Activators if (version == PSVersion.WinModern) { - kmsBinding.Blocks.AddRange(new CRCBlockModern[] + kmsBinding.Blocks.AddRange(new[] { new CRCBlockModern { @@ -178,7 +178,7 @@ namespace LibTSforge.Activators store.DeleteBlock(key, storeVal); store.DeleteBlock(key, timerVal); - store.AddBlocks(new PSBlock[] + store.AddBlocks(new[] { new PSBlock { diff --git a/LibTSforge/Activators/ZeroCID.cs b/LibTSforge/Activators/ZeroCID.cs index 1675173..147dceb 100644 --- a/LibTSforge/Activators/ZeroCID.cs +++ b/LibTSforge/Activators/ZeroCID.cs @@ -3,14 +3,13 @@ namespace LibTSforge.Activators using System; using System.IO; using System.Linq; - using System.Text.RegularExpressions; - using LibTSforge.Crypto; - using LibTSforge.PhysicalStore; - using LibTSforge.SPP; + using Crypto; + using PhysicalStore; + using SPP; public static class ZeroCID { - public static void Deposit(Guid actId, string instId) + private static void Deposit(Guid actId, string instId) { uint status = SLApi.DepositConfirmationID(actId, instId, Constants.ZeroCID); Logger.WriteLine(string.Format("Depositing fake CID status {0:X}", status)); @@ -98,7 +97,7 @@ namespace LibTSforge.Activators string uniqueId = Utils.DecodeString(pkeyData.Skip(0x120).Take(0x80).ToArray()); string extPid = Utils.DecodeString(pkeyData.Skip(0x1A0).Take(0x80).ToArray()); - uint group = 0; + uint group; uint.TryParse(extPid.Split('-')[1], out group); if (group == 0) @@ -154,7 +153,7 @@ namespace LibTSforge.Activators store.DeleteBlock(key, hwidBlockName); store.DeleteBlock(key, pkeyInfoName); - store.AddBlocks(new PSBlock[] { + store.AddBlocks(new[] { new PSBlock { Type = BlockType.NAMED, diff --git a/LibTSforge/Crypto/PhysStoreCrypto.cs b/LibTSforge/Crypto/PhysStoreCrypto.cs index b0acc2e..083841d 100644 --- a/LibTSforge/Crypto/PhysStoreCrypto.cs +++ b/LibTSforge/Crypto/PhysStoreCrypto.cs @@ -18,31 +18,31 @@ namespace LibTSforge.Crypto if (CryptoUtils.RSAVerifySignature(rsaKey, encAesKey, aesKeySig)) { - byte[] aesKey = CryptoUtils.RSADecrypt(rsaKey, encAesKey); - byte[] decData = CryptoUtils.AESDecrypt(br.ReadBytes((int)br.BaseStream.Length - 0x110), aesKey); - byte[] hmacKey = decData.Take(0x10).ToArray(); // SHA-1 salt on Vista - byte[] hmacSig = decData.Skip(0x10).Take(0x14).ToArray(); // SHA-1 hash on Vista - byte[] psData = decData.Skip(0x28).ToArray(); + throw new Exception("Failed to decrypt physical store."); + } + + byte[] aesKey = CryptoUtils.RSADecrypt(rsaKey, encAesKey); + byte[] decData = CryptoUtils.AESDecrypt(br.ReadBytes((int)br.BaseStream.Length - 0x110), aesKey); + byte[] hmacKey = decData.Take(0x10).ToArray(); // SHA-1 salt on Vista + byte[] hmacSig = decData.Skip(0x10).Take(0x14).ToArray(); // SHA-1 hash on Vista + byte[] psData = decData.Skip(0x28).ToArray(); - if (version != PSVersion.Vista) + if (version != PSVersion.Vista) + { + if (!CryptoUtils.HMACVerify(hmacKey, psData, hmacSig)) { - if (!CryptoUtils.HMACVerify(hmacKey, psData, hmacSig)) - { - throw new InvalidDataException("Failed to verify HMAC. Physical store is corrupt."); - } + throw new InvalidDataException("Failed to verify HMAC. Physical store is corrupt."); } - else + } + else + { + if (!CryptoUtils.SaltSHAVerify(hmacKey, psData, hmacSig)) { - if (!CryptoUtils.SaltSHAVerify(hmacKey, psData, hmacSig)) - { - throw new InvalidDataException("Failed to verify checksum. Physical store is corrupt."); - } + throw new InvalidDataException("Failed to verify checksum. Physical store is corrupt."); } - - return psData; } - throw new Exception("Failed to decrypt physical store."); + return psData; } public static byte[] EncryptPhysicalStore(byte[] data, bool production, PSVersion version) @@ -65,7 +65,7 @@ namespace LibTSforge.Crypto byte[] aesKeySig = CryptoUtils.RSASign(rsaKey, encAesKey); byte[] hmacSig = version != PSVersion.Vista ? CryptoUtils.HMACSign(hmacKey, data) : CryptoUtils.SaltSHASum(hmacKey, data); - byte[] decData = new byte[] { }; + byte[] decData = { }; decData = decData.Concat(hmacKey).Concat(hmacSig).Concat(BitConverter.GetBytes(0)).Concat(data).ToArray(); byte[] encData = CryptoUtils.AESEncrypt(decData, aesKey); diff --git a/LibTSforge/Modifiers/GenPKeyInstall.cs b/LibTSforge/Modifiers/GenPKeyInstall.cs index 2e4c23d..a747952 100644 --- a/LibTSforge/Modifiers/GenPKeyInstall.cs +++ b/LibTSforge/Modifiers/GenPKeyInstall.cs @@ -3,9 +3,9 @@ namespace LibTSforge.Modifiers using System; using System.IO; using Microsoft.Win32; - using LibTSforge.PhysicalStore; - using LibTSforge.SPP; - using LibTSforge.TokenStore; + using PhysicalStore; + using SPP; + using TokenStore; public static class GenPKeyInstall { @@ -58,7 +58,7 @@ namespace LibTSforge.Modifiers if (pkey.Algorithm == PKeyAlgorithm.PKEY2009) { uint status = SLApi.InstallProductKey(pkey); - Logger.WriteLine(string.Format("Installing generated product key {0} status {1:X}", pkey.ToString(), status)); + Logger.WriteLine(string.Format("Installing generated product key {0} status {1:X}", pkey, status)); if ((int)status < 0) { @@ -74,7 +74,7 @@ namespace LibTSforge.Modifiers if (pkey.Channel == "Volume:GVLK" && version == PSVersion.Win7) throw new NotSupportedException("Fake GVLK generation is not supported on Windows 7."); VariableBag pkb = new VariableBag(version); - pkb.Blocks.AddRange(new CRCBlockModern[] + pkb.Blocks.AddRange(new[] { new CRCBlockModern { @@ -169,7 +169,7 @@ namespace LibTSforge.Modifiers uriMap.Data[pkeyId] = pkey.GetAlgoUri(); tks.SetEntry(uriMapName, "xml", uriMap.Serialize()); - string skuMetaName = actId.ToString() + metSuffix; + string skuMetaName = actId + metSuffix; TokenMeta skuMeta = tks.GetMetaEntry(skuMetaName); foreach (string k in skuMeta.Data.Keys) diff --git a/LibTSforge/Modifiers/GracePeriodReset.cs b/LibTSforge/Modifiers/GracePeriodReset.cs index 059b1c5..3d0f6a3 100644 --- a/LibTSforge/Modifiers/GracePeriodReset.cs +++ b/LibTSforge/Modifiers/GracePeriodReset.cs @@ -2,8 +2,8 @@ namespace LibTSforge.Modifiers { using System.Collections.Generic; using System.Linq; - using LibTSforge.PhysicalStore; - using LibTSforge.SPP; + using PhysicalStore; + using SPP; public static class GracePeriodReset { diff --git a/LibTSforge/Modifiers/KMSHostCharge.cs b/LibTSforge/Modifiers/KMSHostCharge.cs index 94f4dfd..153c700 100644 --- a/LibTSforge/Modifiers/KMSHostCharge.cs +++ b/LibTSforge/Modifiers/KMSHostCharge.cs @@ -2,8 +2,8 @@ namespace LibTSforge.Modifiers { using System; using System.IO; - using LibTSforge.PhysicalStore; - using LibTSforge.SPP; + using PhysicalStore; + using SPP; public static class KMSHostCharge { @@ -31,9 +31,9 @@ namespace LibTSforge.Modifiers string key = string.Format("SPPSVC\\{0}", appId); long ldapTimestamp = DateTime.Now.ToFileTime(); - byte[] cmidGuids = new byte[] { }; - byte[] reqCounts = new byte[] { }; - byte[] kmsChargeData = new byte[] { }; + byte[] cmidGuids = { }; + byte[] reqCounts = { }; + byte[] kmsChargeData = { }; BinaryWriter writer = new BinaryWriter(new MemoryStream()); @@ -94,7 +94,7 @@ namespace LibTSforge.Modifiers if (version != PSVersion.Vista) { VariableBag kmsCountData = new VariableBag(version); - kmsCountData.Blocks.AddRange(new CRCBlockModern[] + kmsCountData.Blocks.AddRange(new[] { new CRCBlockModern { diff --git a/LibTSforge/Modifiers/KeyChangeLockDelete.cs b/LibTSforge/Modifiers/KeyChangeLockDelete.cs index 3883d3c..f6ec3de 100644 --- a/LibTSforge/Modifiers/KeyChangeLockDelete.cs +++ b/LibTSforge/Modifiers/KeyChangeLockDelete.cs @@ -2,9 +2,8 @@ namespace LibTSforge.Modifiers { using System.Collections.Generic; using System.Linq; - using LibTSforge.PhysicalStore; - using LibTSforge.SPP; - using LibTSforge; + using PhysicalStore; + using SPP; using System; public static class KeyChangeLockDelete diff --git a/LibTSforge/Modifiers/RearmReset.cs b/LibTSforge/Modifiers/RearmReset.cs index 89a12f3..e909316 100644 --- a/LibTSforge/Modifiers/RearmReset.cs +++ b/LibTSforge/Modifiers/RearmReset.cs @@ -2,8 +2,8 @@ namespace LibTSforge.Modifiers { using System.Collections.Generic; using System.Linq; - using LibTSforge.PhysicalStore; - using LibTSforge.SPP; + using PhysicalStore; + using SPP; public static class RearmReset { diff --git a/LibTSforge/Modifiers/SetIIDParams.cs b/LibTSforge/Modifiers/SetIIDParams.cs index d7fa2c5..2f34a7d 100644 --- a/LibTSforge/Modifiers/SetIIDParams.cs +++ b/LibTSforge/Modifiers/SetIIDParams.cs @@ -1,13 +1,9 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using LibTSforge.PhysicalStore; -using LibTSforge.SPP; - namespace LibTSforge.Modifiers { + using PhysicalStore; + using SPP; + using System.IO; + using System; public static class SetIIDParams { public static void SetParams(PSVersion version, bool production, Guid actId, PKeyAlgorithm algorithm, int group, int serial, ulong security) diff --git a/LibTSforge/Modifiers/TamperedFlagsDelete.cs b/LibTSforge/Modifiers/TamperedFlagsDelete.cs index 8369d4e..a9edc55 100644 --- a/LibTSforge/Modifiers/TamperedFlagsDelete.cs +++ b/LibTSforge/Modifiers/TamperedFlagsDelete.cs @@ -1,8 +1,8 @@ namespace LibTSforge.Modifiers { using System.Linq; - using LibTSforge.PhysicalStore; - using LibTSforge.SPP; + using PhysicalStore; + using SPP; public static class TamperedFlagsDelete { @@ -14,7 +14,7 @@ namespace LibTSforge.Modifiers using (IPhysicalStore store = SPPUtils.GetStore(version, production)) { - if (version == PSVersion.Vista) + if (version == PSVersion.Vista) { DeleteFlag(store, "6BE8425B-E3CF-4e86-A6AF-5863E3DCB606"); } diff --git a/LibTSforge/Modifiers/UniqueIdDelete.cs b/LibTSforge/Modifiers/UniqueIdDelete.cs index d1851c4..b66954a 100644 --- a/LibTSforge/Modifiers/UniqueIdDelete.cs +++ b/LibTSforge/Modifiers/UniqueIdDelete.cs @@ -1,8 +1,8 @@ namespace LibTSforge.Modifiers { using System; - using LibTSforge.PhysicalStore; - using LibTSforge.SPP; + using PhysicalStore; + using SPP; public static class UniqueIdDelete { @@ -27,7 +27,6 @@ namespace LibTSforge.Modifiers appId = SLApi.GetAppId(actId); } - string instId = SLApi.GetInstallationID(actId); Guid pkeyId = SLApi.GetInstalledPkeyID(actId); SPPUtils.KillSPP(version); diff --git a/LibTSforge/PhysicalStore/Common.cs b/LibTSforge/PhysicalStore/Common.cs index d0ad4fe..aef77f8 100644 --- a/LibTSforge/PhysicalStore/Common.cs +++ b/LibTSforge/PhysicalStore/Common.cs @@ -4,9 +4,9 @@ namespace LibTSforge.PhysicalStore public enum BlockType : uint { - NONE, + NONE, // unused NAMED, - ATTRIBUTE, + ATTRIBUTE, //unused TIMER } diff --git a/LibTSforge/PhysicalStore/PhysicalStoreModern.cs b/LibTSforge/PhysicalStore/PhysicalStoreModern.cs index 9d8bb73..b76852a 100644 --- a/LibTSforge/PhysicalStore/PhysicalStoreModern.cs +++ b/LibTSforge/PhysicalStore/PhysicalStoreModern.cs @@ -3,7 +3,7 @@ namespace LibTSforge.PhysicalStore using System; using System.Collections.Generic; using System.IO; - using LibTSforge.Crypto; + using Crypto; public class ModernBlock { @@ -93,7 +93,7 @@ namespace LibTSforge.PhysicalStore public sealed class PhysicalStoreModern : IPhysicalStore { - private byte[] PreHeaderBytes = new byte[] { }; + private byte[] PreHeaderBytes = { }; private readonly Dictionary> Data = new Dictionary>(); private readonly FileStream TSFile; private readonly PSVersion Version; @@ -281,40 +281,44 @@ namespace LibTSforge.PhysicalStore public void DeleteBlock(string key, string value) { - if (Data.ContainsKey(key)) + if (!Data.ContainsKey(key)) { - List blocks = Data[key]; + return; + } - foreach (ModernBlock block in blocks) + List blocks = Data[key]; + + foreach (ModernBlock block in blocks) + { + if (block.ValueAsStr == value) { - if (block.ValueAsStr == value) - { - blocks.Remove(block); - break; - } + blocks.Remove(block); + break; } - - Data[key] = blocks; } + + Data[key] = blocks; } public void DeleteBlock(string key, uint value) { - if (Data.ContainsKey(key)) + if (!Data.ContainsKey(key)) { - List blocks = Data[key]; + return; + } - foreach (ModernBlock block in blocks) + List blocks = Data[key]; + + foreach (ModernBlock block in blocks) + { + if (block.ValueAsInt == value) { - if (block.ValueAsInt == value) - { - blocks.Remove(block); - break; - } + blocks.Remove(block); + break; } - - Data[key] = blocks; } + + Data[key] = blocks; } public PhysicalStoreModern(string tsPath, bool production, PSVersion version) diff --git a/LibTSforge/PhysicalStore/PhysicalStoreVista.cs b/LibTSforge/PhysicalStore/PhysicalStoreVista.cs index 809be77..5251914 100644 --- a/LibTSforge/PhysicalStore/PhysicalStoreVista.cs +++ b/LibTSforge/PhysicalStore/PhysicalStoreVista.cs @@ -3,7 +3,7 @@ namespace LibTSforge.PhysicalStore using System; using System.Collections.Generic; using System.IO; - using LibTSforge.Crypto; + using Crypto; public class VistaBlock { @@ -88,7 +88,7 @@ namespace LibTSforge.PhysicalStore public sealed class PhysicalStoreVista : IPhysicalStore { - private byte[] PreHeaderBytes = new byte[] { }; + private byte[] PreHeaderBytes = { }; private readonly List Blocks = new List(); private readonly FileStream TSPrimary; private readonly FileStream TSSecondary; diff --git a/LibTSforge/PhysicalStore/PhysicalStoreWin7.cs b/LibTSforge/PhysicalStore/PhysicalStoreWin7.cs index d03bf9a..006c8df 100644 --- a/LibTSforge/PhysicalStore/PhysicalStoreWin7.cs +++ b/LibTSforge/PhysicalStore/PhysicalStoreWin7.cs @@ -3,7 +3,7 @@ namespace LibTSforge.PhysicalStore using System; using System.Collections.Generic; using System.IO; - using LibTSforge.Crypto; + using Crypto; public class Win7Block { @@ -105,7 +105,7 @@ namespace LibTSforge.PhysicalStore public sealed class PhysicalStoreWin7 : IPhysicalStore { - private byte[] PreHeaderBytes = new byte[] { }; + private byte[] PreHeaderBytes = { }; private readonly List Blocks = new List(); private readonly FileStream TSPrimary; private readonly FileStream TSSecondary; diff --git a/LibTSforge/PhysicalStore/VariableBag.cs b/LibTSforge/PhysicalStore/VariableBag.cs index ebe413f..bca0e32 100644 --- a/LibTSforge/PhysicalStore/VariableBag.cs +++ b/LibTSforge/PhysicalStore/VariableBag.cs @@ -74,7 +74,6 @@ namespace LibTSforge.PhysicalStore public override void Decode(BinaryReader reader) { uint type = reader.ReadUInt32(); - uint unk_zero = reader.ReadUInt32(); uint lenName = reader.ReadUInt32(); uint lenVal = reader.ReadUInt32(); uint crc = reader.ReadUInt32(); @@ -156,7 +155,7 @@ namespace LibTSforge.PhysicalStore public List Blocks = new List(); private readonly PSVersion Version; - public void Deserialize(byte[] data) + private void Deserialize(byte[] data) { int len = data.Length; diff --git a/LibTSforge/SPP/PKeyConfig.cs b/LibTSforge/SPP/PKeyConfig.cs index 6733940..83fc981 100644 --- a/LibTSforge/SPP/PKeyConfig.cs +++ b/LibTSforge/SPP/PKeyConfig.cs @@ -74,7 +74,7 @@ namespace LibTSforge.SPP public class PKeyConfig { - public Dictionary Products = new Dictionary(); + public readonly Dictionary Products = new Dictionary(); private readonly List loadedPkeyConfigs = new List(); public void LoadConfig(Guid actId) @@ -210,10 +210,5 @@ namespace LibTSforge.SPP } } } - - public PKeyConfig() - { - - } } } diff --git a/LibTSforge/SPP/ProductKey.cs b/LibTSforge/SPP/ProductKey.cs index ae48893..f4cf15a 100644 --- a/LibTSforge/SPP/ProductKey.cs +++ b/LibTSforge/SPP/ProductKey.cs @@ -3,8 +3,8 @@ namespace LibTSforge.SPP using System; using System.IO; using System.Linq; - using LibTSforge.Crypto; - using LibTSforge.PhysicalStore; + using Crypto; + using PhysicalStore; public class ProductKey { @@ -18,16 +18,16 @@ namespace LibTSforge.SPP public ulong Security; public bool Upgrade; public PKeyAlgorithm Algorithm; - public string EulaType; - public string PartNumber; - public string Edition; - public string Channel; - public Guid ActivationId; + private readonly string EulaType; + private readonly string PartNumber; + public readonly string Edition; + public readonly string Channel; + private readonly Guid ActivationId; private string mpc; private string pid2; - public byte[] KeyBytes + private byte[] KeyBytes { get { return BitConverter.GetBytes(klow).Concat(BitConverter.GetBytes(khigh)).ToArray(); } } @@ -66,7 +66,7 @@ namespace LibTSforge.SPP public Guid GetPkeyId() { VariableBag pkb = new VariableBag(PSVersion.WinModern); - pkb.Blocks.AddRange(new CRCBlockModern[] + pkb.Blocks.AddRange(new[] { new CRCBlockModern { @@ -91,7 +91,7 @@ namespace LibTSforge.SPP return new Guid(CryptoUtils.SHA256Hash(pkb.Serialize()).Take(16).ToArray()); } - public string GetDefaultMPC() + private string GetDefaultMPC() { int build = Environment.OSVersion.Version.Build; string defaultMPC = build >= 10240 ? "03612" : @@ -111,7 +111,7 @@ namespace LibTSforge.SPP mpc = GetDefaultMPC(); // setup.cfg doesn't exist in Windows 8+ - string setupcfg = string.Format("{0}\\oobe\\{1}", Environment.SystemDirectory, "setup.cfg"); + string setupcfg = string.Format(@"{0}\oobe\{1}", Environment.SystemDirectory, "setup.cfg"); if (!File.Exists(setupcfg) || Edition.Contains(";")) { @@ -205,7 +205,7 @@ namespace LibTSforge.SPP return writer.GetBytes(); } - public string GetExtendedPid() + private string GetExtendedPid() { string mpc = GetMPC(); int serialHigh = Serial / 1000000; @@ -249,7 +249,7 @@ namespace LibTSforge.SPP { if (version == PSVersion.Win7) { - ulong shortauth = ((ulong)Group << 41) | ((ulong)Security << 31) | ((ulong)Serial << 1) | (Upgrade ? (ulong)1 : 0); + ulong shortauth = ((ulong)Group << 41) | (Security << 31) | ((ulong)Serial << 1) | (Upgrade ? (ulong)1 : 0); return BitConverter.GetBytes(shortauth); } diff --git a/LibTSforge/SPP/SLAPI.cs b/LibTSforge/SPP/SLAPI.cs index c25fb03..fc5823b 100644 --- a/LibTSforge/SPP/SLAPI.cs +++ b/LibTSforge/SPP/SLAPI.cs @@ -86,9 +86,6 @@ namespace LibTSforge.SPP [DllImport("slc.dll", CharSet = CharSet.Unicode)] private static extern uint SLGetProductSkuInformation(IntPtr hSLC, ref Guid pProductSkuId, string pwszValueName, out SLDATATYPE peDataType, out uint pcbValue, out IntPtr ppbValue); - [DllImport("slc.dll", CharSet = CharSet.Unicode)] - private static extern uint SLGetProductSkuInformation(IntPtr hSLC, ref Guid pProductSkuId, string pwszValueName, IntPtr peDataType, out uint pcbValue, out IntPtr ppbValue); - [DllImport("slc.dll", CharSet = CharSet.Unicode)] private static extern uint SLGetLicense(IntPtr hSLC, ref Guid pLicenseFileId, out uint pcbLicenseFile, out IntPtr ppbLicenseFile); @@ -98,7 +95,7 @@ namespace LibTSforge.SPP [DllImport("slc.dll", CharSet = CharSet.Unicode)] private static extern uint SLFireEvent(IntPtr hSLC, string pwszEventId, ref Guid pApplicationId); - public class SLContext : IDisposable + private class SLContext : IDisposable { public readonly IntPtr Handle; @@ -161,11 +158,10 @@ namespace LibTSforge.SPP { using (SLContext sl = new SLContext()) { - uint status; uint count; IntPtr pProductKeyIds; - status = SLGetSLIDList(sl.Handle, SLIDTYPE.SL_ID_PRODUCT_SKU, ref actId, SLIDTYPE.SL_ID_PKEY, out count, out pProductKeyIds); + uint status = SLGetSLIDList(sl.Handle, SLIDTYPE.SL_ID_PRODUCT_SKU, ref actId, SLIDTYPE.SL_ID_PKEY, out count, out pProductKeyIds); if (status != 0 || count == 0) { @@ -189,7 +185,7 @@ namespace LibTSforge.SPP SLConsumeWindowsRight(0); } - public static bool RefreshTrustedTime(Guid actId) + public static void RefreshTrustedTime(Guid actId) { using (SLContext sl = new SLContext()) { @@ -197,8 +193,7 @@ namespace LibTSforge.SPP uint count; IntPtr ppbValue; - uint status = SLGetProductSkuInformation(sl.Handle, ref actId, "TrustedTime", out type, out count, out ppbValue); - return (int)status >= 0 && status != 0xC004F012; + SLGetProductSkuInformation(sl.Handle, ref actId, "TrustedTime", out type, out count, out ppbValue); } } @@ -214,11 +209,10 @@ namespace LibTSforge.SPP { using (SLContext sl = new SLContext()) { - uint status; uint count; IntPtr pAppIds; - status = SLGetSLIDList(sl.Handle, SLIDTYPE.SL_ID_PRODUCT_SKU, ref actId, SLIDTYPE.SL_ID_APPLICATION, out count, out pAppIds); + uint status = SLGetSLIDList(sl.Handle, SLIDTYPE.SL_ID_PRODUCT_SKU, ref actId, SLIDTYPE.SL_ID_APPLICATION, out count, out pAppIds); if (status != 0 || count == 0) { @@ -242,15 +236,14 @@ namespace LibTSforge.SPP } } - public static Guid GetLicenseFileId(Guid licId) + private static Guid GetLicenseFileId(Guid licId) { using (SLContext sl = new SLContext()) { - uint status; uint count; IntPtr ppReturnLics; - status = SLGetSLIDList(sl.Handle, SLIDTYPE.SL_ID_LICENSE, ref licId, SLIDTYPE.SL_ID_LICENSE_FILE, out count, out ppReturnLics); + uint status = SLGetSLIDList(sl.Handle, SLIDTYPE.SL_ID_LICENSE, ref licId, SLIDTYPE.SL_ID_LICENSE_FILE, out count, out ppReturnLics); if (status != 0 || count == 0) { @@ -312,7 +305,7 @@ namespace LibTSforge.SPP IntPtr ppbValue; uint status = SLGetProductSkuInformation(sl.Handle, ref actId, "msft:sl/EUL/PHONE/PUBLIC", out type, out count, out ppbValue); - return status >= 0 && status != 0xC004F012; + return status != 0xC004F012; } } @@ -395,11 +388,11 @@ namespace LibTSforge.SPP } } - public static uint UninstallProductKey(Guid pkeyId) + public static void UninstallProductKey(Guid pkeyId) { using (SLContext sl = new SLContext()) { - return SLUninstallProofOfPurchase(sl.Handle, ref pkeyId); + SLUninstallProofOfPurchase(sl.Handle, ref pkeyId); } } diff --git a/LibTSforge/SPP/SPPUtils.cs b/LibTSforge/SPP/SPPUtils.cs index a535bc7..062e5ca 100644 --- a/LibTSforge/SPP/SPPUtils.cs +++ b/LibTSforge/SPP/SPPUtils.cs @@ -1,13 +1,13 @@ namespace LibTSforge.SPP { - using LibTSforge.Crypto; - using LibTSforge.PhysicalStore; - using LibTSforge.TokenStore; using Microsoft.Win32; using System; using System.IO; using System.Linq; using System.ServiceProcess; + using Crypto; + using PhysicalStore; + using TokenStore; public static class SPPUtils { @@ -148,7 +148,7 @@ namespace LibTSforge.SPP throw new FileNotFoundException("Failed to autodetect key type, specify physical store key with /prod or /test arguments."); } - public static string GetPSPath(PSVersion version) + private static string GetPSPath(PSVersion version) { switch (version) { @@ -328,7 +328,7 @@ namespace LibTSforge.SPP RestartSPP(version); - Logger.WriteLine("Loaded store file succesfully."); + Logger.WriteLine("Loaded store file successfully."); } } } diff --git a/LibTSforge/SPP/SPSys.cs b/LibTSforge/SPP/SPSys.cs index 18b3655..ecc331c 100644 --- a/LibTSforge/SPP/SPSys.cs +++ b/LibTSforge/SPP/SPSys.cs @@ -15,7 +15,7 @@ namespace LibTSforge.SPP [return: MarshalAs(UnmanagedType.Bool)] [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] - public static extern bool DeviceIoControl([In] SafeFileHandle hDevice, [In] uint dwIoControlCode, [In] IntPtr lpInBuffer, [In] int nInBufferSize, [Out] IntPtr lpOutBuffer, [In] int nOutBufferSize, out int lpBytesReturned, [In] IntPtr lpOverlapped); + private static extern bool DeviceIoControl([In] SafeFileHandle hDevice, [In] uint dwIoControlCode, [In] IntPtr lpInBuffer, [In] int nInBufferSize, [Out] IntPtr lpOutBuffer, [In] int nOutBufferSize, out int lpBytesReturned, [In] IntPtr lpOverlapped); public static bool IsSpSysRunning() { diff --git a/LibTSforge/TokenStore/Common.cs b/LibTSforge/TokenStore/Common.cs index 1dda7e7..d7133f2 100644 --- a/LibTSforge/TokenStore/Common.cs +++ b/LibTSforge/TokenStore/Common.cs @@ -14,7 +14,7 @@ namespace LibTSforge.TokenStore public class TokenMeta { public string Name; - public Dictionary Data = new Dictionary(); + public readonly Dictionary Data = new Dictionary(); public byte[] Serialize() { @@ -37,7 +37,7 @@ namespace LibTSforge.TokenStore return writer.GetBytes(); } - public void Deserialize(byte[] data) + private void Deserialize(byte[] data) { BinaryReader reader = new BinaryReader(new MemoryStream(data)); reader.ReadInt32(); diff --git a/LibTSforge/TokenStore/TokenStoreModern.cs b/LibTSforge/TokenStore/TokenStoreModern.cs index ee51e7a..2c39ca8 100644 --- a/LibTSforge/TokenStore/TokenStoreModern.cs +++ b/LibTSforge/TokenStore/TokenStoreModern.cs @@ -4,7 +4,7 @@ namespace LibTSforge.TokenStore using System.Collections.Generic; using System.IO; using System.Linq; - using LibTSforge.Crypto; + using Crypto; public class TokenStoreModern : ITokenStore { @@ -18,7 +18,7 @@ namespace LibTSforge.TokenStore private static readonly byte[] CONTS_FOOTER = Enumerable.Repeat((byte)0xAA, 0x20).ToArray(); private List Entries = new List(); - public FileStream TokensFile; + private readonly FileStream TokensFile; public void Deserialize() { @@ -40,7 +40,7 @@ namespace LibTSforge.TokenStore uint contentOffset = reader.ReadUInt32(); uint contentLength = reader.ReadUInt32(); uint allocLength = reader.ReadUInt32(); - byte[] contentData = new byte[] { }; + byte[] contentData = { }; if (populated) { @@ -140,11 +140,10 @@ namespace LibTSforge.TokenStore writer.WritePadding(BLOCK_PAD_SIZE); writer.BaseStream.Seek(curBlockOffset, SeekOrigin.Begin); - byte[] blockHash; byte[] blockData = new byte[BLOCK_SIZE - 0x20]; + byte[] blockHash = CryptoUtils.SHA256Hash(blockData); tokens.Read(blockData, 0, BLOCK_SIZE - 0x20); - blockHash = CryptoUtils.SHA256Hash(blockData); writer.BaseStream.Seek(curBlockOffset + BLOCK_SIZE - 0x20, SeekOrigin.Begin); writer.Write(blockHash); @@ -275,11 +274,6 @@ namespace LibTSforge.TokenStore Deserialize(); } - public TokenStoreModern() - { - - } - public void Dispose() { Serialize(); diff --git a/TSforgeCLI/Program.cs b/TSforgeCLI/Program.cs index 7c1a50b..d7073fe 100644 --- a/TSforgeCLI/Program.cs +++ b/TSforgeCLI/Program.cs @@ -10,30 +10,30 @@ namespace TSforgeCLI { private class Options { - public bool Dump = false; + public bool Dump; public string DumpFilePath = "dump.dat"; - public string EncrFilePath = null; - public bool Load = false; + public string EncrFilePath; + public bool Load; 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 SetIIDParams = false; - public bool? Production = null; - public PSVersion? Version = null; + public bool KMS4k; + public bool AVMA4k; + public bool ZCID; + public bool TimerReset; + public bool RearmReset; + public bool DeleteUniqueId; + public bool InstallGenPKey; + public bool KMSHostCharge; + public bool TamperedFlagsDelete; + public bool KeyChangeLockDelete; + public bool SetIIDParams; + public bool? Production; + public PSVersion? Version; public Guid ActivationId = Guid.Empty; - public bool ShowHelp = false; - public PKeyAlgorithm? Algorithm = null; - public int Group = 0; - public int Serial = 0; - public ulong Security = 0; + public bool ShowHelp; + public PKeyAlgorithm? Algorithm; + public int Group; + public int Serial; + public ulong Security; } public static void Main(string[] args) -- cgit v1.2.3 From cb5c97d443982e547a8dd5a76032de8fa6859b61 Mon Sep 17 00:00:00 2001 From: Wither OrNot Date: Mon, 7 Apr 2025 19:23:07 -0400 Subject: update usage, readme --- README.md | 4 ++-- TSforgeCLI/Program.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'TSforgeCLI/Program.cs') diff --git a/README.md b/README.md index 411e464..4580f0c 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Included methods and tools: ## Usage ``` -Usage: TSforge [/dump ()] [/load ] [/kms4k] [/avma4k] [/zcid] [/rtmr] [/duid] [/igpk] [/kmsc] [/ctpr] [/revl] [/prod] [/test] [] [/ver ] +Usage: TSforge [/dump ()] [/load ] [/kms4k] [/avma4k] [/zcid] [/rtmr] [/duid] [/igpk] [/kmsc] [/ctpr] [/revl] [/siid <5/9> ] [/prod] [/test] [] [/ver ] Options: /dump () Dump and decrypt the physical store to the specified path. /load Load and re-encrypt the physical store from the specified path. @@ -95,7 +95,7 @@ The following options are NOT implemented: - `/siid` - IID is also derived directly from the key string - `/revl` - Eval key lock is not present on Vista - Effectively, this means that a product key must be provided to activate a given SKU. Additionally, ZeroCID on Vista/Server 2008 lacks protection against WGA. + Effectively, this means that a product key must be provided to activate a given SKU. Additionally, ZeroCID on Vista/Server 2008 lacks protection against deactivation due to the WGA update KB929391, though this update is no longer offered via Windows Update. ### How do I prevent de-activation due to WAT on Windows 7? diff --git a/TSforgeCLI/Program.cs b/TSforgeCLI/Program.cs index 7c1a50b..25e132f 100644 --- a/TSforgeCLI/Program.cs +++ b/TSforgeCLI/Program.cs @@ -249,7 +249,7 @@ namespace TSforgeCLI private static void DisplayUsage() { string exeName = typeof(Program).Namespace; - Logger.WriteLine("Usage: " + exeName + " [/dump ()] [/load ] [/kms4k] [/avma4k] [/zcid] [/rtmr] [/duid] [/igpk] [/kmsc] [/ctpr] [/revl] [/prod] [/test] [] [/ver ]"); + Logger.WriteLine("Usage: " + exeName + " [/dump ()] [/load ] [/kms4k] [/avma4k] [/zcid] [/rtmr] [/duid] [/igpk] [/kmsc] [/ctpr] [/revl] [/siid <5/9> ] [/prod] [/test] [] [/ver ]"); Logger.WriteLine("Options:"); Logger.WriteLine("\t/dump () Dump and decrypt the physical store to the specified path."); Logger.WriteLine("\t/load Load and re-encrypt the physical store from the specified path."); -- cgit v1.2.3