summaryrefslogtreecommitdiff
path: root/LibTSforge/Modifiers
diff options
context:
space:
mode:
authorWitherOrNot2025-04-24 16:13:10 +0000
committerGitHub2025-04-24 16:13:10 +0000
commitf81edcb3171d1f80da1c67abdf7193d871b18378 (patch)
tree993d3ea250c9d264c61252dd388fee5e5447e218 /LibTSforge/Modifiers
parent8aa1f9078d786a7b20d2b92bbeefdd77a93dd828 (diff)
parent912f83c11b75c93f38b7966d7b727144eee7f23d (diff)
downloadTSforge-f81edcb3171d1f80da1c67abdf7193d871b18378.zip
Merge pull request #5 from massgravel/longhorn1.1.0
Longhorn
Diffstat (limited to 'LibTSforge/Modifiers')
-rw-r--r--LibTSforge/Modifiers/GenPKeyInstall.cs41
-rw-r--r--LibTSforge/Modifiers/GracePeriodReset.cs9
-rw-r--r--LibTSforge/Modifiers/KMSHostCharge.cs153
-rw-r--r--LibTSforge/Modifiers/KeyChangeLockDelete.cs12
-rw-r--r--LibTSforge/Modifiers/RearmReset.cs20
-rw-r--r--LibTSforge/Modifiers/SetIIDParams.cs66
-rw-r--r--LibTSforge/Modifiers/TamperedFlagsDelete.cs25
-rw-r--r--LibTSforge/Modifiers/UniqueIdDelete.cs13
8 files changed, 231 insertions, 108 deletions
diff --git a/LibTSforge/Modifiers/GenPKeyInstall.cs b/LibTSforge/Modifiers/GenPKeyInstall.cs
index 28d0027..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
{
@@ -31,6 +31,7 @@ namespace LibTSforge.Modifiers
public static void InstallGenPKey(PSVersion version, bool production, Guid actId)
{
+ if (version == PSVersion.Vista) throw new NotSupportedException("This feature is not supported on Windows Vista/Server 2008.");
if (actId == Guid.Empty) throw new ArgumentException("Activation ID must be specified for generated product key install.");
PKeyConfig pkc = new PKeyConfig();
@@ -57,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)
{
@@ -72,57 +73,57 @@ 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();
- pkb.Blocks.AddRange(new CRCBlock[]
+ VariableBag pkb = new VariableBag(version);
+ pkb.Blocks.AddRange(new[]
{
- new CRCBlock
+ new CRCBlockModern
{
DataType = CRCBlockType.STRING,
KeyAsStr = "SppPkeyBindingProductKey",
ValueAsStr = pkey.ToString()
},
- new CRCBlock
+ new CRCBlockModern
{
DataType = CRCBlockType.STRING,
KeyAsStr = "SppPkeyBindingMPC",
ValueAsStr = pkey.GetMPC()
},
- new CRCBlock {
+ new CRCBlockModern {
DataType = CRCBlockType.BINARY,
KeyAsStr = "SppPkeyBindingPid2",
ValueAsStr = pkey.GetPid2()
},
- new CRCBlock
+ new CRCBlockModern
{
DataType = CRCBlockType.BINARY,
KeyAsStr = "SppPkeyBindingPid3",
Value = pkey.GetPid3()
},
- new CRCBlock
+ new CRCBlockModern
{
DataType = CRCBlockType.BINARY,
KeyAsStr = "SppPkeyBindingPid4",
Value = pkey.GetPid4()
},
- new CRCBlock
+ new CRCBlockModern
{
DataType = CRCBlockType.STRING,
KeyAsStr = "SppPkeyChannelId",
ValueAsStr = pkey.Channel
},
- new CRCBlock
+ new CRCBlockModern
{
DataType = CRCBlockType.STRING,
KeyAsStr = "SppPkeyBindingEditionId",
ValueAsStr = pkey.Edition
},
- new CRCBlock
+ new CRCBlockModern
{
DataType = CRCBlockType.BINARY,
KeyAsStr = (version == PSVersion.Win7) ? "SppPkeyShortAuthenticator" : "SppPkeyPhoneActivationData",
Value = pkey.GetPhoneData(version)
},
- new CRCBlock
+ new CRCBlockModern
{
DataType = CRCBlockType.BINARY,
KeyAsStr = "SppPkeyBindingMiscData",
@@ -140,11 +141,11 @@ namespace LibTSforge.Modifiers
SLApi.UninstallAllProductKeys(appId);
}
- Utils.KillSPP();
+ SPPUtils.KillSPP(version);
- using (IPhysicalStore ps = Utils.GetStore(version, production))
+ using (IPhysicalStore ps = SPPUtils.GetStore(version, production))
{
- using (ITokenStore tks = Utils.GetTokenStore(version))
+ using (ITokenStore tks = SPPUtils.GetTokenStore(version))
{
Logger.WriteLine("Writing to physical store and token store...");
@@ -168,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)
@@ -195,7 +196,7 @@ namespace LibTSforge.Modifiers
Data = pkb.Serialize()
});
- string cachePath = Utils.GetTokensPath(version).Replace("tokens.dat", @"cache\cache.dat");
+ string cachePath = SPPUtils.GetTokensPath(version).Replace("tokens.dat", @"cache\cache.dat");
if (File.Exists(cachePath)) File.Delete(cachePath);
}
}
diff --git a/LibTSforge/Modifiers/GracePeriodReset.cs b/LibTSforge/Modifiers/GracePeriodReset.cs
index 4743ea6..3d0f6a3 100644
--- a/LibTSforge/Modifiers/GracePeriodReset.cs
+++ b/LibTSforge/Modifiers/GracePeriodReset.cs
@@ -1,18 +1,18 @@
namespace LibTSforge.Modifiers
{
- using System;
using System.Collections.Generic;
using System.Linq;
- using LibTSforge.PhysicalStore;
+ using PhysicalStore;
+ using SPP;
public static class GracePeriodReset
{
public static void Reset(PSVersion version, bool production)
{
- Utils.KillSPP();
+ SPPUtils.KillSPP(version);
Logger.WriteLine("Writing TrustedStore data...");
- using (IPhysicalStore store = Utils.GetStore(version, production))
+ using (IPhysicalStore store = SPPUtils.GetStore(version, production))
{
string value = "msft:sl/timer";
List<PSBlock> blocks = store.FindBlocks(value).ToList();
@@ -23,6 +23,7 @@ namespace LibTSforge.Modifiers
}
}
+ SPPUtils.RestartSPP(version);
Logger.WriteLine("Successfully reset all grace and evaluation period timers.");
}
}
diff --git a/LibTSforge/Modifiers/KMSHostCharge.cs b/LibTSforge/Modifiers/KMSHostCharge.cs
index 5bfabdf..153c700 100644
--- a/LibTSforge/Modifiers/KMSHostCharge.cs
+++ b/LibTSforge/Modifiers/KMSHostCharge.cs
@@ -2,12 +2,12 @@ namespace LibTSforge.Modifiers
{
using System;
using System.IO;
- using LibTSforge.PhysicalStore;
- using LibTSforge.SPP;
+ using PhysicalStore;
+ using SPP;
public static class KMSHostCharge
{
- public static void Charge(PSVersion version, Guid actId, bool production)
+ public static void Charge(PSVersion version, bool production, Guid actId)
{
if (actId == Guid.Empty)
{
@@ -31,76 +31,113 @@ namespace LibTSforge.Modifiers
string key = string.Format("SPPSVC\\{0}", appId);
long ldapTimestamp = DateTime.Now.ToFileTime();
+ byte[] cmidGuids = { };
+ byte[] reqCounts = { };
+ byte[] kmsChargeData = { };
+
BinaryWriter writer = new BinaryWriter(new MemoryStream());
- for (int i = 0; i < currClients; i++)
+ if (version == PSVersion.Vista)
{
- writer.Write(ldapTimestamp - (10 * (i + 1)));
- writer.Write(Guid.NewGuid().ToByteArray());
- }
+ writer.Write(new byte[44]);
+ writer.Seek(0, SeekOrigin.Begin);
+
+ writer.Write(totalClients);
+ writer.Write(43200);
+ writer.Write(32);
+
+ writer.Seek(20, SeekOrigin.Begin);
+ writer.Write((byte)currClients);
+
+ writer.Seek(32, SeekOrigin.Begin);
+ writer.Write((byte)currClients);
+
+ writer.Seek(0, SeekOrigin.End);
- byte[] cmidGuids = writer.GetBytes();
+ for (int i = 0; i < currClients; i++)
+ {
+ writer.Write(Guid.NewGuid().ToByteArray());
+ writer.Write(ldapTimestamp - (10 * (i + 1)));
+ }
+
+ kmsChargeData = writer.GetBytes();
+ }
+ else
+ {
+ for (int i = 0; i < currClients; i++)
+ {
+ writer.Write(ldapTimestamp - (10 * (i + 1)));
+ writer.Write(Guid.NewGuid().ToByteArray());
+ }
- writer = new BinaryWriter(new MemoryStream());
+ cmidGuids = writer.GetBytes();
- writer.Write(new byte[40]);
+ writer = new BinaryWriter(new MemoryStream());
- writer.Seek(4, SeekOrigin.Begin);
- writer.Write((byte)currClients);
+ writer.Write(new byte[40]);
- writer.Seek(24, SeekOrigin.Begin);
- writer.Write((byte)currClients);
- byte[] reqCounts = writer.GetBytes();
+ writer.Seek(4, SeekOrigin.Begin);
+ writer.Write((byte)currClients);
- Utils.KillSPP();
+ writer.Seek(24, SeekOrigin.Begin);
+ writer.Write((byte)currClients);
+
+ reqCounts = writer.GetBytes();
+ }
+
+ SPPUtils.KillSPP(version);
Logger.WriteLine("Writing TrustedStore data...");
- using (IPhysicalStore store = Utils.GetStore(version, production))
+ using (IPhysicalStore store = SPPUtils.GetStore(version, production))
{
- VariableBag kmsCountData = new VariableBag();
- kmsCountData.Blocks.AddRange(new CRCBlock[]
+ if (version != PSVersion.Vista)
{
- new CRCBlock
- {
- DataType = CRCBlockType.BINARY,
- KeyAsStr = "SppBindingLicenseData",
- Value = hwidBlock
- },
- new CRCBlock
- {
- DataType = CRCBlockType.UINT,
- Key = new byte[] { },
- ValueAsInt = (uint)totalClients
- },
- new CRCBlock
- {
- DataType = CRCBlockType.UINT,
- Key = new byte[] { },
- ValueAsInt = 1051200000
- },
- new CRCBlock
+ VariableBag kmsCountData = new VariableBag(version);
+ kmsCountData.Blocks.AddRange(new[]
{
- DataType = CRCBlockType.UINT,
- Key = new byte[] { },
- ValueAsInt = (uint)currClients
- },
- new CRCBlock
- {
- DataType = CRCBlockType.BINARY,
- Key = new byte[] { },
- Value = cmidGuids
- },
- new CRCBlock
- {
- DataType = CRCBlockType.BINARY,
- Key = new byte[] { },
- Value = reqCounts
- }
- });
+ new CRCBlockModern
+ {
+ DataType = CRCBlockType.BINARY,
+ KeyAsStr = "SppBindingLicenseData",
+ Value = hwidBlock
+ },
+ new CRCBlockModern
+ {
+ DataType = CRCBlockType.UINT,
+ Key = new byte[] { },
+ ValueAsInt = (uint)totalClients
+ },
+ new CRCBlockModern
+ {
+ DataType = CRCBlockType.UINT,
+ Key = new byte[] { },
+ ValueAsInt = 1051200000
+ },
+ new CRCBlockModern
+ {
+ DataType = CRCBlockType.UINT,
+ Key = new byte[] { },
+ ValueAsInt = (uint)currClients
+ },
+ new CRCBlockModern
+ {
+ DataType = CRCBlockType.BINARY,
+ Key = new byte[] { },
+ Value = cmidGuids
+ },
+ new CRCBlockModern
+ {
+ DataType = CRCBlockType.BINARY,
+ Key = new byte[] { },
+ Value = reqCounts
+ }
+ });
+
+ kmsChargeData = kmsCountData.Serialize();
+ }
- byte[] kmsChargeData = kmsCountData.Serialize();
- string countVal = string.Format("msft:spp/kms/host/2.0/store/counters/{0}", appId);
+ string countVal = version == PSVersion.Vista ? "C8F6FFF1-79CE-404C-B150-F97991273DF1" : string.Format("msft:spp/kms/host/2.0/store/counters/{0}", appId);
store.DeleteBlock(key, countVal);
store.AddBlock(new PSBlock
@@ -114,6 +151,8 @@ namespace LibTSforge.Modifiers
Logger.WriteLine(string.Format("Set charge count to {0} successfully.", currClients));
}
+
+ SPPUtils.RestartSPP(version);
}
}
}
diff --git a/LibTSforge/Modifiers/KeyChangeLockDelete.cs b/LibTSforge/Modifiers/KeyChangeLockDelete.cs
index e3f32c4..f6ec3de 100644
--- a/LibTSforge/Modifiers/KeyChangeLockDelete.cs
+++ b/LibTSforge/Modifiers/KeyChangeLockDelete.cs
@@ -2,15 +2,19 @@ namespace LibTSforge.Modifiers
{
using System.Collections.Generic;
using System.Linq;
- using LibTSforge.PhysicalStore;
- using LibTSforge;
+ using PhysicalStore;
+ using SPP;
+ using System;
+
public static class KeyChangeLockDelete
{
public static void Delete(PSVersion version, bool production)
{
- Utils.KillSPP();
+ if (version == PSVersion.Vista) throw new NotSupportedException("This feature is not supported on Windows Vista/Server 2008.");
+
+ SPPUtils.KillSPP(version);
Logger.WriteLine("Writing TrustedStore data...");
- using (IPhysicalStore store = Utils.GetStore(version, production))
+ using (IPhysicalStore store = SPPUtils.GetStore(version, production))
{
List<string> values = new List<string>
{
diff --git a/LibTSforge/Modifiers/RearmReset.cs b/LibTSforge/Modifiers/RearmReset.cs
index be2b174..e909316 100644
--- a/LibTSforge/Modifiers/RearmReset.cs
+++ b/LibTSforge/Modifiers/RearmReset.cs
@@ -1,23 +1,27 @@
namespace LibTSforge.Modifiers
{
- using System;
using System.Collections.Generic;
using System.Linq;
- using LibTSforge.PhysicalStore;
+ using PhysicalStore;
+ using SPP;
public static class RearmReset
{
public static void Reset(PSVersion version, bool production)
{
- Utils.KillSPP();
+ SPPUtils.KillSPP(version);
Logger.WriteLine("Writing TrustedStore data...");
- using (IPhysicalStore store = Utils.GetStore(version, production))
+ using (IPhysicalStore store = SPPUtils.GetStore(version, production))
{
List<PSBlock> blocks;
- if (version == PSVersion.Win7)
+ if (version == PSVersion.Vista)
+ {
+ blocks = store.FindBlocks("740D70D8-6448-4b2f-9063-4A7A463600C5").ToList();
+ }
+ else if (version == PSVersion.Win7)
{
blocks = store.FindBlocks(0xA0000).ToList();
}
@@ -28,7 +32,11 @@ namespace LibTSforge.Modifiers
foreach (PSBlock block in blocks)
{
- if (version == PSVersion.Win7)
+ if (version == PSVersion.Vista)
+ {
+ store.DeleteBlock(block.KeyAsStr, block.ValueAsStr);
+ }
+ else if (version == PSVersion.Win7)
{
store.SetBlock(block.KeyAsStr, block.ValueAsInt, new byte[8]);
}
diff --git a/LibTSforge/Modifiers/SetIIDParams.cs b/LibTSforge/Modifiers/SetIIDParams.cs
new file mode 100644
index 0000000..3d54b9d
--- /dev/null
+++ b/LibTSforge/Modifiers/SetIIDParams.cs
@@ -0,0 +1,66 @@
+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)
+ {
+ 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/Modifiers/TamperedFlagsDelete.cs b/LibTSforge/Modifiers/TamperedFlagsDelete.cs
index 8ffb370..a9edc55 100644
--- a/LibTSforge/Modifiers/TamperedFlagsDelete.cs
+++ b/LibTSforge/Modifiers/TamperedFlagsDelete.cs
@@ -1,34 +1,37 @@
namespace LibTSforge.Modifiers
{
- using System;
using System.Linq;
- using LibTSforge.PhysicalStore;
+ using PhysicalStore;
+ using SPP;
public static class TamperedFlagsDelete
{
public static void DeleteTamperFlags(PSVersion version, bool production)
{
- Utils.KillSPP();
+ SPPUtils.KillSPP(version);
Logger.WriteLine("Writing TrustedStore data...");
- using (IPhysicalStore store = Utils.GetStore(version, production))
+ using (IPhysicalStore store = SPPUtils.GetStore(version, production))
{
- if (version != PSVersion.Win7)
+ if (version == PSVersion.Vista)
{
- string recreatedFlag = "__##USERSEP-RESERVED##__$$RECREATED-FLAG$$";
- string recoveredFlag = "__##USERSEP-RESERVED##__$$RECOVERED-FLAG$$";
-
- DeleteFlag(store, recreatedFlag);
- DeleteFlag(store, recoveredFlag);
+ DeleteFlag(store, "6BE8425B-E3CF-4e86-A6AF-5863E3DCB606");
}
- else
+ else if (version == PSVersion.Win7)
{
SetFlag(store, 0xA0001);
}
+ else
+ {
+ DeleteFlag(store, "__##USERSEP-RESERVED##__$$RECREATED-FLAG$$");
+ DeleteFlag(store, "__##USERSEP-RESERVED##__$$RECOVERED-FLAG$$");
+ }
Logger.WriteLine("Successfully cleared the tamper state.");
}
+
+ SPPUtils.RestartSPP(version);
}
private static void DeleteFlag(IPhysicalStore store, string flag)
diff --git a/LibTSforge/Modifiers/UniqueIdDelete.cs b/LibTSforge/Modifiers/UniqueIdDelete.cs
index b83d328..b66954a 100644
--- a/LibTSforge/Modifiers/UniqueIdDelete.cs
+++ b/LibTSforge/Modifiers/UniqueIdDelete.cs
@@ -1,13 +1,15 @@
namespace LibTSforge.Modifiers
{
using System;
- using LibTSforge.PhysicalStore;
- using LibTSforge.SPP;
+ using PhysicalStore;
+ using SPP;
public static class UniqueIdDelete
{
public static void DeleteUniqueId(PSVersion version, bool production, Guid actId)
{
+ if (version == PSVersion.Vista) throw new NotSupportedException("This feature is not supported on Windows Vista/Server 2008.");
+
Guid appId;
if (actId == Guid.Empty)
@@ -25,14 +27,13 @@ namespace LibTSforge.Modifiers
appId = SLApi.GetAppId(actId);
}
- string instId = SLApi.GetInstallationID(actId);
Guid pkeyId = SLApi.GetInstalledPkeyID(actId);
- Utils.KillSPP();
+ SPPUtils.KillSPP(version);
Logger.WriteLine("Writing TrustedStore data...");
- using (IPhysicalStore store = Utils.GetStore(version, production))
+ using (IPhysicalStore store = SPPUtils.GetStore(version, production))
{
string key = string.Format("SPPSVC\\{0}\\{1}", appId, actId);
PSBlock keyBlock = store.GetBlock(key, pkeyId.ToString());
@@ -42,7 +43,7 @@ namespace LibTSforge.Modifiers
throw new Exception("No product key found.");
}
- VariableBag pkb = new VariableBag(keyBlock.Data);
+ VariableBag pkb = new VariableBag(keyBlock.Data, version);
pkb.DeleteBlock("SppPkeyUniqueIdToken");