科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件利用硬件信息实现共享软件的安全注册

利用硬件信息实现共享软件的安全注册

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文提出了一种解决共享软件安全注册的实现方法。并对Visual C++ 6.0的编程实现过程作了介绍

作者:信息产业部电子第二十二研究所青 来源:yesky 2007年11月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
三、 注册机的设计

  开发人员得到从用户返回的由硬盘序列号构成的注册原始信息后就要利用注册机生成注册码并反馈给用户。一般说,注册机要利用既定的位操作和不可逆算法,生成用户比较容易操作的字符串注册码。在用户方面的共享软件里也有一个具有相同算法的注册机用以动态计算以当前注册名进行注册的正确的注册码,然后对用户输入的注册码进行检测,如果不匹配则不予注册。如果是从开发者反馈来的正确注册码,则通过标记配置文件或是往注册表中写入特定内容键值以表明当前软件是经过注册的。而且共享软件在每次运行时都要对用户注册码进行实时检测与判断,这样才能实注册限制功能。如果应用程序被拷贝到其他计算机上则会由于硬盘序列号的改变而导致注册信息的不匹配,因此仍然要重新注册,从而达到共享软件的发布目的。下面就是一段非常简单的注册机实现代码:

  开发者方:

//strSerial是由用户返回的同注册名进行过位运算的注册源信息
::strcpy(buf1,strSerial);
::strcpy(buf2,strName);
//再次进行位运算,取得硬盘序列号
for(int I=0;I<8;I++)
input[I]=buf1[I]^buf2[I];
//错序与位操作,产生与注册名有关的注册码
int Index[8]={7,5,3,1,6,4,2,0};
char Mask[8]={'Z','H','U','C','E','J','I','0'};
for(I=0;I<8;I++)
{
result[I]=input[Index[I]]^buf2[I];
result[I]=result[I]^Mask[I];
}
……

  用户方:

//根据输入的字串计算出硬盘序列号
int Index[8]={7,5,3,1,6,4,2,0};
char Mask[8]={'Z','H','U','C','E','J','I','0'};
for(int I=0;I<8;I++)
{
input[I]=input[I]^buf2[I];
ouput[Index[I]]=input[I]^Mask[I];
}
dwSerialID=::atoll(output);//将序列号恢复成数值
//动态提取硬盘序列号
GetVolumeInformation("C:\\",NULL,NULL,&dwIDESerial,NULL,NULL,NULL,NULL);
If(dwSerialID==dwIDESerial)
{
……//注册成功
}
else
{
……//注册失败
}

  以上两段代码仅用于举例说明实现的方法,并未进行复杂的逻辑运算,在实际应用中应视共享软件的
自身价值、软件实现的复杂程度等多种因素来决定采取多大的加密深度。即使对于一般的注册机也应加以
2层以上的函数逻辑运算。对于共享软件,不管其实现何种功能,最好采取在线注册的方式,而且在同一个
软件系统中应有若干个注册入口,只要一处注册成功整个软件就算注册成功了。为了清晰的了解整个注册过
程,流程图可以大致如下,并可根据具体做适当的调整:


  小结:本文主要对共享软件的安全注册进行了讨论。为了更方便、安全地实现对共享软件的注册可以大致遵循这样几个原则:选准注册源、经常变动注册算法、加密注册码、管理好注册机防止外流、采用在线式的注册方法。以上所述基本笔者自己的实际经验总结,本文所引程序在Windows 98下由Microsoft Visual C++ 6.0编译通过。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章