summaryrefslogtreecommitdiff
path: root/LibTSforge/Activators
diff options
context:
space:
mode:
authorWitherOrNot2025-04-24 16:13:10 +0000
committerGitHub2025-04-24 16:13:10 +0000
commitf81edcb3171d1f80da1c67abdf7193d871b18378 (patch)
tree993d3ea250c9d264c61252dd388fee5e5447e218 /LibTSforge/Activators
parent8aa1f9078d786a7b20d2b92bbeefdd77a93dd828 (diff)
parent912f83c11b75c93f38b7966d7b727144eee7f23d (diff)
downloadTSforge-f81edcb3171d1f80da1c67abdf7193d871b18378.zip
Merge pull request #5 from massgravel/longhorn1.1.0
Longhorn
Diffstat (limited to 'LibTSforge/Activators')
-rw-r--r--LibTSforge/Activators/AVMA4K.cs37
-rw-r--r--LibTSforge/Activators/KMS4K.cs145
-rw-r--r--LibTSforge/Activators/ZeroCID.cs75
3 files changed, 168 insertions, 89 deletions
diff --git a/LibTSforge/Activators/AVMA4K.cs b/LibTSforge/Activators/AVMA4K.cs
index 5ac2838..236b727 100644
--- a/LibTSforge/Activators/AVMA4K.cs
+++ b/LibTSforge/Activators/AVMA4K.cs
@@ -1,14 +1,14 @@
namespace LibTSforge.Activators
{
using System;
- using LibTSforge.PhysicalStore;
- using LibTSforge.SPP;
+ using PhysicalStore;
+ using SPP;
public static class AVMA4k
{
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.");
}
@@ -34,46 +34,41 @@ namespace LibTSforge.Activators
throw new NotSupportedException("Non-VT:IA product key installed.");
}
- 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);
- 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;
- expiry /= 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 / 10000;
- VariableBag avmaBinding = new VariableBag();
+ VariableBag avmaBinding = new VariableBag(version);
- avmaBinding.Blocks.AddRange(new CRCBlock[]
+ avmaBinding.Blocks.AddRange(new[]
{
- new CRCBlock
+ new CRCBlockModern
{
DataType = CRCBlockType.BINARY,
Key = new byte[] { },
Value = BitConverter.GetBytes(crcBindTime),
},
- new CRCBlock
+ new CRCBlockModern
{
DataType = CRCBlockType.STRING,
Key = new byte[] { },
ValueAsStr = "AVMA4K",
},
- new CRCBlock
+ new CRCBlockModern
{
DataType = CRCBlockType.STRING,
Key = new byte[] { },
@@ -97,7 +92,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 fd09bd3..6287c39 100644
--- a/LibTSforge/Activators/KMS4K.cs
+++ b/LibTSforge/Activators/KMS4K.cs
@@ -1,8 +1,9 @@
namespace LibTSforge.Activators
{
using System;
- using LibTSforge.PhysicalStore;
- using LibTSforge.SPP;
+ using System.IO;
+ using PhysicalStore;
+ using SPP;
public class KMS4k
{
@@ -29,11 +30,11 @@ namespace LibTSforge.Activators
throw new NotSupportedException("Non-Volume:GVLK product key installed.");
}
- 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);
@@ -42,7 +43,7 @@ namespace LibTSforge.Activators
ulong time2 = (ulong)DateTime.UtcNow.ToFileTime();
ulong expiry = Constants.TimerMax;
- if (version == PSVersion.Win7)
+ if (version == PSVersion.Vista || version == PSVersion.Win7)
{
unknown = 0x800000000;
time1 = 0;
@@ -58,86 +59,127 @@ namespace LibTSforge.Activators
expiry /= 10000;
}
- byte[] hwidBlock = Constants.UniversalHWIDBlock;
- byte[] kmsResp;
-
- switch (version)
+ if (version == PSVersion.Vista)
{
- case PSVersion.Win7:
- kmsResp = Constants.KMSv4Response;
- break;
- case PSVersion.Win8:
- kmsResp = Constants.KMSv5Response;
- break;
- case PSVersion.WinBlue:
- case PSVersion.WinModern:
- kmsResp = Constants.KMSv6Response;
- break;
- default:
- throw new NotSupportedException("Unsupported PSVersion.");
- }
+ VistaTimer vistaTimer = new VistaTimer
+ {
+ Time = time2,
+ Expiry = Constants.TimerMax
+ };
+
+ string vistaTimerName = string.Format("msft:sl/timer/VLExpiration/VOLUME/{0}/{1}", appId, actId);
- VariableBag kmsBinding = new VariableBag();
+ store.DeleteBlock(key, vistaTimerName);
+ store.DeleteBlock(key, actId.ToString());
- kmsBinding.Blocks.AddRange(new CRCBlock[]
+ BinaryWriter writer = new BinaryWriter(new MemoryStream());
+ writer.Write(Constants.KMSv4Response.Length);
+ writer.Write(Constants.KMSv4Response);
+ writer.Write(Constants.UniversalHWIDBlock);
+ byte[] kmsData = writer.GetBytes();
+
+ store.AddBlocks(new[]
+ {
+ new PSBlock
+ {
+ Type = BlockType.TIMER,
+ Flags = 0,
+ KeyAsStr = key,
+ ValueAsStr = vistaTimerName,
+ Data = vistaTimer.CastToArray()
+ },
+ new PSBlock
+ {
+ Type = BlockType.NAMED,
+ Flags = 0,
+ KeyAsStr = key,
+ ValueAsStr = actId.ToString(),
+ Data = kmsData
+ }
+ });
+ }
+ else
{
- new CRCBlock
+ byte[] hwidBlock = Constants.UniversalHWIDBlock;
+ byte[] kmsResp;
+
+ switch (version)
+ {
+ case PSVersion.Win7:
+ kmsResp = Constants.KMSv4Response;
+ break;
+ case PSVersion.Win8:
+ kmsResp = Constants.KMSv5Response;
+ break;
+ case PSVersion.WinBlue:
+ case PSVersion.WinModern:
+ kmsResp = Constants.KMSv6Response;
+ break;
+ default:
+ throw new NotSupportedException("Unsupported PSVersion.");
+ }
+
+ VariableBag kmsBinding = new VariableBag(version);
+
+ kmsBinding.Blocks.AddRange(new[]
+ {
+ new CRCBlockModern
{
DataType = CRCBlockType.BINARY,
Key = new byte[] { },
Value = kmsResp
},
- new CRCBlock
+ new CRCBlockModern
{
DataType = CRCBlockType.STRING,
Key = new byte[] { },
ValueAsStr = "msft:rm/algorithm/hwid/4.0"
},
- new CRCBlock
+ new CRCBlockModern
{
DataType = CRCBlockType.BINARY,
KeyAsStr = "SppBindingLicenseData",
Value = hwidBlock
}
- });
+ });
- if (version == PSVersion.WinModern)
- {
- kmsBinding.Blocks.AddRange(new CRCBlock[]
+ if (version == PSVersion.WinModern)
{
- new CRCBlock
+ kmsBinding.Blocks.AddRange(new[]
+ {
+ new CRCBlockModern
{
DataType = CRCBlockType.STRING,
Key = new byte[] { },
ValueAsStr = "massgrave.dev"
},
- new CRCBlock
+ new CRCBlockModern
{
DataType = CRCBlockType.STRING,
Key = new byte[] { },
ValueAsStr = "6969"
}
- });
- }
+ });
+ }
- byte[] kmsBindingData = kmsBinding.Serialize();
+ byte[] kmsBindingData = kmsBinding.Serialize();
- Timer kmsTimer = new Timer
- {
- Unknown = unknown,
- Time1 = time1,
- Time2 = time2,
- Expiry = expiry
- };
+ Timer kmsTimer = new Timer
+ {
+ Unknown = unknown,
+ Time1 = time1,
+ Time2 = time2,
+ Expiry = expiry
+ };
- string storeVal = string.Format("msft:spp/kms/bind/2.0/store/{0}/{1}", appId, actId);
- string timerVal = string.Format("msft:spp/kms/bind/2.0/timer/{0}/{1}", appId, actId);
+ string storeVal = string.Format("msft:spp/kms/bind/2.0/store/{0}/{1}", appId, actId);
+ string timerVal = string.Format("msft:spp/kms/bind/2.0/timer/{0}/{1}", appId, actId);
- store.DeleteBlock(key, storeVal);
- store.DeleteBlock(key, timerVal);
+ store.DeleteBlock(key, storeVal);
+ store.DeleteBlock(key, timerVal);
- store.AddBlocks(new PSBlock[]
- {
+ store.AddBlocks(new[]
+ {
new PSBlock
{
Type = BlockType.NAMED,
@@ -154,10 +196,11 @@ namespace LibTSforge.Activators
ValueAsStr = timerVal,
Data = kmsTimer.CastToArray()
}
- });
+ });
+ }
}
- SLApi.RefreshLicenseStatus();
+ SPPUtils.RestartSPP(version);
SLApi.FireStateChangedEvent(appId);
Logger.WriteLine("Activated using KMS4k successfully.");
}
diff --git a/LibTSforge/Activators/ZeroCID.cs b/LibTSforge/Activators/ZeroCID.cs
index 99cedee..147dceb 100644
--- a/LibTSforge/Activators/ZeroCID.cs
+++ b/LibTSforge/Activators/ZeroCID.cs
@@ -2,13 +2,14 @@ namespace LibTSforge.Activators
{
using System;
using System.IO;
- using LibTSforge.Crypto;
- using LibTSforge.PhysicalStore;
- using LibTSforge.SPP;
+ using System.Linq;
+ 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));
@@ -46,16 +47,16 @@ namespace LibTSforge.Activators
string instId = SLApi.GetInstallationID(actId);
Guid pkeyId = SLApi.GetInstalledPkeyID(actId);
- if (version == PSVersion.Win7)
+ if (version == PSVersion.Vista || version == PSVersion.Win7)
{
Deposit(actId, instId);
}
- Utils.KillSPP();
+ SPPUtils.KillSPP(version);
Logger.WriteLine("Writing TrustedStore data...");
- using (IPhysicalStore store = Utils.GetStore(version, production))
+ using (IPhysicalStore store = SPPUtils.GetStore(version, production))
{
byte[] hwidBlock = Constants.UniversalHWIDBlock;
@@ -65,7 +66,11 @@ namespace LibTSforge.Activators
byte[] iidHash;
- if (version == PSVersion.Win7)
+ if (version == PSVersion.Vista)
+ {
+ iidHash = CryptoUtils.SHA256Hash(Utils.EncodeString(instId)).Take(0x10).ToArray();
+ }
+ else if (version == PSVersion.Win7)
{
iidHash = CryptoUtils.SHA256Hash(Utils.EncodeString(instId));
}
@@ -82,11 +87,39 @@ namespace LibTSforge.Activators
throw new InvalidDataException("Failed to get product key data for activation ID " + actId + ".");
}
- VariableBag pkb = new VariableBag(keyBlock.Data);
+ VariableBag pkb = new VariableBag(keyBlock.Data, version);
byte[] pkeyData;
- if (version == PSVersion.Win7)
+ if (version == PSVersion.Vista)
+ {
+ pkeyData = pkb.GetBlock("PKeyBasicInfo").Value;
+ string uniqueId = Utils.DecodeString(pkeyData.Skip(0x120).Take(0x80).ToArray());
+ string extPid = Utils.DecodeString(pkeyData.Skip(0x1A0).Take(0x80).ToArray());
+
+ uint group;
+ uint.TryParse(extPid.Split('-')[1], out group);
+
+ if (group == 0)
+ {
+ throw new FormatException("Extended PID has invalid format.");
+ }
+
+ ulong shortauth;
+
+ try
+ {
+ shortauth = BitConverter.ToUInt64(Convert.FromBase64String(uniqueId.Split('&')[1]), 0);
+ }
+ catch
+ {
+ throw new FormatException("Key Unique ID has invalid format.");
+ }
+
+ shortauth |= (ulong)group << 41;
+ pkeyData = BitConverter.GetBytes(shortauth);
+ }
+ else if (version == PSVersion.Win7)
{
pkeyData = pkb.GetBlock("SppPkeyShortAuthenticator").Value;
}
@@ -99,26 +132,34 @@ namespace LibTSforge.Activators
store.SetBlock(key, pkeyId.ToString(), pkb.Serialize());
BinaryWriter writer = new BinaryWriter(new MemoryStream());
- writer.Write(0x20);
+ writer.Write(iidHash.Length);
writer.Write(iidHash);
writer.Write(hwidBlock.Length);
writer.Write(hwidBlock);
byte[] tsHwidData = writer.GetBytes();
writer = new BinaryWriter(new MemoryStream());
- writer.Write(0x20);
+ writer.Write(iidHash.Length);
writer.Write(iidHash);
writer.Write(pkeyData.Length);
writer.Write(pkeyData);
byte[] tsPkeyInfoData = writer.GetBytes();
- store.AddBlocks(new PSBlock[] {
+ string phoneVersion = version == PSVersion.Vista ? "6.0" : "7.0";
+ Guid indexSlid = version == PSVersion.Vista ? actId : pkeyId;
+ string hwidBlockName = string.Format("msft:Windows/{0}/Phone/Cached/HwidBlock/{1}", phoneVersion, indexSlid);
+ string pkeyInfoName = string.Format("msft:Windows/{0}/Phone/Cached/PKeyInfo/{1}", phoneVersion, indexSlid);
+
+ store.DeleteBlock(key, hwidBlockName);
+ store.DeleteBlock(key, pkeyInfoName);
+
+ store.AddBlocks(new[] {
new PSBlock
{
Type = BlockType.NAMED,
Flags = 0,
KeyAsStr = key,
- ValueAsStr = "msft:Windows/7.0/Phone/Cached/HwidBlock/" + pkeyId,
+ ValueAsStr = hwidBlockName,
Data = tsHwidData
},
new PSBlock
@@ -126,18 +167,18 @@ namespace LibTSforge.Activators
Type = BlockType.NAMED,
Flags = 0,
KeyAsStr = key,
- ValueAsStr = "msft:Windows/7.0/Phone/Cached/PKeyInfo/" + pkeyId,
+ ValueAsStr = pkeyInfoName,
Data = tsPkeyInfoData
}
});
}
- if (version != PSVersion.Win7)
+ if (version != PSVersion.Vista && version != PSVersion.Win7)
{
Deposit(actId, instId);
}
- SLApi.RefreshLicenseStatus();
+ SPPUtils.RestartSPP(version);
SLApi.FireStateChangedEvent(appId);
Logger.WriteLine("Activated using ZeroCID successfully.");
}