forked from Snoooopy/MetroUnlocker
Initial commit
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.IO;
|
||||
using Microsoft.Win32;
|
||||
|
||||
|
||||
using MetroUnlocker.LibTSForge.SPP;
|
||||
using MetroUnlocker.LibTSForge.PhysicalStore;
|
||||
using MetroUnlocker.LibTSForge.Crypto;
|
||||
|
||||
namespace MetroUnlocker
|
||||
{
|
||||
|
||||
class ZeroCID
|
||||
{
|
||||
public static void Deposit(Guid actId, string instId)
|
||||
{
|
||||
uint status = SLApi.DepositConfirmationId(actId, instId, Constants.ZeroCID);
|
||||
|
||||
if (status != 0)
|
||||
throw new InvalidOperationException(string.Format("Failed to deposit fake CID. Status code: 0x{0}", status.ToString("X")));
|
||||
}
|
||||
|
||||
public static void Activate(PSVersion version, bool production, Guid actId)
|
||||
{
|
||||
Guid appId = SLApi.GetAppId(actId);
|
||||
|
||||
string instId = SLApi.GetInstallationId(actId);
|
||||
Guid pkeyId = SLApi.GetInstalledPkeyId(actId);
|
||||
|
||||
Utils.KillSPP();
|
||||
|
||||
using (PhysicalStore store = new PhysicalStore(version, production))
|
||||
{
|
||||
byte[] hwidBlock = Constants.UniversalHWIDBlock;
|
||||
|
||||
byte[] iidHash = CryptoUtils.SHA256Hash(Utils.EncodeString(instId + '\0' + Constants.ZeroCID));
|
||||
|
||||
|
||||
string key = string.Format("SPPSVC\\{0}\\{1}", appId, actId);
|
||||
ModernBlock keyBlock = store.GetBlock(key, pkeyId.ToString());
|
||||
|
||||
if (keyBlock == null)
|
||||
{
|
||||
throw new InvalidDataException("Failed to get product key data for activation ID: 0x" + actId + ".");
|
||||
}
|
||||
|
||||
VariableBag pkb = new VariableBag(keyBlock.Data);
|
||||
|
||||
byte[] pkeyData = pkb.GetBlock("SppPkeyPhoneActivationData").Value;
|
||||
|
||||
pkb.DeleteBlock("SppPkeyVirtual");
|
||||
store.SetBlock(key, pkeyId.ToString(), pkb.Serialize());
|
||||
|
||||
BinaryWriter writer = new BinaryWriter(new MemoryStream());
|
||||
writer.Write(0x20);
|
||||
writer.Write(iidHash);
|
||||
writer.Write(hwidBlock.Length);
|
||||
writer.Write(hwidBlock);
|
||||
byte[] tsHwidData = Utils.GetBytes(writer);
|
||||
|
||||
writer = new BinaryWriter(new MemoryStream());
|
||||
writer.Write(0x20);
|
||||
writer.Write(iidHash);
|
||||
writer.Write(pkeyData.Length);
|
||||
writer.Write(pkeyData);
|
||||
byte[] tsPkeyInfoData = Utils.GetBytes(writer);
|
||||
|
||||
store.AddBlocks(new ModernBlock[] {
|
||||
new ModernBlock
|
||||
{
|
||||
Type = BlockType.NAMED,
|
||||
Flags = 0,
|
||||
KeyAsStr = key,
|
||||
ValueAsStr = "msft:Windows/7.0/Phone/Cached/HwidBlock/" + pkeyId,
|
||||
Data = tsHwidData
|
||||
},
|
||||
new ModernBlock
|
||||
{
|
||||
Type = BlockType.NAMED,
|
||||
Flags = 0,
|
||||
KeyAsStr = key,
|
||||
ValueAsStr = "msft:Windows/7.0/Phone/Cached/PKeyInfo/" + pkeyId,
|
||||
Data = tsPkeyInfoData
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Deposit(actId, instId);
|
||||
|
||||
SLApi.RefreshLicenseStatus();
|
||||
SLApi.FireStateChangedEvent(appId);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user