| 導購 | 订阅 | 在线投稿
分享
 
 
 

共享軟件的注冊加密法

來源:互聯網  2008-06-01 02:08:12  評論

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,"\\");

strcat(pathstmp,"KEYID.DOC");

for(i=0;i<5;i++)

keyrom[i]=(*(pt+i)+0x1818)^0x5858;//第一級加密算法

sprintf(buff,"KEYID:%04x%04x%04x%04x%04x",

keyrom[0],keyrom[1],keyrom[2],keyrom[3],keyrom[4]);

buff[0x1a]=0;

if((fp2=fopen(pathstmp,"wb"))==NULL)

{

printf("FILE %s CREATE ERROR!",pathtmp);

} 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"

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,"\\"); strcat(pathstmp,"KEYID.DOC"); for(i=0;i<5;i++) keyrom[i]=(*(pt+i)+0x1818)^0x5858;//第一級加密算法 sprintf(buff,"KEYID:%04x%04x%04x%04x%04x", keyrom[0],keyrom[1],keyrom[2],keyrom[3],keyrom[4]); buff[0x1a]=0; if((fp2=fopen(pathstmp,"wb"))==NULL) { printf("FILE %s CREATE ERROR!",pathtmp); } 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"
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有