MachineCoder.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Management;
  5. using System.Security.Cryptography;
  6. using System.Text;
  7. namespace Aitex.Core.RT.Key
  8. {
  9. public class MachineCoder
  10. {
  11. private string _systemName;
  12. public MachineCoder(string systemName)
  13. {
  14. _systemName = systemName;
  15. }
  16. public bool Generate(out string code, out string reason)
  17. {
  18. try
  19. {
  20. reason = "";
  21. code = RegistryManager.Read(RegistryManager.PathMachineCode, _systemName);
  22. if (!string.IsNullOrEmpty(code))
  23. return true;
  24. code = GetHash("CPU >> " + CpuId() + "\nBIOS >> " +
  25. BiosId() + "\nBASE >> " + BaseId()
  26. + "\nDISK >> " + DiskId() + "\nVIDEO >> " +
  27. VideoId() + "\nMAC >> " + GetMACAddress()
  28. );
  29. RegistryManager.Write(RegistryManager.PathMachineCode, _systemName, code);
  30. return true;
  31. }
  32. catch (UnauthorizedAccessException e)
  33. {
  34. code = "";
  35. reason = "没有操作注册表的权限,请用管理员权限打开";
  36. throw e;
  37. }
  38. catch (Exception ex)
  39. {
  40. code = "";
  41. reason = ex.Message;
  42. throw ex;
  43. }
  44. }
  45. private string GetHash(string s)
  46. {
  47. MD5CryptoServiceProvider MD5Pro = new MD5CryptoServiceProvider();
  48. Byte[] buffer = Encoding.GetEncoding("utf-8").GetBytes(s);
  49. Byte[] byteResult = MD5Pro.ComputeHash(buffer);
  50. string x = BitConverter.ToString(byteResult);
  51. string md5result = BitConverter.ToString(byteResult).Replace("-", "");
  52. return md5result;
  53. }
  54. //Primary video controller ID
  55. private string VideoId()
  56. {
  57. return GetManagementClassValue("Win32_VideoController", "DriverVersion")
  58. + GetManagementClassValue("Win32_VideoController", "Name");
  59. }
  60. private static string GetMacAndDescription()
  61. {
  62. ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration where IPEnabled=true");
  63. IEnumerable<ManagementObject> objects = searcher.Get().Cast<ManagementObject>();
  64. string mac = (from o in objects orderby o["IPConnectionMetric"] select o["MACAddress"].ToString()).FirstOrDefault();
  65. string description = (from o in objects orderby o["IPConnectionMetric"] select o["Description"].ToString()).FirstOrDefault();
  66. return mac + ";" + description;
  67. }
  68. private static string GetMacByDescription(string description)
  69. {
  70. ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration where IPEnabled=true");
  71. IEnumerable<ManagementObject> objects = searcher.Get().Cast<ManagementObject>();
  72. string mac = (from o in objects where o["Description"].ToString() == description select o["MACAddress"].ToString()).FirstOrDefault();
  73. return mac;
  74. }
  75. private string GetMACAddress()
  76. {
  77. ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration where IPEnabled=true");
  78. IEnumerable<ManagementObject> objects = searcher.Get().Cast<ManagementObject>();
  79. string mac = (from o in objects orderby o["IPConnectionMetric"] select o["MACAddress"].ToString()).FirstOrDefault();
  80. return mac;
  81. }
  82. //First enabled network card ID
  83. private string MacId()
  84. {
  85. //Hashtable hashtable = new Hashtable();
  86. ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration");
  87. ManagementObjectCollection managementObjectCollection = managementObjectSearcher.Get();
  88. foreach (ManagementBaseObject managementBaseObject in managementObjectCollection)
  89. {
  90. ManagementObject managementObject = (ManagementObject)managementBaseObject;
  91. try
  92. {
  93. if ((bool)managementObject["IPEnabled"])
  94. {
  95. return (string)managementObject["MacAddress"];
  96. }
  97. }
  98. catch
  99. {
  100. }
  101. }
  102. return "000";
  103. }
  104. //Motherboard ID
  105. private string BaseId()
  106. {
  107. return GetManagementClassValue("Win32_BaseBoard", "Model")
  108. + GetManagementClassValue("Win32_BaseBoard", "Manufacturer")
  109. + GetManagementClassValue("Win32_BaseBoard", "Name")
  110. + GetManagementClassValue("Win32_BaseBoard", "SerialNumber");
  111. }
  112. //BIOS Identifier
  113. private string BiosId()
  114. {
  115. return GetManagementClassValue("Win32_BIOS", "Manufacturer")
  116. + GetManagementClassValue("Win32_BIOS", "SMBIOSBIOSVersion")
  117. + GetManagementClassValue("Win32_BIOS", "IdentificationCode")
  118. + GetManagementClassValue("Win32_BIOS", "SerialNumber")
  119. + GetManagementClassValue("Win32_BIOS", "ReleaseDate")
  120. + GetManagementClassValue("Win32_BIOS", "Version");
  121. }
  122. //Main physical hard drive ID
  123. private string DiskId()
  124. {
  125. return GetManagementClassValue("Win32_DiskDrive", "Model")
  126. + GetManagementClassValue("Win32_DiskDrive", "Manufacturer")
  127. + GetManagementClassValue("Win32_DiskDrive", "Signature")
  128. + GetManagementClassValue("Win32_DiskDrive", "TotalHeads");
  129. }
  130. private string CpuId()
  131. {
  132. //Uses first CPU identifier available in order of preference
  133. //Don't get all identifiers, as it is very time consuming
  134. string retVal = GetManagementClassValue("Win32_Processor", "UniqueId");
  135. if (retVal == "") //If no UniqueID, use ProcessorID
  136. {
  137. retVal = GetManagementClassValue("Win32_Processor", "ProcessorId");
  138. if (retVal == "") //If no ProcessorId, use Name
  139. {
  140. retVal = GetManagementClassValue("Win32_Processor", "Name");
  141. if (retVal == "") //If no Name, use Manufacturer
  142. {
  143. retVal = GetManagementClassValue("Win32_Processor", "Manufacturer");
  144. }
  145. //Add clock speed for extra security
  146. retVal += GetManagementClassValue("Win32_Processor", "MaxClockSpeed");
  147. }
  148. }
  149. return retVal;
  150. }
  151. //步骤一: 获得CUP序列号和硬盘序列号的实现代码如下:
  152. //获得CPU的序列号
  153. bool Stupids = true;
  154. bool Cat = false;
  155. private string getCpu()
  156. {
  157. string strCpu = null;
  158. ManagementClass myCpu = new ManagementClass("win32_Processor");
  159. ManagementObjectCollection myCpuConnection = myCpu.GetInstances();
  160. foreach (ManagementObject myObject in myCpuConnection)
  161. {
  162. strCpu = myObject.Properties["Processorid"].Value.ToString();
  163. break;
  164. }
  165. return strCpu;
  166. }
  167. //取得设备硬盘的卷标号
  168. private string GetDiskVolumeSerialNumber()
  169. {
  170. ManagementClass mc =
  171. new ManagementClass("Win32_NetworkAdapterConfiguration");
  172. ManagementObject disk =
  173. new ManagementObject("win32_logicaldisk.deviceid=\"c:\"");
  174. disk.Get();
  175. return disk.GetPropertyValue("VolumeSerialNumber").ToString();
  176. }
  177. //步骤二: 收集硬件信息生成机器码, 代码如下:
  178. //生成机器码
  179. //private string CreateCode()
  180. //{
  181. // string temp = getCpu() + GetDiskVolumeSerialNumber();//获得24位Cpu和硬盘序列号
  182. // string[] strid = new string[24];//
  183. // for (int i = 0; i < 24; i++)//把字符赋给数组
  184. // {
  185. // strid[i] = temp.Substring(i, 1);
  186. // }
  187. // temp = "";
  188. // //Random rdid = new Random();
  189. // for (int i = 0; i < 24; i++)//从数组随机抽取24个字符组成新的字符生成机器三
  190. // {
  191. // //temp += strid[rdid.Next(0, 24)];
  192. // temp += strid[i + 3 >= 24 ? (i + 3 - 24) : (i + 3)];
  193. // }
  194. // return GetMd5(temp);
  195. //}
  196. //步骤三: 使用机器码生成软件注册码, 代码如下:
  197. //使用机器码生成注册码
  198. private int[] intCode = new int[127];//用于存密钥
  199. private void setIntCode()//给数组赋值个小于10的随机数
  200. {
  201. Random ra = new Random();
  202. for (int i = 1; i < intCode.Length; i++)
  203. {
  204. intCode[i] = ra.Next(0, 9);
  205. }
  206. //for (int i = 1; i < intCode.Length; i++)
  207. //{
  208. // intCode[i] = i + 3 > 9 ? 0 : i + 3;
  209. //}
  210. }
  211. private int[] intNumber = new int[25];//用于存机器码的Ascii值
  212. private char[] Charcode = new char[25];//存储机器码字
  213. //生成注册码
  214. private string GetCode(string code)
  215. {
  216. if (code != "")
  217. {
  218. //把机器码存入数组中
  219. setIntCode();//初始化127位数组
  220. for (int i = 1; i < Charcode.Length; i++)//把机器码存入数组中
  221. {
  222. Charcode[i] = Convert.ToChar(code.Substring(i - 1, 1));
  223. }//
  224. for (int j = 1; j < intNumber.Length; j++)//把字符的ASCII值存入一个整数组中。
  225. {
  226. intNumber[j] =
  227. intCode[Convert.ToInt32(Charcode[j])] +
  228. Convert.ToInt32(Charcode[j]);
  229. }
  230. string strAsciiName = null;//用于存储机器码
  231. for (int j = 1; j < intNumber.Length; j++)
  232. {
  233. //MessageBox.Show((Convert.ToChar(intNumber[j])).ToString());
  234. //判断字符ASCII值是否0-9之间
  235. if (intNumber[j] >= 48 && intNumber[j] <= 57)
  236. {
  237. strAsciiName += Convert.ToChar(intNumber[j]).ToString();
  238. }
  239. //判断字符ASCII值是否A-Z之间
  240. else if (intNumber[j] >= 65 && intNumber[j] <= 90)
  241. {
  242. strAsciiName += Convert.ToChar(intNumber[j]).ToString();
  243. }
  244. //判断字符ASCII值是否a-z之间
  245. else if (intNumber[j] >= 97 && intNumber[j] <= 122)
  246. {
  247. strAsciiName += Convert.ToChar(intNumber[j]).ToString();
  248. }
  249. else//判断字符ASCII值不在以上范围内
  250. {
  251. if (intNumber[j] > 122)//判断字符ASCII值是否大于z
  252. {
  253. strAsciiName += Convert.ToChar(intNumber[j] - 10).ToString();
  254. }
  255. else
  256. {
  257. strAsciiName += Convert.ToChar(intNumber[j] - 9).ToString();
  258. }
  259. }
  260. //label3.Text = strAsciiName;//得到注册码
  261. }
  262. return strAsciiName;
  263. }
  264. else
  265. {
  266. return "";
  267. }
  268. }
  269. //步骤四: 用户输入注册码注册软件, 演示代码如下:
  270. //注册
  271. private bool RegistIt(string currentCode, string realCode)
  272. {
  273. if (realCode != "")
  274. {
  275. if (currentCode.TrimEnd().Equals(realCode.TrimEnd()))
  276. {
  277. Microsoft.Win32.RegistryKey retkey =
  278. Microsoft.Win32.Registry.CurrentUser.
  279. OpenSubKey("software", true).CreateSubKey("StupidsCat").
  280. CreateSubKey("StupidsCat.ini").
  281. CreateSubKey(currentCode.TrimEnd());
  282. retkey.SetValue("StupidsCat", "BBC6D58D0953F027760A046D58D52786");
  283. retkey = Microsoft.Win32.Registry.LocalMachine.
  284. OpenSubKey("software", true).CreateSubKey("StupidsCat").
  285. CreateSubKey("StupidsCat.ini").
  286. CreateSubKey(currentCode.TrimEnd());
  287. retkey.SetValue("StupidsCat", "BBC6D58D0953F027760A046D58D52786");
  288. return Stupids;
  289. }
  290. else
  291. {
  292. return Cat;
  293. }
  294. }
  295. else { return Cat; }
  296. }
  297. //Return a hardware identifier
  298. private string GetManagementClassValue(string wmiClass, string wmiProperty)
  299. {
  300. string result = "";
  301. ManagementClass mc = new ManagementClass(wmiClass);
  302. ManagementObjectCollection moc = mc.GetInstances();
  303. foreach (ManagementObject mo in moc)
  304. {
  305. //Only get the first one
  306. if (result == "")
  307. {
  308. try
  309. {
  310. result = mo[wmiProperty].ToString();
  311. break;
  312. }
  313. catch
  314. {
  315. }
  316. }
  317. }
  318. return result;
  319. }
  320. }
  321. }