网普技术论坛 网普科技  
» 游客:   网普主页 | 注册 | 登录 | 帮助
 

作者:
标题: 转:共享软件的注册加密法 (上) 上一主题 | 下一主题
网普科技
网普管理员

网普科技人民公仆


积分 3080
发贴 2863
注册 2004-6-26
来自 网普科技
状态 离线
#1  转:共享软件的注册加密法 (上)

出处:CSDN
作者:宋立波  

  Internet网络的迅速发展,为软件高效传播开辟更加广阔的天地。如国内著名的金蜘蛛软件下载中心,就是一个典型的发布软件集散地。发布共享软件主要包括两种形式:日期限制形式和电子注册形式。日期限制形式允许下载软件的用户使用软件一段时间,如一个月等,如果用户认可该软件,可购买该软件的注册序列号继续使用;电子注册形式就是根据用户所用机器的硬件信息产生注册码,并在软件中对某些先进或常用功能进行限制,如果用户要使用其全部功能,必须将软件采集的有关硬件信息反馈给开发者,并交一定的注册费可获得该软件在自己机器中的注册码,才能正常使用。

  前一种形式很容易给盗版者造成可乘之机,如果制作盗版者购买了一个注册序列号并公布于天下,则所有用户使用这个注册号都可进行正常使用;后者对用户来说注册手段稍显复杂些,对开发者来说也需要一定的编程真功夫,但其具有"八点锁紧"功能,防盗性却是不容置疑。本文根据自己的实践,将后者的实现过程介绍给想要制作发布共享软件的读者。

  一、注册源

  在WIN98/95的保护模式下,要根据硬件信息形成注册码可不是一件容易的事,在实模式下可通过硬盘端口1F6H和1F7H直接读取硬盘的序列号等信息作为注册的数据源,但这一方法在保护模式下却被亮出了红牌。利用BIOS中的主板序列号、BIOS版本序列号或主机出厂日期和标志等,完全可以作为注册码的注册源。如ROMBIOS中F000H-FFFFH区域中就存在与硬件配置有关的信息,还可以采集其它一处或几处主板等的信息作为注册码的生产基地。例如可根据F000H:FFF5H-F000H:FFFFH 中存放的主机出厂日期和主机标志值,产生应用程序的注册码。由于计算机产品的更新换代比较快,而且所有用户使用的计算机不可能配置都完全相同,所以注册码产生的源也不会完全相同。而且这些硬件信息内容在任何操作系统下均完全相同,兼容性非常好,更不会因为操作系统的更新而造成注册功能失效。

  注册源确定之后,关键的问题就是共享软件安装程序如何采集注册源信息,并让用户将其返回给开发者。最简单的方法就是将采集到的注册源信息经过位操作加密后存放到一个文本中,形成注册码的数据源资料。这个注册源数据串可稍长一些,但不宜过长,使用户能够通过电子邮箱、电话或信件顺利转给开发者为宜。如笔者安装程序是用C语言编制的,如果将上述内存地址作为注册源,数据串文本文件名为KEYID.DOC,长度为20个字符。其示例代码如下:
CODE:  [Copy to clipboard]
二、注册机

  开发者得到用户提供的注册源数据之后,就需要利用注册机生成注册码并返回给用户。注册机利用既定的位操作和不可逆算法,形成用户比较容易操作的字符串注册码,注册码的长度一般为8-16位为宜,用户只需注册一次就可以长期使用,所以注册码的长度不会影响用户的注册操作。当然注册机的算法应与共享软件中的算法部分基本相同。对于远程用户,注册机应该具有从键盘和内存两种取得注册源数据的功能,所以注册机的加密算法实际为两个分支:第一个分支是从键盘获取注册源数据后直接根据注册算法形成注册码的过程,是直接给远程用户反馈注册码的过程;第二个分支是直接从ROM BIOS中根据注册源算法取得注册源数据,再根据注册算法形成注册码的过程,是直接读取本地机注册码的。

  用户得到注册码后,根据共享发布软件的注册方法进行一次注册,应用程序会自动将这个注册码存放到软件的特定位置处,当应用程序被他人拷贝到其它机器中去后,由于注册码因不同机器而异,所以应用程序的功能或使用次数仍然受限,要在其它机器中使用该应用程序,还必须进行重新注册,达到共享软件发布目的。同时由于注册源数据的算法和注册码算法均可因人而异,因此这种方法非常可靠。本人实现的注册机带参数时接受键盘输入注册源;不带任何参数时从本地机器内直接采集注册源数据。我的注册机示例程序如下:
