注册机使用原理及实现

注册机源码:

http://download.csdn.net/detail/qq_34149805/9698883

注册机的作用

由于一些软件涉及版权问题,在用户未进行软件注册前,会存在试用期期限限制或者部分功能上的使用限

制。因此,用户想要解除这些限制,就需要进行软件注册。这时注册机就可以解决这类注册问题。

大多数情况还是用来防止盗版,使你的程序只能运行在特定的服务器上。如果新的服务器想要使用程序,则

需要提供机器上的特定代码从而生成注册码。

原理

注册机的使用主要是去验证服务器端存储的注册码是否和你本机相匹配。

机器上可以用来当做识别码的有很多,比如说硬盘序列号,CPU序列号,通常情况下服务器是不会去更换这

些东西的。根据这些标识码生成你机器的唯一识别码,每次运行程序时去验证,就会防止其他人盗版你的程序。

服务端验证实现

这里以.net mvc为例

添加一个新的过滤器,继承ActionFilterAttribute

下面是主要代码:

    public class AuthFilter : ActionFilterAttribute
    {
        string cpuNumber = "";
        string diskNumber = "";
        string myNumber = "";
        private bool _isEnable = true;

        public AuthFilter()
        {
            _isEnable = true;
        }

        public AuthFilter(bool IsEnable)
        {
            _isEnable = IsEnable;
        }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (_isEnable)
            {
                if (!isAuthed(filterContext))
                {
                    if (!isRegisted())
                    {
                        var routeValue = new RouteValueDictionary {
                        { "Area", "Admin"},
                        { "Controller", "Index"},
                        { "Action", "Unauth"}
                    };
                        filterContext.Result = new RedirectToRouteResult(routeValue);
                    }
                    else
                    {
                        filterContext.HttpContext.Application.Add("Auth", "isAuth");
                    }
                }
            }

            base.OnActionExecuting(filterContext);
        }

        private bool isAuthed(ActionExecutingContext filterContext)
        {
            if (filterContext.HttpContext.Application.AllKeys.Count()>0)
            {
                if (filterContext.HttpContext.Application.AllKeys[0] == "Auth")
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }

        }

        private bool isRegisted()
        {
            string fegisterFilePath =  System.AppDomain.CurrentDomain.BaseDirectory.ToString()+ "RegisterNumber"+"\\Register.dll";

            if (!File.Exists(fegisterFilePath))
            {
                return false;
            }
            else
            {
                //读取文件
                StreamReader reader = new StreamReader(fegisterFilePath);
                string Number = reader.ReadLine();
                getMyNumber();

                if (myNumber == Number)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }

        //拼接机器码
        private void getMyNumber()
        {
            myNumber = "";
            getCpuNumber();
            getDiskNumber();
            myNumber = PublicVar.MD5(diskNumber + cpuNumber);
        }

        //获取硬盘序列号
        private void getDiskNumber()
        {
            diskNumber = "";
            ManagementClass cimobject1 = new ManagementClass("Win32_DiskDrive");
            ManagementObjectCollection moc_disk = cimobject1.GetInstances();
            foreach (ManagementObject mo in moc_disk)
            {
                diskNumber += (string)mo.Properties["Model"].Value;
            }
        }

        //获取CPU序列号
        private void getCpuNumber()
        {
            cpuNumber = "";
            ManagementClass cimobject = new ManagementClass("Win32_Processor");
            ManagementObjectCollection moc_cup = cimobject.GetInstances();
            foreach (ManagementObject mo in moc_cup)
            {
                cpuNumber += mo.Properties["ProcessorId"].Value.ToString();
            }
        }
    }

注意几点:

1.本程序使用硬盘序列号+cpu序列号再进行MD5加密作为机器码。(加密方式有很多种,自己选择)

2.程序第一次运行如果验证成功,会在程序的全局变量中存储一个标识码,这样下次再进入新的Action就会去验证标识码,而不用再读取硬盘了。

 filterContext.HttpContext.Application.Add("Auth", "isAuth");

3.在FilterConfig中加入 filters.Add(new AuthFilter());保证再进入任何一个action都要进行验证。

4.再未授权页面加上[AuthFilter(false)]以防进入死循环。

你可能感兴趣的:(c#)