Minor fixups
This commit is contained in:
parent
3f1c878318
commit
0c8b1efaa9
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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,
|
||||
|
@ -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();
|
||||
|
||||
if (version != PSVersion.Vista)
|
||||
{
|
||||
if (!CryptoUtils.HMACVerify(hmacKey, psData, hmacSig))
|
||||
{
|
||||
throw new InvalidDataException("Failed to verify HMAC. Physical store is corrupt.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!CryptoUtils.SaltSHAVerify(hmacKey, psData, hmacSig))
|
||||
{
|
||||
throw new InvalidDataException("Failed to verify checksum. Physical store is corrupt.");
|
||||
}
|
||||
}
|
||||
|
||||
return psData;
|
||||
throw new Exception("Failed to decrypt physical store.");
|
||||
}
|
||||
|
||||
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 (!CryptoUtils.HMACVerify(hmacKey, psData, hmacSig))
|
||||
{
|
||||
throw new InvalidDataException("Failed to verify HMAC. Physical store is corrupt.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!CryptoUtils.SaltSHAVerify(hmacKey, psData, hmacSig))
|
||||
{
|
||||
throw new InvalidDataException("Failed to verify checksum. Physical store is corrupt.");
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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)
|
||||
|
@ -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");
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -4,9 +4,9 @@ namespace LibTSforge.PhysicalStore
|
||||
|
||||
public enum BlockType : uint
|
||||
{
|
||||
NONE,
|
||||
NONE, // unused
|
||||
NAMED,
|
||||
ATTRIBUTE,
|
||||
ATTRIBUTE, //unused
|
||||
TIMER
|
||||
}
|
||||
|
||||
|
@ -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<string, List<ModernBlock>> Data = new Dictionary<string, List<ModernBlock>>();
|
||||
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<ModernBlock> blocks = Data[key];
|
||||
|
||||
foreach (ModernBlock block in blocks)
|
||||
{
|
||||
if (block.ValueAsStr == value)
|
||||
{
|
||||
blocks.Remove(block);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Data[key] = blocks;
|
||||
return;
|
||||
}
|
||||
|
||||
List<ModernBlock> blocks = Data[key];
|
||||
|
||||
foreach (ModernBlock block in blocks)
|
||||
{
|
||||
if (block.ValueAsStr == value)
|
||||
{
|
||||
blocks.Remove(block);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Data[key] = blocks;
|
||||
}
|
||||
|
||||
public void DeleteBlock(string key, uint value)
|
||||
{
|
||||
if (Data.ContainsKey(key))
|
||||
if (!Data.ContainsKey(key))
|
||||
{
|
||||
List<ModernBlock> blocks = Data[key];
|
||||
|
||||
foreach (ModernBlock block in blocks)
|
||||
{
|
||||
if (block.ValueAsInt == value)
|
||||
{
|
||||
blocks.Remove(block);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Data[key] = blocks;
|
||||
return;
|
||||
}
|
||||
|
||||
List<ModernBlock> blocks = Data[key];
|
||||
|
||||
foreach (ModernBlock block in blocks)
|
||||
{
|
||||
if (block.ValueAsInt == value)
|
||||
{
|
||||
blocks.Remove(block);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Data[key] = blocks;
|
||||
}
|
||||
|
||||
public PhysicalStoreModern(string tsPath, bool production, PSVersion version)
|
||||
|
@ -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<VistaBlock> Blocks = new List<VistaBlock>();
|
||||
private readonly FileStream TSPrimary;
|
||||
private readonly FileStream TSSecondary;
|
||||
|
@ -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<Win7Block> Blocks = new List<Win7Block>();
|
||||
private readonly FileStream TSPrimary;
|
||||
private readonly FileStream TSSecondary;
|
||||
|
@ -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<CRCBlock> Blocks = new List<CRCBlock>();
|
||||
private readonly PSVersion Version;
|
||||
|
||||
public void Deserialize(byte[] data)
|
||||
private void Deserialize(byte[] data)
|
||||
{
|
||||
int len = data.Length;
|
||||
|
||||
|
@ -74,7 +74,7 @@ namespace LibTSforge.SPP
|
||||
|
||||
public class PKeyConfig
|
||||
{
|
||||
public Dictionary<Guid, ProductConfig> Products = new Dictionary<Guid, ProductConfig>();
|
||||
public readonly Dictionary<Guid, ProductConfig> Products = new Dictionary<Guid, ProductConfig>();
|
||||
private readonly List<Guid> loadedPkeyConfigs = new List<Guid>();
|
||||
|
||||
public void LoadConfig(Guid actId)
|
||||
@ -210,10 +210,5 @@ namespace LibTSforge.SPP
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public PKeyConfig()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
{
|
||||
|
@ -14,7 +14,7 @@ namespace LibTSforge.TokenStore
|
||||
public class TokenMeta
|
||||
{
|
||||
public string Name;
|
||||
public Dictionary<string, string> Data = new Dictionary<string, string>();
|
||||
public readonly Dictionary<string, string> Data = new Dictionary<string, string>();
|
||||
|
||||
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();
|
||||
|
@ -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<TokenEntry> Entries = new List<TokenEntry>();
|
||||
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();
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user