国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

共享軟件的注冊加密法

2019-11-17 05:01:03
字體:
來源:轉載
供稿:網友
    Internet網絡的迅速發展,為軟件高效傳播開辟更加廣闊的天地。如國內聞名的金蜘蛛軟件下載中心,就是一個典型的發布軟件集散地。發布共享軟件主要包括兩種形式:日期限制形式和電子注冊形式。日期限制形式答應下載軟件的用戶使用軟件一段時間,如一個月等,假如用戶認可該軟件,可購買該軟件的注冊序列號繼續使用;電子注冊形式就是根據用戶所用機器的硬件信息產生注冊碼,并在軟件中對某些先進或常用功能進行限制,假如用戶要使用其全部功能,必須將軟件采集的有關硬件信息反饋給開發者,并交一定的注冊費可獲得該軟件在自己機器中的注冊碼,才能正常使用。
    前一種形式很輕易給盜版者造成可乘之機,假如制作盜版者購買了一個注冊序列號并公布于天下,則所有用戶使用這個注冊號都可進行正常使用;后者對用戶來說注冊手段稍顯復雜些,對開發者來說也需要一定的編程真功夫,但其具有“八點鎖緊”功能,防盜性卻是不容置疑。本文根據自己的實踐,將后者的實現過程介紹給想要制作發布共享軟件的讀者。
    一、注冊源
    在WIN98/95的保護模式下,要根據硬件信息形成注冊碼可不是一件輕易的事,在實模式下可通過硬盤端口1F6H和1F7H直接讀取硬盤的序列號等信息作為注冊的數據源,但這一方法在保護模式下卻被亮出了紅牌。利用BIOS中的主板序列號、BIOS版本序列號或主機出廠日期和標志等,完全可以作為注冊碼的注冊源。如ROMBIOS中F000H-FFFFH區域中就存在與硬件配置有關的信息,還可以采集其它一處或幾處主板等的信息作為注冊碼的生產基地。例如可根據F000H:FFF5H-F000H:FFFFH 中存放的主機出廠日期和主機標志值,產生應用程序的注冊碼。由于計算機產品的更新換代比較快,而且所有用戶使用的計算機不可能配置都完全相同,所以注冊碼產生的源也不會完全相同。而且這些硬件信息內容在任何操作系統下均完全相同,兼容性非常好,更不會因為操作系統的更新而造成注冊功能失效。
    注冊源確定之后,要害的問題就是共享軟件安裝程序如何采集注冊源信息,并讓用戶將其返回給開發者。最簡單的方法就是將采集到的注冊源信息經過位操作加密后存放到一個文本中,形成注冊碼的數據源資料。這個注冊源數據串可稍長一些,但不宜過長,使用戶能夠通過電子郵箱、電話或信件順利轉給開發者為宜。如筆者安裝程序是用C語言編制的,假如將上述內存地址作為注冊源,數據串文本文件名為KEYID.DOC,長度為20個字符。其示例代碼如下:
    FILE  *fp2;
    unsigned int keyrom[9];
    unsigned char buff[0x410];
    unsigned char pathstmp[80];
    unsigned char path[80]={"C://WBCOOL"};
    unsigned int far *pt=(unsigned int far*)0xf000fff6L;
    ......
    outportb(0x21,0x2);
    strcpy(pathstmp,path);
    strcat(pathstmp,"http://");
    strcat(pathstmp,"KEYID.DOC");
    for(i=0;i<5;i++)
      keyrom[i]=(*(pt+i)+0x1818)^0x5858;//第一級加密算法
    s    } else {
      fseek(fp2,0L,SEEK_SET);
      fprintf(fp2,"%s/xd/xa",buff);
      fclose(fp2);
    }
    outportb(0x21,0x0);
    
    二、注冊機
    

    開發者得到用戶提供的注冊源數據之后,就需要利用注冊機生成注冊碼并返回給用戶。注冊機利用既定的位操作和不可逆算法,形成用戶比較輕易操作的字符串注冊碼,注冊碼的長度一般為8-16位為宜,用戶只需注冊一次就可以長期使用,所以注冊碼的長度不會影響用戶的注冊操作。當然注冊機的算法應與共享軟件中的算法部分基本相同。對于遠程用戶,注冊機應該具有從鍵盤和內存兩種取得注冊源數據的功能,所以注冊機的加密算法實際為兩個分支:第一個分支是從鍵盤獲取注冊源數據后直接根據注冊算法形成注冊碼的過程,是直接給遠程用戶反饋注冊碼的過程;第二個分支是直接從ROM BIOS中根據注冊源算法取得注冊源數據,再根據注冊算法形成注冊碼的過程,是直接讀取本地機注冊碼的。
    用戶得到注冊碼后,根據共享發布軟件的注冊方法進行一次注冊,應用程序會自動將這個注冊碼存放到軟件的特定位置處,當應用程序被他人拷貝到其它機器中去后,由于注冊碼因不同機器而異,所以應用程序的功能或使用次數仍然受限,要在其它機器中使用該應用程序,還必須進行重新注冊,達到共享軟件發布目的。同時由于注冊源數據的算法和注冊碼算法均可因人而異,因此這種方法非常可靠。本人實現的注冊機帶參數時接受鍵盤輸入注冊源;不帶任何參數時從本地機器內直接采集注冊源數據。我的注冊機示例程序如下:
