?? cmos加密軟件防止非法拷貝.txt
字號(hào):
我們運(yùn)行軟件時(shí)經(jīng)常會(huì)遇到以下情況,有的軟件在一臺(tái)機(jī)器上安裝后就不能將其拷貝到其他機(jī)器上運(yùn)行;有的軟件甚至連原來機(jī)器的軟、硬件配置改變后也無法再次運(yùn)行。其實(shí)這些情況有的是利用CMOS對(duì)軟件加密來實(shí)現(xiàn)的。安裝軟件時(shí),通過安裝程序把軟件安裝到硬盤上,同時(shí)把當(dāng)前機(jī)器的CMOS信息保存到安裝軟盤上,也就是相當(dāng)于保存了密鑰。等到以后在硬盤上運(yùn)行該軟件時(shí),軟件的主程序會(huì)把記錄在安裝盤上的密鑰與正在運(yùn)行該軟件機(jī)器的CMOS信息進(jìn)行比較,如果完全相同,則允許軟件繼續(xù)運(yùn)行,否則終止軟件運(yùn)行。國(guó)內(nèi)的許多軟件都是采用此原理進(jìn)行加密的。
由于CMOS具有比磁盤更好的隱蔽性和正常DOS下的不可訪問性,所以利用CMOS對(duì)軟件進(jìn)行加密是防止軟件非法拷貝的一種方法。本文將重點(diǎn)介紹通過C語言利用CMOS對(duì)軟件進(jìn)行加密防止非法拷貝的實(shí)現(xiàn)方法。
一、CMOS數(shù)據(jù)格式
CMOS是互補(bǔ)金屬氧化物半導(dǎo)體的縮寫,其本意是指制造大規(guī)模集成電路芯片用的一種技術(shù)或用這種技術(shù)制造出來的芯片。在這里是指計(jì)算機(jī)主板上的一塊可讀寫的RAM芯片。它靠系統(tǒng)電源和后備電池供電,系統(tǒng)掉電后內(nèi)容不會(huì)丟失。它存儲(chǔ)了機(jī)器軟、硬件配置的基本信息,共有128個(gè)字節(jié)。系統(tǒng)在上電引導(dǎo)時(shí)要讀取CMOS信息來初始化機(jī)器各部件狀態(tài)。
表1 CMOS數(shù)據(jù)格式地址說明地址說明
00H秒數(shù)10H軟盤驅(qū)動(dòng)器類型
01H秒數(shù)報(bào)警11H保留
02H分?jǐn)?shù)12H硬盤驅(qū)動(dòng)器類型
03H分?jǐn)?shù)報(bào)警13H保留
04H小時(shí)數(shù)14H設(shè)備字節(jié)
05H小時(shí)數(shù)報(bào)警15~16H基本內(nèi)存容量,單位K
06H星期數(shù)17~18H擴(kuò)充內(nèi)存容量,單位K
07H日期19H硬盤驅(qū)動(dòng)器0類型
08H月份1AH硬盤驅(qū)動(dòng)器1類型
09H年份1B~2DH保留
0AHA寄存器狀態(tài)2E~2FH10-2DH校驗(yàn)和
0BHB寄存器狀態(tài)30~31H擴(kuò)充內(nèi)存容量,單位K
0CHC寄存器狀態(tài)32HBCD碼世紀(jì)值
0DHD寄存器狀態(tài)33H信息標(biāo)志
0EH診斷狀態(tài)字節(jié)34~3FH保留
0FH停機(jī)狀態(tài)字節(jié)40~7FH保留
二、加密原理
如果想要限定軟件只在固定的機(jī)器上運(yùn)行,可以在軟件的安裝時(shí)把當(dāng)前機(jī)器CMOS中的內(nèi)容讀出,作為密鑰以文件的形式保存到安裝盤上。在軟件運(yùn)行時(shí)自動(dòng)檢查當(dāng)前正在運(yùn)行程序機(jī)器的CMOS中內(nèi)容是否與安裝盤上保存的密鑰相同。如果檢查結(jié)果不正確,則證明已經(jīng)不是原來安裝軟件的那臺(tái)機(jī)器,運(yùn)行的軟件不是安裝到硬盤的,是非法拷貝過來,必須終止軟件運(yùn)行,從而達(dá)到了加密軟件防止非法拷貝的目的。
在CMOS的128個(gè)字節(jié)單元中,00H-0FH字節(jié)單元中的數(shù)據(jù)隨機(jī)性太強(qiáng),不易作為密鑰。1BH~2DH,34H~3FH,40H~7FH是CMOS的保留單元。不同的BIOS版本對(duì)此保留單元設(shè)置不一樣。根據(jù)筆者的觀察,AST系列原裝機(jī)BIOS對(duì)此單元填充數(shù)據(jù)為0。COMPAQ系列原裝機(jī)和采用AWARD、AMI等BIOS的機(jī)器對(duì)此單元均填充不同的數(shù)據(jù)。2EH、2FH單元中存放的是10H~2DH單元中各字節(jié)的校驗(yàn)和。系統(tǒng)每次引導(dǎo)時(shí)要讀取CMOS信息,同時(shí)還要檢查10H~2DH單元中的各字節(jié)的校驗(yàn)和是否與2EH、2FH單元中的數(shù)據(jù)相同,不同則提示CMOS中數(shù)據(jù)有錯(cuò)。因涉及到保留單元,不建議作為密鑰。30H~33H單元內(nèi)容無法區(qū)分不同配置的機(jī)器,可以不用考慮。
只有CMOS的10H~2DH單元中內(nèi)容涉及到軟盤、硬盤、內(nèi)存、顯示卡等最基本的硬件配置。實(shí)際應(yīng)用中軟、硬件配置完全相同的機(jī)器幾乎是不存在的,所以可以采用CMOS中的內(nèi)容作為密鑰進(jìn)行檢查,完全可以做到加密軟件,防止對(duì)軟件的非法拷貝。
三、實(shí)現(xiàn)方法
在計(jì)算機(jī)系統(tǒng)中,對(duì)CMOS中數(shù)據(jù)的讀寫是通過兩個(gè)I/O端口來實(shí)現(xiàn)的,其中,端口70H是一個(gè)字節(jié)的只寫端口,用它來設(shè)置CMOS中的數(shù)據(jù)地址;而端口71H是用來讀寫端口70H設(shè)置的CMOS地址中的數(shù)據(jù)單元字節(jié)內(nèi)容。所以在讀寫CMOS數(shù)據(jù)時(shí),可以通過70H端口寫入一個(gè)地址值,再通過71H端口讀出一個(gè)數(shù)據(jù),對(duì)軟件的加密就是通過這個(gè)來實(shí)現(xiàn)的。
在利用CMOS加密軟件的過程中,一般需要編制兩段程序:一段程序的功能為在安裝程序中保存CMOS內(nèi)容作為密鑰;另一段程序的功能為在軟件主程序中檢測(cè)密鑰是否存在及正確,在每次運(yùn)行該軟件時(shí)都調(diào)用此段程序。
本文采用的密鑰檢查方法是“校驗(yàn)和法”。所謂校驗(yàn)和法是指先對(duì)全部信息或部分信息計(jì)算出一個(gè)累加和,作為密鑰存放在安裝盤上。當(dāng)軟件運(yùn)行時(shí)對(duì)所檢查信息部分再計(jì)算一個(gè)累加和,兩者進(jìn)行比較,一致時(shí)才能正確執(zhí)行。一旦發(fā)現(xiàn)不一致,則可作一些處理,終止軟件運(yùn)行。因?yàn)橐慌_(tái)機(jī)器配置改變,校驗(yàn)和必然發(fā)生變化。
程序1:將CMOS中10H~2DH單元中的數(shù)據(jù)的校驗(yàn)和作為密鑰寫入到安裝軟盤上的某個(gè)文件中。使用時(shí)將此段程序嵌入到軟件的安裝程序中。
/*JM1.C*/
#include"stdio.h"
main()
{
unsigned int i ,csum=0;
FILE *fp;
for (i=0x10;i〈=0x2d;i++)/*求得安裝程序機(jī)器的CMOS中校驗(yàn)和*/
{
outportb(0x70,i);
csum+=inportb(0x71);
}
if ((fp=fopen("A:\MIMA.DAT","wb"))==NULL)/*打開密鑰文件*/
{printf ("請(qǐng)打開寫保護(hù)\07");
exit (0);
}
fwrite (&csum,2,1,fp);
fclose(fp);
}
運(yùn)行結(jié)果:在A盤上產(chǎn)生一個(gè)名為MIMA.DAT的文件,該文件記錄了程序安裝時(shí)產(chǎn)生的密鑰。
程序2:檢查當(dāng)前機(jī)器CMOS中10H~2DH單元中的校驗(yàn)和與保存在安裝軟盤上的密鑰是否相同。使用時(shí)將此段程序嵌入到軟件的主程序中。
/*JM2.C*/
#include"stdio.h"
main()
{
unsigned int i,csum=0;
unsigned int fsum;
FILE *fp;
for(i=0x10;i〈=0x2d;i++)
{
outportb(0x70,i);
csum+=inportb(0x71);/*求得運(yùn)行程序機(jī)器的CMOS中的校驗(yàn)和*/
}
if((fp=fopen("A:\MIMA.DAT","rb"))==NULL)
{printf("請(qǐng)插入鑰匙盤");
exit(0);/*安裝盤不存在,終止程序運(yùn)行*/
}
fread(&fsum,2,1,fp);
if (fsum!=csum)/*把當(dāng)前機(jī)器CMOS中校驗(yàn)和與密鑰進(jìn)行比較*/
{printf ("您不是合法用戶,請(qǐng)您購(gòu)買正版軟件!\07");
exit(0);/*終止程序的運(yùn)行,可進(jìn)一步做處理*/
}
else
{printf ("您是合法用戶,歡迎使用!");
}
fclose(fp);/*繼續(xù)運(yùn)行主程序*/
}
運(yùn)行結(jié)果:如果軟件是通過安裝程序安裝到機(jī)器上的,則提示“您是合法用戶,歡迎使用!”,繼續(xù)運(yùn)行程序;如果軟件是通過非法拷貝到機(jī)器上的,則警鈴提示“您不是合法用戶,請(qǐng)您購(gòu)買正版軟件!”,并終止該程序的運(yùn)行。
(其中JM1.C、JM2.C是用TUBRO C V2.0編寫,鏈接生成EXE文件,在UCDOS 6.0下調(diào)試通過。)
四、結(jié)束語
最后需要說明的是,利用CMOS進(jìn)行軟件加密的實(shí)現(xiàn)方法不同,在實(shí)際應(yīng)用中要根據(jù)具體情況來決定簡(jiǎn)單與復(fù)雜。通??煽紤]以下幾個(gè)方面的因素:
1. CMOS密鑰的難易程度。檢查的CMOS數(shù)據(jù)越多,對(duì)機(jī)器的軟、硬件配置檢查越嚴(yán)格。
2.CMOS密鑰檢查方法。如果能做到逐個(gè)字節(jié)的檢查最為準(zhǔn)確。
3.~CMOS密鑰保存方法。如果以文件的形式存放在磁盤上可能容易被發(fā)現(xiàn)破解,可考慮保存到軟盤的隱含扇區(qū),如引導(dǎo)扇區(qū)、目錄區(qū)、文件分配表區(qū)等;或者保存到硬盤的隱含扇區(qū),如主引導(dǎo)記錄、分區(qū)表等,同時(shí)也就需要每次啟動(dòng)時(shí)讀安裝盤;或者保存到CMOS的保留單元中。這些方法都可以增加CMOS密鑰的破譯難度,提高軟件加密的可靠性。
4.結(jié)合在安裝盤上做指紋技術(shù),利用INT13H格式化出額外磁道和特殊扇區(qū),將CMOS密鑰保存到額外磁道的特殊扇區(qū)中,可以大大地增強(qiáng)安裝盤的防拷貝能力,進(jìn)一步對(duì)軟件加密。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -