using Microsoft.Win32;
|
using System;
|
using System.Collections.Generic;
|
using System.Diagnostics;
|
using System.IO;
|
using System.Linq;
|
using System.Management;
|
using System.Security.Cryptography;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace SmartScanner
|
{
|
class LBProtect
|
{
|
//私钥
|
private static readonly string privateKey = "<RSAKeyValue><Modulus>zM7HeOAK8nORTQ56zl4IInkg7Y5k3Zf2FtXaHwu4nSCJOdWmABnbIbTlIt9y9gmLnDHG0maUXlaxZrbUGeAScrmI6kD4qlDypf9qKO7iB5K9xf0MD7ecioeljLXJtG8ahPo6pqiyg9Sx0Czue2pg672ssPtbGL81iFrgwy+Zgok=</Modulus><Exponent>AQAB</Exponent><P>zUb5vO3p4iqncynb+WGVyO1d73M/bXrqLG7cCaZN4gk7XxeWWyfIk2flCCI2veAdp4MKpdG3j4W+Y7+8xq5fzw==</P><Q>/2oalvvC/i1YtJNGCZk4+k83asfBZZpElTp/t+U4FC8vGGKE8slfBzflSps8PTJ67/MKZ8sgD0pW9Vp2e4j2Jw==</Q><DP>sU5v4edh0C9liUyLq2DFvtKAA5Z5H7g+UnjC6DbUKLwuoxk9jqjTT7c6lYbv35uYIZtHdCirs3UjGQeBJ99v8w==</DP><DQ>taKxEhosSzHYWWI6dmz+dhOLp2YzBJw2laEqXo6l2MTNSxwUy8ukxq9bYjkPF74kayt9hN6RCA6n1Ifmpmd6FQ==</DQ><InverseQ>AxT3HFNQY9mBI/fe68ACR56ARDIUCXb62REnjbJDA0/7Ti/n5NN+yaELwVDZpw2LVlqePyYdmMJgUAJGBjHl4A==</InverseQ><D>YtiRsScAYY+hWv1YC+2aI3kuiTimOcSzwsWnpkAz87HWSRFyMq5H8nap+DC7/T8SIGptuPJFPVq9+ALZTzuz6siESv1EtND58nyrR6HnUKXlhiGuoG9vXL2rP71BnZA+H+lnIFrG48orFKP/8kA2Hy9cP9l4b1pBXEZJHQHG1hk=</D></RSAKeyValue>";
|
|
private static readonly RSACryptoServiceProvider cryptoServiceProvider = new RSACryptoServiceProvider();
|
|
// 解密
|
public static string RsaDecrypt(string textRsa)
|
{
|
cryptoServiceProvider.FromXmlString(privateKey);
|
byte[] inputBytes = Convert.FromBase64String(textRsa);
|
byte[] decryptedBytes = cryptoServiceProvider.Decrypt(inputBytes, false);
|
return Encoding.UTF8.GetString(decryptedBytes);
|
}
|
|
|
// 获取硬件指纹
|
public static string GetHardwareFingerprint()
|
{
|
StringBuilder sb = new StringBuilder();
|
|
// CPU ID
|
sb.Append(GetWmiInfo("Win32_Processor", "ProcessorId"));
|
|
// 主板序列号
|
sb.Append(GetWmiInfo("Win32_BaseBoard", "SerialNumber"));
|
|
// 主硬盘序列号
|
sb.Append(GetFixedDiskSerialNumber());
|
|
// 计算SHA256哈希
|
using (SHA256 sha256 = SHA256.Create())
|
{
|
byte[] hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(sb.ToString()));
|
return BitConverter.ToString(hash).Replace("-", "").Substring(0, 16);
|
}
|
}
|
|
private static string GetWmiInfo(string className, string propertyName)
|
{
|
try
|
{
|
using (ManagementClass mc = new ManagementClass(className))
|
using (ManagementObjectCollection moc = mc.GetInstances())
|
{
|
foreach (ManagementObject mo in moc)
|
{
|
return mo[propertyName]?.ToString() ?? string.Empty;
|
}
|
}
|
}
|
catch { }
|
return string.Empty;
|
}
|
|
// 验证硬件指纹
|
public static bool ValidateFingerprint()
|
{
|
string sRsaVal = "";
|
string currentConfigDirectory = Directory.GetCurrentDirectory() + "\\config";
|
string currentFingerprint = GetHardwareFingerprint();
|
|
try
|
{
|
if (!Directory.Exists(currentConfigDirectory))
|
Directory.CreateDirectory(currentConfigDirectory);
|
|
string sRsa = File.ReadAllText(currentConfigDirectory + "\\" + currentFingerprint + ".lic");
|
sRsaVal = RsaDecrypt(sRsa);
|
}
|
catch
|
{ }
|
|
bool bSame = true;
|
if (currentFingerprint != sRsaVal)
|
{
|
bSame = false;
|
File.WriteAllText(currentConfigDirectory + "\\MachineId.txt", currentFingerprint);
|
}
|
|
|
return bSame;
|
}
|
// 获取固定硬盘序列号(排除可移动设备)
|
private static string GetFixedDiskSerialNumber()
|
{
|
try
|
{
|
// 查找固定硬盘
|
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT SerialNumber, MediaType FROM Win32_DiskDrive WHERE MediaType = 'Fixed hard disk media'"))
|
using (ManagementObjectCollection moc = searcher.Get())
|
{
|
foreach (ManagementObject mo in moc)
|
{
|
string serialNumber = mo["SerialNumber"]?.ToString()?.Trim() ?? string.Empty;
|
if (!string.IsNullOrEmpty(serialNumber))
|
return serialNumber;
|
}
|
}
|
|
// 查找非USB接口的设备
|
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT SerialNumber, InterfaceType FROM Win32_DiskDrive WHERE InterfaceType != 'USB'"))
|
using (ManagementObjectCollection moc = searcher.Get())
|
{
|
foreach (ManagementObject mo in moc)
|
{
|
string serialNumber = mo["SerialNumber"]?.ToString()?.Trim() ?? string.Empty;
|
if (!string.IsNullOrEmpty(serialNumber))
|
return serialNumber;
|
}
|
}
|
}
|
catch { }
|
|
return string.Empty;
|
}
|
|
|
}
|
}
|