#include <conio.h>
#include <dos.h>
#include <io.h>
#include <dir.h>
#include <alloc.h>
#include <string.h>
#include <stdio.h>
#include <process.h>
#include <fcntl.h>
#include <ctype.h>
#include <stdlib.h>
unsigned char Buff[18];
unsigned char Buff1[18];
unsigned int  keyrom[9];
unsigned int sum,sum1,sumi,sumj;
unsigned int far *pt=(unsigned int far *)0xf000fff6L;
unsigned int i=0,j=0,m,imecom;
unsigned char p;
unsigned int  nn,nn1,nn2;
unsigned char rbuff[100],cc,cc1,cc2;
int fp;
void main(int argc,char *argv[])
{
  if(argc>=2){
    printf("KEYID:");
    scanf("%s",rbuff);//接受鍵盤輸入遠程注冊源
    j=strlen(rbuff);
    if(j!=20) exit(1);
    for(i=0;i<20;i++){//讀入20位注冊源數據
      if((rbuff[i]>='a')&&(rbuff[i]<='f')) rbuff[i]&=0xdf;
      if((rbuff[i]>='A')&&(rbuff[i]<='F')) rbuff[i]-=0x37;
      else if((rbuff[i]>='0')&&(rbuff[i]<='9')) rbuff[i]-=0x30;
      else exit(1);
    }
    for(i=0;i<5;i++){//形成字符串
      cc1=rbuff[i*4]&0xf;
      cc2=rbuff[i*4+1]&0xf;
      cc=(cc1<<4)cc2;
      nn1=(unsigned int)cc;
      cc1=rbuff[i*4+2]&0xf;
      cc2=rbuff[i*4+3]&0xf;
      cc=(cc1<<4)cc2;
      nn2=(unsigned int)cc;
      nn=(nn1<<8)nn2;
      keyrom[i]=nn;
    }
    sum=0x1234;
    sum1=0x7456;
    for(sumj=0;sumj<4;sumj++){//形成16位注冊碼
      for(sumi=0;sumi<5;sumi++){
        sum+=keyrom[sumi];    //形成前4位碼

        sum1+=keyrom[sumi];
      }
      sum^=0x1234<<sumj;      //進行移位異或處理
      sum1^=0x7456<<sumj;
      sprintf(Buff+4*sumj,"%04x"

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汽车| 河池市| 滦平县| 什邡市| 大渡口区| 芷江| 黔南| 岑溪市| 张家界市| 墨玉县| 沙雅县| 南澳县| 正镶白旗| 灵山县| 宁乡县| 襄城县| 安国市| 改则县| 建瓯市| 庆元县| 蓝山县| 深泽县| 吉木萨尔县| 巴东县| 湘潭县| 孝昌县| 巫溪县| 上虞市| 洪洞县| 宁河县| 塔城市| 巴楚县| 固镇县| 合江县| 横峰县| 桃园市| 集贤县| 耒阳市| 全椒县| 缙云县| 星子县|