.net 软件注册功能的简单实现
相信很多初学编程的人都会对这个软件注册功能很感兴趣,我也不例外,刚学asp.net时,竞找不到这方面的实例,结果自己参考微软的一些文档自己做了一个,其实我做的这个注册功能很简单,读取计算机的CPU序列号,用MD5加密(经过处理)生成一个机器码,然后再把这个机器码处理一下就生成了注册码,在asp.net的配置文件web.config中加了一个键,用于存储注册码,程序运行时读取机器码,然后再生成注册码,对照一下配置文件内的注册码,如果一致就说明程序已注册,否则未注册。同时也做了一个注册机,用于生成注册码。注册机运行结果:
下面是代码:
1、首先是读取机器序列号的类Hardware,网上找来的
1 using System;
2 using System.Runtime.InteropServices;
3 using System.Management;
4 namespace Hardware
5 {
6 /// <summary>
7 /// Hardware_Mac 的摘要说明。
8 /// </summary>
9 public class HardwareInfo
10 {
11 //取机器名
12 public string GetHostName()
13 {
14 return System.Net.Dns.GetHostName();
15 }
16
17 //取CPU编号
18 public String GetCpuID()
19 {
20 try
21 {
22 ManagementClass mc = new ManagementClass("Win32_Processor");
23 ManagementObjectCollection moc = mc.GetInstances();
24
25 String strCpuID = null;
26 foreach (ManagementObject mo in moc)
27 {
28 strCpuID = mo.Properties["ProcessorId"].Value.ToString();
29 break;
30 }
31 return strCpuID;
32 }
33 catch
34 {
35 return "";
36 }
37
38 }//end method
39
40 //取第一块硬盘编号
41 public String GetHardDiskID()
42 {
43 try
44 {
45 ManagementObjectSearcher searcher =
new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");
46 String strHardDiskID = null;
47 foreach (ManagementObject mo in searcher.Get())
48 {
49 strHardDiskID = mo["SerialNumber"].ToString().Trim();
50 break;
51 }
52 return strHardDiskID;
53 }
54 catch
55 {
56 return "";
57 }
58 }//end
59
60 public enum NCBCONST
61 {
62 NCBNAMSZ = 16, /* absolute length of a net name */
63 MAX_LANA = 254, /* lana's in range 0 to MAX_LANA inclusive */
64 NCBENUM = 0x37, /* NCB ENUMERATE LANA NUMBERS */
65 NRC_GOODRET = 0x00, /* good return */
66 NCBRESET = 0x32, /* NCB RESET */
67 NCBASTAT = 0x33, /* NCB ADAPTER STATUS */
68 NUM_NAMEBUF = 30, /* Number of NAME's BUFFER */
69 }
70
71 [StructLayout(LayoutKind.Sequential)]
72 public struct ADAPTER_STATUS
73 {
74 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
75 public byte[] adapter_address;
76 public byte rev_major;
77 public byte reserved0;
78 public byte adapter_type;
79 public byte rev_minor;
80 public ushort duration;
81 public ushort frmr_recv;
82 public ushort frmr_xmit;
83 public ushort iframe_recv_err;
84 public ushort xmit_aborts;
85 public uint xmit_success;
86 public uint recv_success;
87 public ushort iframe_xmit_err;
88 public ushort recv_buff_unavail;
89 public ushort t1_timeouts;
90 public ushort ti_timeouts;
91 public uint reserved1;
92 public ushort free_ncbs;
93 public ushort max_cfg_ncbs;
94 public ushort max_ncbs;
95 public ushort xmit_buf_unavail;
96 public ushort max_dgram_size;
97 public ushort pending_sess;
98 public ushort max_cfg_sess;
99 public ushort max_sess;
100 public ushort max_sess_pkt_size;
101 public ushort name_count;
102 }
103
104 [StructLayout(LayoutKind.Sequential)]
105 public struct NAME_BUFFER
106 {
107 [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NCBNAMSZ)]
108 public byte[] name;
109 public byte name_num;
110 public byte name_flags;
111 }
112
113 [StructLayout(LayoutKind.Sequential)]
114 public struct NCB
115 {
116 public byte ncb_command;
117 public byte ncb_retcode;
118 public byte ncb_lsn;
119 public byte ncb_num;
120 public IntPtr ncb_buffer;
121 public ushort ncb_length;
122 [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NCBNAMSZ)]
123 public byte[] ncb_callname;
124 [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NCBNAMSZ)]
125 public byte[] ncb_name;
126 public byte ncb_rto;
127 public byte ncb_sto;
128 public IntPtr ncb_post;
129 public byte ncb_lana_num;
130 public byte ncb_cmd_cplt;
131 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
132 public byte[] ncb_reserve;
133 public IntPtr ncb_event;
134 }
135
136 [StructLayout(LayoutKind.Sequential)]
137 public struct LANA_ENUM
138 {
139 public byte length;
140 [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.MAX_LANA)]
141 public byte[] lana;
142 }
143
144 [StructLayout(LayoutKind.Auto)]
145 public struct ASTAT
146 {
147 public ADAPTER_STATUS adapt;
148 [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NUM_NAMEBUF)]
149 public NAME_BUFFER[] NameBuff;
150 }
151 public class Win32API
152 {
153 [DllImport("NETAPI32.DLL")]
154 public static extern char Netbios(ref NCB ncb);
155 }
156
157 public string GetMacAddress()
158 {
159 string addr = "";
160 try
161 {
162 int cb;
163 ASTAT adapter;
164 NCB Ncb = new NCB();
165 char uRetCode;
166 LANA_ENUM lenum;
167
168 Ncb.ncb_command = (byte)NCBCONST.NCBENUM;
169 cb = Marshal.SizeOf(typeof(LANA_ENUM));
170 Ncb.ncb_buffer = Marshal.AllocHGlobal(cb);
171 Ncb.ncb_length = (ushort)cb;
172 uRetCode = Win32API.Netbios(ref Ncb);
173 lenum = (LANA_ENUM)Marshal.PtrToStructure(Ncb.ncb_buffer, typeof(LANA_ENUM));
174 Marshal.FreeHGlobal(Ncb.ncb_buffer);
175 if (uRetCode != (short)NCBCONST.NRC_GOODRET)
176 return "";
177
178 for (int i = 0; i < lenum.length; i++)
179 {
180 Ncb.ncb_command = (byte)NCBCONST.NCBRESET;
181 Ncb.ncb_lana_num = lenum.lana[i];
182 uRetCode = Win32API.Netbios(ref Ncb);
183 if (uRetCode != (short)NCBCONST.NRC_GOODRET)
184 return "";
185
186 Ncb.ncb_command = (byte)NCBCONST.NCBASTAT;
187 Ncb.ncb_lana_num = lenum.lana[i];
188 Ncb.ncb_callname[0] = (byte)'*';
189 cb = Marshal.SizeOf(typeof(ADAPTER_STATUS))
+ Marshal.SizeOf(typeof(NAME_BUFFER)) * (int)NCBCONST.NUM_NAMEBUF;
190 Ncb.ncb_buffer = Marshal.AllocHGlobal(cb);
191 Ncb.ncb_length = (ushort)cb;
192 uRetCode = Win32API.Netbios(ref Ncb);
193 adapter.adapt = (ADAPTER_STATUS)Marshal.PtrToStructure(Ncb.ncb_buffer,
typeof(ADAPTER_STATUS));
194 Marshal.FreeHGlobal(Ncb.ncb_buffer);
195
196 if (uRetCode == (short)NCBCONST.NRC_GOODRET)
197 {
198 if (i > 0)
199 addr += ":";
200 addr = string.Format("{0,2:X}{1,2:X}{2,2:X}{3,2:X}{4,2:X}{5,2:X}",
201 adapter.adapt.adapter_address[0],
202 adapter.adapt.adapter_address[1],
203 adapter.adapt.adapter_address[2],
204 adapter.adapt.adapter_address[3],
205 adapter.adapt.adapter_address[4],
206 adapter.adapt.adapter_address[5]);
207 }
208 }
209 }
210 catch
211 { }
212 return addr.Replace(' ', '0');
213 }
214
215 }
216 }
217
2 using System.Runtime.InteropServices;
3 using System.Management;
4 namespace Hardware
5 {
6 /// <summary>
7 /// Hardware_Mac 的摘要说明。
8 /// </summary>
9 public class HardwareInfo
10 {
11 //取机器名
12 public string GetHostName()
13 {
14 return System.Net.Dns.GetHostName();
15 }
16
17 //取CPU编号
18 public String GetCpuID()
19 {
20 try
21 {
22 ManagementClass mc = new ManagementClass("Win32_Processor");
23 ManagementObjectCollection moc = mc.GetInstances();
24
25 String strCpuID = null;
26 foreach (ManagementObject mo in moc)
27 {
28 strCpuID = mo.Properties["ProcessorId"].Value.ToString();
29 break;
30 }
31 return strCpuID;
32 }
33 catch
34 {
35 return "";
36 }
37
38 }//end method
39
40 //取第一块硬盘编号
41 public String GetHardDiskID()
42 {
43 try
44 {
45 ManagementObjectSearcher searcher =
new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");
46 String strHardDiskID = null;
47 foreach (ManagementObject mo in searcher.Get())
48 {
49 strHardDiskID = mo["SerialNumber"].ToString().Trim();
50 break;
51 }
52 return strHardDiskID;
53 }
54 catch
55 {
56 return "";
57 }
58 }//end
59
60 public enum NCBCONST
61 {
62 NCBNAMSZ = 16, /* absolute length of a net name */
63 MAX_LANA = 254, /* lana's in range 0 to MAX_LANA inclusive */
64 NCBENUM = 0x37, /* NCB ENUMERATE LANA NUMBERS */
65 NRC_GOODRET = 0x00, /* good return */
66 NCBRESET = 0x32, /* NCB RESET */
67 NCBASTAT = 0x33, /* NCB ADAPTER STATUS */
68 NUM_NAMEBUF = 30, /* Number of NAME's BUFFER */
69 }
70
71 [StructLayout(LayoutKind.Sequential)]
72 public struct ADAPTER_STATUS
73 {
74 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
75 public byte[] adapter_address;
76 public byte rev_major;
77 public byte reserved0;
78 public byte adapter_type;
79 public byte rev_minor;
80 public ushort duration;
81 public ushort frmr_recv;
82 public ushort frmr_xmit;
83 public ushort iframe_recv_err;
84 public ushort xmit_aborts;
85 public uint xmit_success;
86 public uint recv_success;
87 public ushort iframe_xmit_err;
88 public ushort recv_buff_unavail;
89 public ushort t1_timeouts;
90 public ushort ti_timeouts;
91 public uint reserved1;
92 public ushort free_ncbs;
93 public ushort max_cfg_ncbs;
94 public ushort max_ncbs;
95 public ushort xmit_buf_unavail;
96 public ushort max_dgram_size;
97 public ushort pending_sess;
98 public ushort max_cfg_sess;
99 public ushort max_sess;
100 public ushort max_sess_pkt_size;
101 public ushort name_count;
102 }
103
104 [StructLayout(LayoutKind.Sequential)]
105 public struct NAME_BUFFER
106 {
107 [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NCBNAMSZ)]
108 public byte[] name;
109 public byte name_num;
110 public byte name_flags;
111 }
112
113 [StructLayout(LayoutKind.Sequential)]
114 public struct NCB
115 {
116 public byte ncb_command;
117 public byte ncb_retcode;
118 public byte ncb_lsn;
119 public byte ncb_num;
120 public IntPtr ncb_buffer;
121 public ushort ncb_length;
122 [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NCBNAMSZ)]
123 public byte[] ncb_callname;
124 [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NCBNAMSZ)]
125 public byte[] ncb_name;
126 public byte ncb_rto;
127 public byte ncb_sto;
128 public IntPtr ncb_post;
129 public byte ncb_lana_num;
130 public byte ncb_cmd_cplt;
131 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
132 public byte[] ncb_reserve;
133 public IntPtr ncb_event;
134 }
135
136 [StructLayout(LayoutKind.Sequential)]
137 public struct LANA_ENUM
138 {
139 public byte length;
140 [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.MAX_LANA)]
141 public byte[] lana;
142 }
143
144 [StructLayout(LayoutKind.Auto)]
145 public struct ASTAT
146 {
147 public ADAPTER_STATUS adapt;
148 [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NUM_NAMEBUF)]
149 public NAME_BUFFER[] NameBuff;
150 }
151 public class Win32API
152 {
153 [DllImport("NETAPI32.DLL")]
154 public static extern char Netbios(ref NCB ncb);
155 }
156
157 public string GetMacAddress()
158 {
159 string addr = "";
160 try
161 {
162 int cb;
163 ASTAT adapter;
164 NCB Ncb = new NCB();
165 char uRetCode;
166 LANA_ENUM lenum;
167
168 Ncb.ncb_command = (byte)NCBCONST.NCBENUM;
169 cb = Marshal.SizeOf(typeof(LANA_ENUM));
170 Ncb.ncb_buffer = Marshal.AllocHGlobal(cb);
171 Ncb.ncb_length = (ushort)cb;
172 uRetCode = Win32API.Netbios(ref Ncb);
173 lenum = (LANA_ENUM)Marshal.PtrToStructure(Ncb.ncb_buffer, typeof(LANA_ENUM));
174 Marshal.FreeHGlobal(Ncb.ncb_buffer);
175 if (uRetCode != (short)NCBCONST.NRC_GOODRET)
176 return "";
177
178 for (int i = 0; i < lenum.length; i++)
179 {
180 Ncb.ncb_command = (byte)NCBCONST.NCBRESET;
181 Ncb.ncb_lana_num = lenum.lana[i];
182 uRetCode = Win32API.Netbios(ref Ncb);
183 if (uRetCode != (short)NCBCONST.NRC_GOODRET)
184 return "";
185
186 Ncb.ncb_command = (byte)NCBCONST.NCBASTAT;
187 Ncb.ncb_lana_num = lenum.lana[i];
188 Ncb.ncb_callname[0] = (byte)'*';
189 cb = Marshal.SizeOf(typeof(ADAPTER_STATUS))
+ Marshal.SizeOf(typeof(NAME_BUFFER)) * (int)NCBCONST.NUM_NAMEBUF;
190 Ncb.ncb_buffer = Marshal.AllocHGlobal(cb);
191 Ncb.ncb_length = (ushort)cb;
192 uRetCode = Win32API.Netbios(ref Ncb);
193 adapter.adapt = (ADAPTER_STATUS)Marshal.PtrToStructure(Ncb.ncb_buffer,
typeof(ADAPTER_STATUS));
194 Marshal.FreeHGlobal(Ncb.ncb_buffer);
195
196 if (uRetCode == (short)NCBCONST.NRC_GOODRET)
197 {
198 if (i > 0)
199 addr += ":";
200 addr = string.Format("{0,2:X}{1,2:X}{2,2:X}{3,2:X}{4,2:X}{5,2:X}",
201 adapter.adapt.adapter_address[0],
202 adapter.adapt.adapter_address[1],
203 adapter.adapt.adapter_address[2],
204 adapter.adapt.adapter_address[3],
205 adapter.adapt.adapter_address[4],
206 adapter.adapt.adapter_address[5]);
207 }
208 }
209 }
210 catch
211 { }
212 return addr.Replace(' ', '0');
213 }
214
215 }
216 }
217
2、然后是主界面程序的
1 private void btn_ReadHard_Click(object sender, EventArgs e)
2 {
3 //读机器码
4 string hardcode = "";
5 Hardware.HardwareInfo hd = new Hardware.HardwareInfo();
6 hardcode = hd.GetCpuID();
7 MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
8 byte[] hdcode1 = System.Text.Encoding.UTF8.GetBytes(hardcode +"new");
9 byte[] hdcode2 = md5.ComputeHash(hdcode1);
10 md5.Clear();
11 tb_Hardcode.Text = Convert.ToBase64String(hdcode2).Replace("=","");
12
13 }
2 {
3 //读机器码
4 string hardcode = "";
5 Hardware.HardwareInfo hd = new Hardware.HardwareInfo();
6 hardcode = hd.GetCpuID();
7 MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
8 byte[] hdcode1 = System.Text.Encoding.UTF8.GetBytes(hardcode +"new");
9 byte[] hdcode2 = md5.ComputeHash(hdcode1);
10 md5.Clear();
11 tb_Hardcode.Text = Convert.ToBase64String(hdcode2).Replace("=","");
12
13 }
1
2 private string GetRegCode(string MacCode)
3 {
4 string stra = MacCode.Substring(16);
5 string[] arstr = new string[4]{MacCode.Substring(1, 5),
6 MacCode.Substring(6, 5),MacCode.Substring(11, 5),MacCode.Substring(16,5)};
7 string str5 = "";
8 MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
9 byte[] hdcode;
10 byte[] regcode;
11 for (int i = 0; i < arstr.Length;i++ )
12 {
13 hdcode = System.Text.Encoding.UTF8.GetBytes(arstr[i]+"string");
14 regcode = md5.ComputeHash(hdcode);
15 str5 += Convert.ToBase64String(regcode).Replace("=","");
16 }
17 md5.Clear();
18 return str5;
19 }
2 private string GetRegCode(string MacCode)
3 {
4 string stra = MacCode.Substring(16);
5 string[] arstr = new string[4]{MacCode.Substring(1, 5),
6 MacCode.Substring(6, 5),MacCode.Substring(11, 5),MacCode.Substring(16,5)};
7 string str5 = "";
8 MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
9 byte[] hdcode;
10 byte[] regcode;
11 for (int i = 0; i < arstr.Length;i++ )
12 {
13 hdcode = System.Text.Encoding.UTF8.GetBytes(arstr[i]+"string");
14 regcode = md5.ComputeHash(hdcode);
15 str5 += Convert.ToBase64String(regcode).Replace("=","");
16 }
17 md5.Clear();
18 return str5;
19 }
请大家参考6楼的回复,一定要进行工作进程模拟,否则任何一台电脑提取到的注册码是都是一样的,因为在取本机CpuID或硬盘序列号的时候,返回值为空.
或者在配置文件中加入身份验证要求,如
<allow users="CHINA-3ABA37ACE\administrator"/>
<deny users="*"/>
关于更多的asp.net身份模拟资料,请参考微软的这篇文档.
http://www.microsoft.com/china/community/program/originalarticles/techdoc/impersonation.mspx