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)