CODE:  [Copy to clipboard]
三、注册码

  当用户注册成功后,注册码就被写到共享软件的相应位置。这时共享软件必须对用户注册码进行实时检测与判断,才能实现注册限制功能。这时要求共享软件必须内部取得注册源数据,并利用注册机中相同的算法产生内部注册码。这就要求共享软件直接读取ROM BIOS的注册源信息,并在共享软件中需要限制的功能处增加注册码检测判断功能,这需要根据共享软件的实际需要、软件大小和实现的难易程度来确定限制的数量,使盗版者很难进行解密。这样既使计算机中多个共享软件使用相同的注册源,也不会发生注册冲突问题;既使是使用了相同的注册源数据,由于注册算法的不同注册码也不会相同;即使解密者知道注册算法的注册源地址,由于无法知道注册算法而且注册点遍布整个共享软件,也很难进行盗版。因此,这一注册方法使共享软件有效地跨越各种系统平台。

  要在共享软件内部产生注册码,必须在共享软件中读取ROM BIOS数据源内存数据。WINDOWS保护模式下必须利用段选择符方法和API编程接口提供的函数才能实现:

  1.AllocSelector(Selector)分配一个与参数相同的空选择器
  2.FreeSelector(Selector) 释放分配的选择器
  3.SetSelectorBase() 设置选择器描述符物理起始地址
  4.GetSelectorBase() 获取选择器描述符物理起始地址
  5.SetSelectorLimit() 设置选择器描述符访问界限
  6.GetSelectorLimit() 获取选择器描述符访问界限

其中函数AllocSelector(Selector) 是保护模式下物理内存访问的关键,Selector是分配空选择器的段寄存器模板,可以利用GlobalAlloc()函数分配内存,再利用GlobalHandleToSel()函数将内存句柄转换为相应选择器,内存单元访问结束后再利用GlobalFree()释放分配的内存。最简单的方法就是将系统的数据段寄存器__DS直接作为模板参数,这个参数在一般应用程序中完全可以正常使用。然后利用SetSelectorBase()和SetSelectorLimit( )函数分别设置内存的物理起始地址和访问界限值,利用正常的指针操作*pt=Value和Value=*pt访问物理内存单元,访问结束后必须使用FreeSelector()函数释放分配的选择器,因为WINDOWS 并不自动释放无用的选择器,而且系统的选择器共享资源是非常有限,只有8192个供使用。根据以上原理及注册机中的注册源和注册码算法,就不难实现共享软件内部注册码函数:
CODE:  [Copy to clipboard]




天理路上甚宽,稍游心,胸中便觉广大宏朗;
人欲路上甚窄,才寄迹,眼前俱是荆棘泥涂。



网普科技,优质美国主机服务!
美国Linux主机,美国虚拟主机
支持PHP+MYSQL+cPanel+EMAIL
为用户负责,拒绝反动、赌博及色情内容! QQ:126818

发送QQ消息
2004-11-27 03:34 PM
查看资料  访问主页  发短消息  QQ   编辑帖子  引用回复 顶部
茱莉娅
THE BODY SHOP美容顾问

茱莉娅美体小铺


积分 3080
发贴 2863
注册 2009-5-21
来自 茱莉娅美体小铺
状态 离线
#1  赞助商信息The body shop

茱莉娅美体小铺
茱莉娅美体小铺淘宝店
茱莉娅美体小铺


茱莉娅美体小铺淘宝店
2004-11-27 03:34 PM
查看资料  访问主页  发短消息  QQ   编辑帖子  引用回复 顶部


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转:  




Powered by Discuz! 2.5 © 2001-2005 Comsenz Technology Ltd.
Processed in 0.007530 second(s), 7 queries, Gzip enabled
------------------------------------------------------------------------------
本论坛属网普科技交流与技术支持论坛!
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!
美国主机, 美国虚拟主机, cPanel+PHP+Mysql+Ftp+Email+Zend+GD2+国际域名支持
技术支持 QQ: 126818 EMail & MSN: support[AT]netpu.net
[ 联系我们 ] - [ 网普科技 ]