鉤子透明加密技術(shù)和過濾驅(qū)動(dòng)加密技術(shù)超時(shí)代視頻加密軟件系列產(chǎn)品均采用過濾驅(qū)動(dòng)透明加密技術(shù)對(duì)大文件的視頻流進(jìn)行加密,完美地解決了加密強(qiáng)度與效率之間的問題,成為視頻加密產(chǎn)品的行業(yè)標(biāo)桿。 鉤子透明加密技術(shù)早期的透明加密的技術(shù)手段大多是通過API鉤子技術(shù)進(jìn)行,其工作方式為靜態(tài)加密和重定向,基本思想為鉤子程序攔截到受保護(hù)文件的打開操作,先將已加密的文件拷貝到一個(gè)臨時(shí)目錄中,然后告訴驅(qū)動(dòng)程序把這個(gè)文件隱藏起來,然后解密這個(gè)文件,并將這個(gè)臨時(shí)文件返回給打開文件的進(jìn)程,這樣打開的就是磁盤上的一個(gè)明文文件,用戶程序可以進(jìn)行正常的處理,這里文件是進(jìn)行了整體的拷貝并解密;在文件關(guān)閉時(shí),鉤子攔截到以后,將那個(gè)明文的臨時(shí)文件加密,然后再拷貝回來覆蓋掉原文件。
簡(jiǎn)單的講,就是打開文件時(shí),將加密文件的副本拷貝到隱蔽位置,然后把這個(gè)文件解密、打開,保存時(shí)再把臨時(shí)文件加密后覆蓋原文件。這種加密實(shí)質(zhì)上是通過臨時(shí)文件來實(shí)現(xiàn)的,為了確保明文和密文之間的一致性,必須在每次用戶存盤或者系統(tǒng)自動(dòng)存盤的時(shí)候?qū)φ麄€(gè)文件進(jìn)行一次整體加密和并復(fù)制到用戶文件原來存儲(chǔ)的位置,因此效率較低,且由于在計(jì)算機(jī)上保存了完整的明文文件,只要跟蹤到臨時(shí)文件所在位置即可能泄密,此外,文件在打開和存儲(chǔ)過程中需要多次復(fù)制,效率損失很大,HookAPI的方式對(duì)于一些程序不能夠完美的支持,兼容性有待考證。
由于文件映射的存在,在應(yīng)用層進(jìn)行動(dòng)態(tài)加密比較困難,雖然原理上有一定的可行性,但是其加密效率、兼容性、可移植性、穩(wěn)定性較之于內(nèi)核層的過濾驅(qū)動(dòng)加密要差很多,好處在于開發(fā)難度較小,網(wǎng)絡(luò)操作能力強(qiáng)。
過濾驅(qū)動(dòng)透明加密技術(shù)1 驅(qū)動(dòng)技術(shù)簡(jiǎn)介過濾驅(qū)動(dòng)加密技術(shù)是基于windows的文件系統(tǒng)過濾驅(qū)動(dòng)(IFN)技術(shù),工作在Windows的內(nèi)核層。它是目前炙手可熱的一門技術(shù),其特點(diǎn)是技術(shù)門檻較高,需要深入理解windows系統(tǒng)內(nèi)核,開發(fā)過程中稍有不慎就會(huì)破壞系統(tǒng)內(nèi)核,因此核心技術(shù)僅被少數(shù)幾家實(shí)力雄厚的公司所掌握。
文件過濾驅(qū)動(dòng)是把文件作為一種設(shè)備來處理的一種虛擬驅(qū)動(dòng),WindowsNF系統(tǒng)內(nèi)核采用堆棧式可擴(kuò)展驅(qū)動(dòng)模型J,原則上可以在任何一個(gè)層次上加載自己的過濾驅(qū)動(dòng),但是加載的層次不同,開發(fā)的難度和應(yīng)用價(jià)值也不同,現(xiàn)在的技術(shù)主要還是加載在文件系統(tǒng)驅(qū)動(dòng)的上層,這樣就可以充分利用并擴(kuò)充文件系統(tǒng)的現(xiàn)有功能],該技術(shù)在病毒實(shí)時(shí)監(jiān)控與防護(hù)、數(shù)據(jù)備份與還原以及文件訪問控制等領(lǐng)域都有著非常廣泛的應(yīng)用。
過濾驅(qū)動(dòng)中幾種非常重要的概念包括驅(qū)動(dòng)對(duì)象、設(shè)備對(duì)象、設(shè)備堆棧、I/O堆棧,驅(qū)動(dòng)對(duì)象標(biāo)示驅(qū)動(dòng)程序,設(shè)備對(duì)象記錄加載的設(shè)備,一個(gè)驅(qū)動(dòng)對(duì)象可以有多個(gè)設(shè)備對(duì)象構(gòu)成設(shè)備對(duì)象鏈表,設(shè)備堆棧用于記錄所有驅(qū)動(dòng)程序的設(shè)備,I/O棧用來記錄穿越設(shè)備堆棧時(shí)的操作屬性,操作的對(duì)象為IRP(I/O Request Package),IRP包由系統(tǒng)的某個(gè)組件創(chuàng)建,類似于Windows應(yīng)用程序的“消息”概念,要處理某種數(shù)據(jù)只需要把IRP包傳送到相應(yīng)驅(qū)動(dòng)的相應(yīng)派遣函數(shù)中。
2 加密的基本思想在Windows NT內(nèi)核操作系統(tǒng)中,應(yīng)用程序的一次數(shù)據(jù)請(qǐng)求的過程如圖2所示:只有在無緩存或者FAST I/O不可用的情況下才在硬盤上讀取數(shù)據(jù),因此只用攔截IRP->F1agS為IRP_NOCACHE(表示I/O請(qǐng)求從存儲(chǔ)的媒介而不是高速緩存中讀取數(shù)據(jù))、IRP—PAGING—IO(表示此時(shí)執(zhí)行內(nèi)存頁的I/O操作)和IRP—SYNCHRONOUS—PAGING—1O(表示內(nèi)存頁需要同步更新,此標(biāo)志也是由內(nèi)存管理器使用)的數(shù)據(jù)包,對(duì)于寫數(shù)據(jù)的IRP包,在其分發(fā)例程中嵌入加密算法完成加密動(dòng)作,而對(duì)于讀數(shù)據(jù)的IRP包,在IRP包的完成例程中嵌入解密算法,對(duì)得到的數(shù)據(jù)進(jìn)行解密處理。
3 寫數(shù)據(jù)加密的實(shí)現(xiàn)在用戶寫受保護(hù)的文件時(shí),文件加解密客戶端能透明地對(duì)文件寫入的內(nèi)容進(jìn)行加密。加密文件判別模塊判別出此文件為受保護(hù)文件后,將密鑰傳遞給加解密過濾驅(qū)動(dòng),并由過濾驅(qū)動(dòng)完成寫操作。為了使過濾驅(qū)動(dòng)能夠加密對(duì)文件的寫操作,需要攔截IRP—MJ—WRITE和IRP—MJ—DEVICE—CONTROL兩種IRP。當(dāng)應(yīng)用層進(jìn)程調(diào)用API:DeviceIOControl時(shí),向系統(tǒng)發(fā)出IRP—MJ—DEVICE—CONTROL,過濾驅(qū)動(dòng)可以通過處理此IRP獲得傳遞給驅(qū)動(dòng)的加密密鑰,進(jìn)而在攔截IRP—MJ—WRITE的例程中進(jìn)行加密。
下面將分別介紹這兩個(gè)例程的實(shí)現(xiàn)。
(1)處理IRP—MJ—DEVICE—CONTROL例程。
首先獲得應(yīng)用層程序在IRP中攜帶的輸人數(shù)據(jù)其操作代碼,如果攜帶了傳遞密鑰的操作代碼,例程將存儲(chǔ)密鑰,并直接完成此IRP,否則將IRP交給底層驅(qū)動(dòng)處理。
偽代碼如下:
NTSrATUS EneryptDeviceControl(INPDEVICE—OBJECT DeviceObiect,IN PIRP Irp)
{
PVOID inputBuffer;
ULONG inputBufferLength;
Irp->loStatus.Smtus=STATUS—SUCCESS;
Irp->loStams.Information=O;
ioControlCode=irpStack->Parameters.DeviceIoContro1.IoControlCode;
inputBuffer=Irp->AssociaredIrp.SystemBuffer;
inputBufferLength=irpStack->Parameters.DeviceIoContro1.InputBufferLength;
if(ioControlCode==INPUT—KEY)
{
SetKey(inputBuffer);//將輸入的加密密鑰保存起來
IoCompleteRequest(Irp,IO—NO—INCREMENT);//完成此IRP
Return STATUS-SUCCESS;
}
//接下來將IRP繼續(xù)下發(fā)傳遞給下層的驅(qū)動(dòng)處理
……
……
}
(2)處理IRP—MJ—WRITE例程。
需要區(qū)分IRI攜帶數(shù)據(jù)的兩種方式,由MDL結(jié)構(gòu)指定或直接包含數(shù)據(jù)的指針。
其實(shí)現(xiàn)的偽代碼如下:
NTSTATUS EncryptWrite(IN PDEVICE-OBJECT DeviceObject,IN PIRP Irp)
{
……//完成初始化的工作
PIO—STACK—LOCATION irpsp=loGetCurrentIrpStackLocation(Irp);
switch(irpsp->MinorFunction)
{
case IRP—MN—N0RMAI;
{
if(Irp->MdlAddmss!=NULL)//判斷寫的數(shù)據(jù)是否是在MDL結(jié)構(gòu)中
{
產(chǎn)生一個(gè)新的MDL結(jié)構(gòu),將其指向一個(gè)加密后的數(shù)據(jù)庫,并將Irp->MdlAddress指針指向新的MDL結(jié)構(gòu)
}
else
{
buffer=Irp->UserBuffer;
Encrypt(buffer,GetKey());//加密所寫的數(shù)據(jù)
}
……//其它的必要操作
}
3.4 讀數(shù)據(jù)解密的實(shí)現(xiàn)
在用戶讀受保護(hù)的文件時(shí),文件加解密客戶端能透明地對(duì)讀出的原始內(nèi)容進(jìn)行解密。加密文件判別器判別出此文件為受保護(hù)文件后,將密鑰傳遞給加解密過濾驅(qū)動(dòng),并由過濾驅(qū)動(dòng)完成讀操作,和寫操作類似,需要攔截IRP—MJ—WRITE和IRP一MJ一DEVICE—CONTROL兩種IRP。IRP—MJ—DEVICE-CONTROl例程的用途和實(shí)現(xiàn)方式和加密時(shí)相同。過濾驅(qū)動(dòng)攔截IRP—MJ—READ的例程中進(jìn)行加密。IRP—MJ—READ例程的實(shí)現(xiàn)需要利用完成例程,在完成例程中完成加解密過程。
下面將介紹這個(gè)例程的實(shí)現(xiàn)。
NTSrATUS EncryptWrite(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
……初始化操作
KeInitializeEvent(&waitEvent,NotificationEvent,FALSE);
IoCopyCurrentIrpStackLocationToNext(Irp);
loSetCompletionRoutine(IrP,EncryptReadCompletion,&waitEvent,TRUE,TRUE,TRUE);//設(shè)置完成例程
status=IoCallDriver(devExt->AttachedToDeviceObject,Irp);
if(STATUS—PENDING==status)
{
status=KeWaitForSingleObject(&waitEvent,Executive,KernelMode,F(xiàn)ALSE,NULL);//等待完成例程發(fā)出的解密完成消息
}
IoCompleteRequest(Irp,IO-NO—INCREMENT);
ReturnSTATUS—SUCCESS
}
代碼中首先初始化一個(gè)消息事件,將消息事件作為參數(shù)傳遞給完成例程,接著調(diào)用底層驅(qū)動(dòng)獲得讀出的數(shù)據(jù),IRP返回后系統(tǒng)將啟動(dòng)一個(gè)新的線程來執(zhí)行完成例程。
主線程等待消息事件,同時(shí)完成例程執(zhí)行數(shù)據(jù)的解密操作,解密完成后完成例程發(fā)送消息事件,這樣主線程被喚醒并正常返回。
完成例程的偽代碼如下:
NTSTATUS SfReadCompletion(IN PDEVICE—OBJECT DeviceObject,IN PIRP Irp,IN PVOID Context)
{
PKEVENT event=Context;
ASSERT(IS—MY—DEVICE—OBJECT(DeviceObject));
……//完成初始化的工作
PIO—TSACK—LOCATION irpsp=IoGetCurrentIrpStackLocation(Irp);
switch(irpsp->MinorFunction)
{
case IRP—MN—NORMAL;
{
if(Irp->MdlAddress!=NULL)//判斷讀的數(shù)據(jù)是否是在MDL結(jié)構(gòu)中
}
產(chǎn)生一個(gè)新的MDL結(jié)構(gòu),將其指向一個(gè)解密后的數(shù)據(jù)塊,并將Irp->MdlAddress指針指向新的MDL結(jié)構(gòu),從而返回被解密的數(shù)據(jù)
}
else
{
buffer=Irp->UserBuffer;
Decrypt(buffre,GetKey());//解密文件
}
……//其它的必要操作
KeSetEvnet(event,IO—NO—INCREMENT,F(xiàn)ALSE);//向主例程發(fā)送完成解密的消息
return STATUS_MORE_PROCESSING_ERQUIERD;
}
網(wǎng)站標(biāo)簽:網(wǎng)絡(luò)視頻加密 iphone視頻加密
|
|