Co-authored-by: neko <109633131+nekoppai@users.noreply.github.com> Co-authored-by: Lyssa <75037904+thecatontheceiling@users.noreply.github.com> Co-authored-by: abbodi1406 <33669284+abbodi1406@users.noreply.github.com>
120 lines
4.1 KiB
C#
120 lines
4.1 KiB
C#
namespace LibTSforge.Modifiers
|
|
{
|
|
using System;
|
|
using System.IO;
|
|
using LibTSforge.PhysicalStore;
|
|
using LibTSforge.SPP;
|
|
|
|
public static class KMSHostCharge
|
|
{
|
|
public static void Charge(PSVersion version, Guid actId, bool production)
|
|
{
|
|
if (actId == Guid.Empty)
|
|
{
|
|
actId = SLApi.GetDefaultActivationID(SLApi.WINDOWS_APP_ID, true);
|
|
|
|
if (actId == Guid.Empty)
|
|
{
|
|
throw new NotSupportedException("No applicable activation IDs found.");
|
|
}
|
|
}
|
|
|
|
if (SLApi.GetPKeyChannel(SLApi.GetInstalledPkeyID(actId)) != "Volume:CSVLK")
|
|
{
|
|
throw new NotSupportedException("Non-Volume:CSVLK product key installed.");
|
|
}
|
|
|
|
Guid appId = SLApi.GetAppId(actId);
|
|
int totalClients = 50;
|
|
int currClients = 25;
|
|
byte[] hwidBlock = Constants.UniversalHWIDBlock;
|
|
string key = string.Format("SPPSVC\\{0}", appId);
|
|
long ldapTimestamp = DateTime.Now.ToFileTime();
|
|
|
|
BinaryWriter writer = new BinaryWriter(new MemoryStream());
|
|
|
|
for (int i = 0; i < currClients; i++)
|
|
{
|
|
writer.Write(ldapTimestamp - (10 * (i + 1)));
|
|
writer.Write(Guid.NewGuid().ToByteArray());
|
|
}
|
|
|
|
byte[] cmidGuids = writer.GetBytes();
|
|
|
|
writer = new BinaryWriter(new MemoryStream());
|
|
|
|
writer.Write(new byte[40]);
|
|
|
|
writer.Seek(4, SeekOrigin.Begin);
|
|
writer.Write((byte)currClients);
|
|
|
|
writer.Seek(24, SeekOrigin.Begin);
|
|
writer.Write((byte)currClients);
|
|
byte[] reqCounts = writer.GetBytes();
|
|
|
|
Utils.KillSPP();
|
|
|
|
Logger.WriteLine("Writing TrustedStore data...");
|
|
|
|
using (IPhysicalStore store = Utils.GetStore(version, production))
|
|
{
|
|
VariableBag kmsCountData = new VariableBag();
|
|
kmsCountData.Blocks.AddRange(new CRCBlock[]
|
|
{
|
|
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
|
|
{
|
|
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
|
|
}
|
|
});
|
|
|
|
byte[] kmsChargeData = kmsCountData.Serialize();
|
|
string countVal = string.Format("msft:spp/kms/host/2.0/store/counters/{0}", appId);
|
|
|
|
store.DeleteBlock(key, countVal);
|
|
store.AddBlock(new PSBlock
|
|
{
|
|
Type = BlockType.NAMED,
|
|
Flags = (version == PSVersion.WinModern) ? (uint)0x400 : 0,
|
|
KeyAsStr = key,
|
|
ValueAsStr = countVal,
|
|
Data = kmsChargeData
|
|
});
|
|
|
|
Logger.WriteLine(string.Format("Set charge count to {0} successfully.", currClients));
|
|
}
|
|
}
|
|
}
|
|
}
|