轉(zhuǎn)載Win32位程序設(shè)計(jì)初步之系統(tǒng)安全_第1頁(yè)
轉(zhuǎn)載Win32位程序設(shè)計(jì)初步之系統(tǒng)安全_第2頁(yè)
轉(zhuǎn)載Win32位程序設(shè)計(jì)初步之系統(tǒng)安全_第3頁(yè)
轉(zhuǎn)載Win32位程序設(shè)計(jì)初步之系統(tǒng)安全_第4頁(yè)
轉(zhuǎn)載Win32位程序設(shè)計(jì)初步之系統(tǒng)安全_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.轉(zhuǎn)載 Win32位程序設(shè)計(jì)初步之系統(tǒng)安全轉(zhuǎn)載:Win32位程序設(shè)計(jì)初步之系統(tǒng)安全2010-03-31 17:32選擇自CanvasHat的Blog Windows NT最迷人的部分之一是它的安全系統(tǒng)。如果你對(duì)安全方面不太關(guān)心,你可以完全忽略這部分的Win32 API。然而,在不少情況下,NT內(nèi)置的安全特性可以幫助解決一些很有趣的問(wèn)題。在這篇文章中,你將會(huì)理解到NT安全系統(tǒng)的意圖,這些概念將會(huì)幫助你懂得它的用處,以及操作它的技術(shù)。要注意的是,本文后的一些代碼,要用管理員的身份登錄才能夠運(yùn)行。只有管理員才擁有執(zhí)行這里討論的某些系統(tǒng)安全任務(wù)的權(quán)限。NT安全性可以做到的事情在大多數(shù)的人看來(lái),NT是一

2、個(gè)頗為完整和復(fù)雜的安全系統(tǒng)。經(jīng)驗(yàn)豐富的UNIX程序員對(duì)UNIX操作系統(tǒng)的文件安全系統(tǒng)很熟悉,并且了解root權(quán)限的含義。不過(guò)這些系統(tǒng)與NT的相比都是較為簡(jiǎn)單的。接下來(lái)的例子將讓你對(duì)NT的安全系統(tǒng)有所了解。由文件管理器的安全菜單和安全編輯器中,我們可以看到NT中內(nèi)置的安全特性。你可以寫自己的代碼來(lái)修改NT文件系統(tǒng)卷上的安全信息,而且可以做到與它一樣詳細(xì)。在你寫的程序中,你可以控制誰(shuí)有某種類型的權(quán)限來(lái)訪問(wèn)NTFS卷上的文件,就象文件管理器的工作一樣。.你可以在系統(tǒng)上創(chuàng)建一個(gè)命名管道,該管道只有其它系統(tǒng)上的管理員能夠訪問(wèn)。當(dāng)用戶嘗試著與服務(wù)器進(jìn)行連接時(shí),安全系統(tǒng)將進(jìn)行檢查,以確保只有擁有相應(yīng)訪問(wèn)權(quán)限

3、的用戶才能訪問(wèn),而拒絕沒(méi)有管理員權(quán)限的用戶。你可通過(guò)這種方法來(lái)讓不同機(jī)器上的管理員能相互溝通,同時(shí)又確保安全性。你可以寫代碼來(lái)選擇允許訪問(wèn)或者拒絕訪問(wèn)的用戶或用戶組。.你可以創(chuàng)建一個(gè)帶安全標(biāo)記的mutex,只允許某些用戶或組來(lái)訪問(wèn)它。這個(gè)處理可以應(yīng)用在系統(tǒng)中的任何對(duì)象上:包括有文件、semaphores、線程、事件、文件映射中的共享內(nèi)存等。對(duì)于mutex,你可以使用這個(gè)處理來(lái)防止對(duì)一個(gè)應(yīng)用的同步機(jī)制的非法訪問(wèn);.你可以在某個(gè)對(duì)象(例如一個(gè)線程、mutex、管道、文件或注冊(cè)鍵)被訪問(wèn)時(shí),在事件日志中創(chuàng)建一個(gè)項(xiàng)目。你能指定訪問(wèn)的類型和用戶,并且產(chǎn)生一個(gè)事件日志項(xiàng)目。例如,對(duì)于某個(gè)文件,你可以設(shè)置為

4、在用戶smith成功讀取該文件時(shí),產(chǎn)生一個(gè)事件日志項(xiàng)目。由上面的例子中,我們可以知道NT可讓你對(duì)系統(tǒng)中的對(duì)象設(shè)置精確的安全訪問(wèn)權(quán)限,并且允許你監(jiān)視和記錄對(duì)象是怎么使用的。NT安全系統(tǒng)的術(shù)語(yǔ)和概念NT安全系統(tǒng)有大量的新概念以及描述這些概念的詞匯,這里將把這些概念用簡(jiǎn)單的詞語(yǔ)表述,以便于你理解。你對(duì)安全系統(tǒng)中最常見(jiàn)的部分應(yīng)該很熟悉了:這就是密碼。你可以將密碼系統(tǒng)看成是一棟建筑物前門的鎖。密碼系統(tǒng)的作用就象一把鎖把建筑物內(nèi)外的事物隔離開(kāi)來(lái)。你的密碼就相當(dāng)于開(kāi)門的鑰匙,讓你進(jìn)入NT系統(tǒng)。如果你的硬盤是用NT的文件系統(tǒng)格式化的話,你知道NT的安全系統(tǒng)還有第二層。你可以將這一層看成是建筑物里面的各個(gè)房間的

5、鎖。某些房間是打開(kāi)的,任何人都可以進(jìn)去,但一些是上了鎖的。每個(gè)房間的鎖都是有點(diǎn)不同的。例如,在使用NT文件格式化的卷中,如果你在上面創(chuàng)建了一個(gè)文件,你就可以為它設(shè)置多種不同的訪問(wèn)權(quán)限:.只有文件的擁有者才能訪問(wèn)它.只有某個(gè)用戶才能訪問(wèn)它.某些用戶可以訪問(wèn)它.你可以設(shè)定為某個(gè)組的成員才能訪問(wèn)它.你可以設(shè)定為某個(gè)組的成員才能訪問(wèn)它,同時(shí)又拒絕該組中的某些用戶對(duì)它的訪問(wèn).可以設(shè)置為多個(gè)組的成員均可訪問(wèn)它.任何人都可以訪問(wèn)可將每個(gè)受保護(hù)的文件看成是一個(gè)房間。你對(duì)文件的安全設(shè)置就象是房間的一把鎖,用來(lái)決定誰(shuí)允許進(jìn)入房間。你還可以控制當(dāng)一個(gè)人進(jìn)入房間時(shí),可允許他做的事情。例如,對(duì)于一個(gè)文件,你可以給一個(gè)用

6、戶讀的權(quán)限,給另一個(gè)用戶寫的權(quán)限等。打開(kāi)文件管理器的安全菜單,看一下其中的權(quán)限對(duì)話框,你可以嘗試做不同的設(shè)置。NT就象一個(gè)有著很多房間的建筑物。你的密碼就相當(dāng)于一把鑰匙,讓你進(jìn)入到建筑物中。一旦就入了建筑物,你就可以使用自己的鑰匙來(lái)進(jìn)入不同的房間。一些房間是沒(méi)有上鎖的,有一些是上鎖的,但你可以進(jìn)去,另外有一些是拒絕你進(jìn)入的。房間就相當(dāng)與NT系統(tǒng)中的各個(gè)對(duì)象:文件,注冊(cè)子鍵,線程和mutex對(duì)象等。你還可以在房間的門口加入一個(gè)崗哨,崗哨的任務(wù)是監(jiān)視誰(shuí)使用房間,并且他是怎樣使用的。這在NT中稱為審核。當(dāng)你在一個(gè)NT對(duì)象上加入一個(gè)審核時(shí),當(dāng)某些用戶以某種方式來(lái)訪問(wèn)該對(duì)象時(shí),該對(duì)象就會(huì)在事件日志中寫入

7、相關(guān)的項(xiàng)目。例如,如果你可以訪問(wèn)一個(gè)NT文件系統(tǒng)卷,并且有管理的權(quán)限,打開(kāi)文件管理器并且選擇一個(gè)你擁有的文件,然后在安全菜單中選擇審核的選項(xiàng)。對(duì)于每個(gè)獨(dú)立的用戶或者組,你都可以設(shè)置什么時(shí)候進(jìn)行審核,可以是在他們成功(或者失敗,或者兩者均是)打開(kāi)文件、寫入文件、執(zhí)行文件等時(shí)候。要了解這些安全特性,最方便的是在NT的文件系統(tǒng)中。通過(guò)文件管理器中的安全編輯器,你能夠以圖形化和簡(jiǎn)便的形式為文件設(shè)置各種不同的安全特性。這些安全細(xì)節(jié)的劃分對(duì)于NT中的許多對(duì)象都是適用的。例如,你可以用同樣的方式保護(hù)注冊(cè)表中的項(xiàng)目,實(shí)際上,注冊(cè)表編輯器包含有與文件管理器相似的可視化安全編輯器。你還可以為許多內(nèi)部的系統(tǒng)對(duì)象設(shè)置

8、安全屬性。例如,你可以用這種方式來(lái)限制對(duì)一個(gè)命名管道的訪問(wèn)。以下就是上面所討論的概念的簡(jiǎn)要總結(jié):.一個(gè)NT系統(tǒng)就象一棟建筑物。你的密碼就相當(dāng)于一把鑰匙,可讓你進(jìn)入建筑物。.進(jìn)入建筑物后,你就會(huì)發(fā)現(xiàn)有成千上萬(wàn)個(gè)房間。一個(gè)文件就相當(dāng)于一個(gè)房間,注冊(cè)表項(xiàng)目、命名管道和線程等也類似。.每個(gè)房間的安全是由擁有者來(lái)設(shè)置的,可設(shè)置為只讓某個(gè)人使用、一群用戶使用、某個(gè)組或者任何人訪問(wèn);.每個(gè)房間還可以加入一個(gè)崗哨,負(fù)責(zé)檢查和記錄誰(shuí)進(jìn)入房間以及每個(gè)人進(jìn)入后做了些什么;現(xiàn)在你已經(jīng)有了一些基本的概念,以下再談一下NT在安全方面的一些特別的術(shù)語(yǔ)。NT的安全術(shù)語(yǔ)當(dāng)你登錄入一個(gè)NT系統(tǒng)時(shí),系統(tǒng)將給你一個(gè)訪問(wèn)的記號(hào)。這個(gè)訪

9、問(wèn)記號(hào)是你用來(lái)打開(kāi)NT系統(tǒng)中的鎖的鑰匙。你的鑰匙可以打開(kāi)一些鎖,但是有一些它打不開(kāi)。你所做的每個(gè)處理都包括有一個(gè)你的訪問(wèn)標(biāo)記的副本。這個(gè)訪問(wèn)的標(biāo)記用來(lái)做兩件不同的事情。首先,它用來(lái)標(biāo)識(shí)你的身份。例如,當(dāng)你以用戶"smith"的身份登錄時(shí),你的訪問(wèn)記號(hào)就包含了該用戶的標(biāo)識(shí)。訪問(wèn)記號(hào)還用來(lái)標(biāo)識(shí)你屬于的所有組。例如,在用戶管理器中,你可能是Power User組,Backup Operator組和一個(gè)名為Programmers的自定義組的成員。你的訪問(wèn)記號(hào)就可以標(biāo)識(shí)你為這些不同組的成員。你的訪問(wèn)記號(hào)還包含該用戶的所有權(quán)限。你所屬的每個(gè)組都擁有一些相關(guān)的用戶權(quán)限。如果你打開(kāi)用戶管理

10、器,你將可以在用戶權(quán)限菜單中看到權(quán)限的列表。例如,power users用戶組擁有設(shè)置系統(tǒng)時(shí)間的權(quán)限,而普通的用戶沒(méi)有。某些用戶可以關(guān)閉系統(tǒng),某些不行。系統(tǒng)通過(guò)將你所屬每個(gè)組的所有權(quán)限組合起來(lái),得到你的權(quán)限列表,并且放在你的訪問(wèn)記號(hào)中。管理員還可以通過(guò)用戶管理器,為每個(gè)用戶分配一些特別的權(quán)限。*圖一*一個(gè)訪問(wèn)記號(hào)包括有一個(gè)用戶ID,用戶所屬的組名和由所有這些組得到的用戶權(quán)限列表。系統(tǒng)中的大部分對(duì)象都可以有自己的鎖。在NT中,一把鎖被稱為一個(gè)安全描述器。如果在某個(gè)對(duì)象的創(chuàng)建函數(shù)包含有一個(gè)安全的參數(shù),你就可以加入一把鎖。以下的對(duì)象都可以有鎖:.文件(如果它們存放在一個(gè)NT文件系統(tǒng)卷中).目錄(如果

11、它們存放在一個(gè)NT文件系統(tǒng)卷中).注冊(cè)鍵.進(jìn)程.線程.Mutexes.Semaphores.事件.命名管道(在系統(tǒng)或者網(wǎng)絡(luò)上).匿名管道(僅在系統(tǒng)中).Mailslots(僅在系統(tǒng)中).控制臺(tái)屏幕緩沖.文件映射.服務(wù).私有的對(duì)象要鎖上一個(gè)對(duì)象,你要?jiǎng)?chuàng)建一個(gè)安全描述器,并且在創(chuàng)建對(duì)象的時(shí)候?qū)⑺鼈魉徒o該對(duì)象。如果將安全屬性參數(shù)的值設(shè)置為0,則表示系統(tǒng)為該對(duì)象創(chuàng)建一個(gè)默認(rèn)的安全描述器,從而允許你訪問(wèn)該對(duì)象。一個(gè)安全描述器包含有四個(gè)方面:.一個(gè)擁有者標(biāo)識(shí)符,用來(lái)標(biāo)識(shí)該對(duì)象目前的擁有者是誰(shuí).一個(gè)主要的組標(biāo)識(shí)符.一個(gè)系統(tǒng)訪問(wèn)控制列表(SACL,system access control list),包含有

12、審核的信息.一個(gè)自由訪問(wèn)控制列表(DACL,discretionary access control list),用來(lái)決定那些用戶和組和可以訪問(wèn),那些不可以NT對(duì)象的擁有者可以隨時(shí)更改對(duì)象的安全信息。例如,如果你擁有一個(gè)文件,并且將它設(shè)置為沒(méi)有人可以訪問(wèn)它,以后,你還可以改變它的安全信息,因?yàn)槟闶撬膿碛姓摺_@就象打壞鎖進(jìn)入你的房間一樣,雖然鎖被打壞了,但是你可以換一把新鎖,因?yàn)槟闶欠块g的擁有者。*圖二*任何對(duì)象的安全描述器包含有用戶和組的ID、控制訪問(wèn)權(quán)限的自由訪問(wèn)控制列表,以及控制審核信息的系統(tǒng)訪問(wèn)控制列表。DACL是這把鎖的核心。它用來(lái)控制誰(shuí)可以訪問(wèn)、禁止誰(shuí)訪問(wèn)該對(duì)象。它是一個(gè)訪問(wèn)控制列

13、表,或者簡(jiǎn)稱為ACL,其中包含有訪問(wèn)控制項(xiàng)目(ACE)。每項(xiàng)ACE都說(shuō)明了一個(gè)用戶或者組,以及它們的權(quán)限。例如,如果對(duì)象是一個(gè)文件,用戶"smith"可允許讀取該文件,這樣就會(huì)有一個(gè)ACE指示用戶"smith"擁有讀取的權(quán)限。這也稱為一個(gè)訪問(wèn)允許ACE,因?yàn)樗试S一個(gè)用戶或者組做某件事情。同樣,還有一個(gè)訪問(wèn)拒絕ACE,用來(lái)禁止某個(gè)用戶或者組訪問(wèn)。例如,你允許Power Users組訪問(wèn)一個(gè)對(duì)象,但對(duì)于"smith"用戶,他雖然屬于power user,但你不想他可訪問(wèn)到該對(duì)象,使用一個(gè)拒絕訪問(wèn)ACE就可以了。SACL(System A

14、ccess Control List,系統(tǒng)訪問(wèn)控制列表)也包含有ACE,不過(guò)這些ACE是用來(lái)決定誰(shuí)將被審核以及審核的原因。SACL中的一個(gè)ACE被稱為一個(gè)審核訪問(wèn)ACE。例如,當(dāng)"smith"用戶成功打開(kāi)一個(gè)文件時(shí),是否要?jiǎng)?chuàng)建一個(gè)審核項(xiàng)目呢?這個(gè)是由SACL中的一個(gè)ACE項(xiàng)目指定的。*圖三*一個(gè)訪問(wèn)控制項(xiàng)目(ACE)指定一個(gè)用戶(或者組)和所允許的訪問(wèn)類似。ACE都存儲(chǔ)在ACL中。一個(gè)ACL中的每個(gè)ACD都由三部分來(lái)組成:一個(gè)安全標(biāo)識(shí)符(SID,Security Identifier),一個(gè)訪問(wèn)掩模和一個(gè)ACE頭。SID是存儲(chǔ)在注冊(cè)表中的一個(gè)值(也可通過(guò)函數(shù)調(diào)用得到),可唯

15、一標(biāo)識(shí)用戶管理器中的每個(gè)用戶或者組。ACE頭用來(lái)決定ACE的類型:訪問(wèn)控制,訪問(wèn)拒絕等。一個(gè)掩模有32位,用來(lái)決定用戶可對(duì)對(duì)象進(jìn)行的操作。有一些標(biāo)準(zhǔn)的權(quán)限應(yīng)用于系統(tǒng)中所有的對(duì)象,還有一些對(duì)象有特別的訪問(wèn)權(quán)限,可在這些對(duì)象上應(yīng)用。例如,以下就是一個(gè)文件對(duì)象可應(yīng)用的特別和標(biāo)準(zhǔn)訪問(wèn)權(quán)限:specific:FILE_READ_DATA FILE_WRITE_DATA FILE_APPEND_DATA FILE_READ_EA FILE_WRITE_EA FILE_EXECUTE FILE_READ_ATTRIBUTES FILE_WRITE_ATTRIBUTES FILE_ALL_ACCESS sta

16、ndard:DELETE READ_CONTROL STANDARD_RIGHTS_ALL STANDARD_RIGHTS_EXECUTE STANDARD_RIGHTS_READ STANDARD_RIGHTS_REQUIRED STANDARD_RIGHTS_WRITE SYNCHRONIZE WRITE_DAC WRITE_OWNER generic:GENERIC_ALL GENERIC_EXECUTE GENERIC_READ GENERIC_WRITE generic權(quán)限是預(yù)定義的標(biāo)準(zhǔn)(standard)和特定(specific)權(quán)限的混合,對(duì)于各種對(duì)象都是不同的。訪問(wèn)掩模是一個(gè)3

17、2位的位掩碼。在掩碼中,每個(gè)standard、specific和generic權(quán)限都有一個(gè)位與之相關(guān)。開(kāi)頭的16位保存的是specific的權(quán)限,并且也是該訪問(wèn)掩碼所指對(duì)象的鍵(例如,上面的FILE_ constants)。接著的8位保存的是standard權(quán)限。高4位保存generic權(quán)限。*圖四*NT的安全特性使用了不少的新術(shù)語(yǔ),不過(guò),通過(guò)例子中的代碼,你將會(huì)逐漸熟悉所有這些名詞,并且也更容易理解所有這些概念。以下就是一個(gè)簡(jiǎn)要的總結(jié):.用戶登錄后,他們將得到一個(gè)訪問(wèn)記號(hào)。一個(gè)訪問(wèn)記號(hào)包含有用戶的ID,用戶組和用戶所屬組得到的用戶權(quán)限.每個(gè)對(duì)象都擁有一個(gè)安全描述器,就象它的鎖一樣。一個(gè)安全描

18、述器包含有一個(gè)用戶和組標(biāo)識(shí)符,一個(gè)系統(tǒng)ACL和一個(gè)Discretionary ACL。.一個(gè)DACL控制誰(shuí)允許訪問(wèn)及可以對(duì)對(duì)象做什么操作.一個(gè)SACL控制要審核誰(shuí)對(duì)一個(gè)對(duì)象的某種處理.ACL由ACE組成。每個(gè)ACE包含有一個(gè)SID,用來(lái)標(biāo)識(shí)用戶或者組,一個(gè)訪問(wèn)掩模,用來(lái)決定允許用戶或者組做何種處理,還有一個(gè)ACE頭,決定ACD的類型。以下的部分提供了兩個(gè)簡(jiǎn)單的例子,將所有這些術(shù)語(yǔ)組合在一起,并且展示了這些安全設(shè)置是如何運(yùn)作的。簡(jiǎn)單的例子這部分的重點(diǎn)是談一個(gè)文件對(duì)象的安全描述器的創(chuàng)建和應(yīng)用。這里選擇了文件對(duì)象作例子的原因是由于它是常見(jiàn)的而且易于理解,你也可以通過(guò)文件管理器中的安全編輯器很容易地查

19、看代碼的運(yùn)行結(jié)果。不過(guò),如果你的硬盤并不是使用NT的文件系統(tǒng)來(lái)格式化的話,這些代碼將是沒(méi)有用處的,而且安全編輯器也是不可用的。你可以采用以下三種方式來(lái)處理:1。重新使用NTFS來(lái)格式化硬盤,并且重新安裝NT,或者使用convert命令來(lái)將你的硬盤轉(zhuǎn)換為NT的文件系統(tǒng);2。裝入一個(gè)新的硬盤,并且使用NT的文件系統(tǒng)來(lái)格式化3。在你的硬盤中分出一小部分(大概10M),并且使用NTFS來(lái)格式化,這意味著你將必須重新格式化和重裝原有的分區(qū)或者,你可以先等一下,我們還會(huì)將同樣的代碼應(yīng)用到一個(gè)注冊(cè)鍵中。無(wú)論你使用的是哪種文件系統(tǒng),你將可以在注冊(cè)表編輯器中看到安全編輯器。以下的代碼包含了一個(gè)創(chuàng)建新文件的程序。

20、為新文件創(chuàng)建的安全描述器設(shè)置為只有"guest"的用戶才可以使用這個(gè)文件,而且該用戶只有讀的權(quán)限。這個(gè)程序沒(méi)有任何的錯(cuò)誤檢測(cè),因此你很容易看出其中的要點(diǎn)。當(dāng)你運(yùn)行代碼的時(shí)候,它將會(huì)在c:創(chuàng)建一個(gè)testfile的文件。在文件管理器中選擇該文件,然后選擇安全菜單中權(quán)限選項(xiàng)。你將會(huì)看到列表中只有一個(gè)項(xiàng)目:只有"guest"可以讀取該文件。在你運(yùn)行這些代碼時(shí),你可以任意改變文件名或者用戶的名字。#include#include SECURITY_ATTRIBUTES sa;SECURITY_DESCRIPTOR sd;BYTE aclBuffer1024;PA

21、CL pacl=(PACL)&aclBuffer;BYTE sidBuffer100;PSID psid=(PSID)&sidBuffer;DWORD sidBufferSize=100;char domainBuffer80;DWORD domainBufferSize=80;SID_NAME_USE snu;HANDLE file;void main(void)InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);InitializeAcl(pacl,1024,ACL_REVISION);Loo

22、kupAccountName(0,"guest",psid,&sidBufferSize,domainBuffer,&domainBufferSize,&snu);AddAccessAllowedAce(pacl,ACL_REVISION,GENERIC_READ,psid);SetSecurityDescriptorDacl(&sd,TRUE,pacl,FALSE);sa.nLength=sizeof(SECURITY_ATTRIBUTES);sa.bInheritHandle=FALSE;sa.lpSecurityDescriptor=&

23、amp;sd;file=CreateFile("c:testfile",GENERIC_READ|GENERIC_WRITE,0,&sa,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,0);CloseHandle(file);首先看看程序的末尾,你將會(huì)發(fā)現(xiàn)一個(gè)對(duì)CreateFile的調(diào)用,該調(diào)用創(chuàng)建了一個(gè)名字為c:testfile的文件。不過(guò),這個(gè)調(diào)用擁有一個(gè)安全的參數(shù),它位于參數(shù)列表的第4位。你可能在不少的NT代碼中看到這個(gè)參數(shù)通常為0。0值讓操作系統(tǒng)在創(chuàng)建對(duì)象的時(shí)候,使用一個(gè)默認(rèn)的安全描述器。0值還會(huì)禁止繼承。上面的代碼使用一個(gè)SECURIT

24、Y_ATTRIBUTES來(lái)代替,其中包含有一個(gè)有效的安全描述器。安全描述器首先在第一行通過(guò)調(diào)用InitializeSecurityDescriptor函數(shù)創(chuàng)建。(對(duì)于本文用到的函數(shù),可見(jiàn)SDK中的Win32幫助文件或者Visual C+的幫助文件得到更多的信息)。這步使用絕對(duì)(absolute)的格式創(chuàng)建一個(gè)安全描述器(還有第二種稱為自相關(guān)的格式)。新的安全描述器在初始化時(shí)除了修改級(jí)別的信息外,沒(méi)有其它的信息:沒(méi)有擁有者的標(biāo)識(shí)符,沒(méi)有組的定義,沒(méi)有SACL,也沒(méi)有DACL。下一行調(diào)用InitializeAcl來(lái)創(chuàng)建ACL,它將成為該安全描述器的DACL。當(dāng)InitializeAcl函數(shù)返回時(shí),

25、pacl指向一個(gè)空的ACL。這就是說(shuō),ADL中沒(méi)有ACE。如果你注釋掉下面的兩行,這個(gè)空的ACL就會(huì)被放到安全描述器中,并且這個(gè)安全描述器會(huì)應(yīng)用到文件,這時(shí)就沒(méi)有人可以訪問(wèn)到這個(gè)文件。這是因?yàn)閐iscretionary ACL中沒(méi)有任何的ACE。如果你不創(chuàng)建DACL,并且在DACL安全步驟中傳入一個(gè)NULL,這樣所有人都可以訪問(wèn)到該文件。接著的兩行創(chuàng)建一個(gè)ACE,并且將它加入到ACL中。對(duì)于指定的帳號(hào)名,LookupAccountName函數(shù)返回一個(gè)SID。LookupAccountName函數(shù)將在系統(tǒng)或者本地系統(tǒng)中查找特定的帳號(hào)。如果在本地找不到,它將會(huì)在域控制器或者信任的域控制器中找。該函

26、數(shù)返回帳號(hào)的SID,如果SID是由域控制器得到的,它還會(huì)返回一個(gè)域名,以及一個(gè)枚舉值,該值用來(lái)指示帳號(hào)的類型:SidTypeUser SidTypeGroup SidTypeDomain SidTypeAlias SidTypeWellKnownGroup SidTypeDeletedAccount SidTypeInvalid SidTypeUnknown SID是一個(gè)安全標(biāo)識(shí)符,它唯一標(biāo)識(shí)系統(tǒng)中的一個(gè)用戶或者一個(gè)組。由LookupAccountName函數(shù)返回的SID被用在一個(gè)對(duì)AddAccessAllowedAce函數(shù)的調(diào)用中,該函數(shù)用來(lái)創(chuàng)建一個(gè)訪問(wèn)允許(與訪問(wèn)拒絕相對(duì))ACE,并且將它

27、加入到當(dāng)前為空的ACL中。AddAccessAllowedAce函數(shù)創(chuàng)建該SID的ACE和指定的訪問(wèn)掩模,并且將它加入到指定的ACL中。GENERIC_READ訪問(wèn)掩模為文件加入讀權(quán)限。現(xiàn)在ACL中包含了一個(gè)ACE,并且指定了"guest"用戶可以讀取該文件。這個(gè)ACL需要使用SetSecurityDescriptorDacl函數(shù)來(lái)放入到安全描述器的Discretionary ACL中。現(xiàn)在安全描述器中包含了一個(gè)有效的DACL,其中有一個(gè)ACE。程序?qū)⑦@個(gè)安全描述器放到一個(gè)安全屬性結(jié)構(gòu)體中,并且將它傳送給CreateFile函數(shù)。如果你將前面的三行代碼注釋掉,并且在調(diào)用Se

28、tSecurityDescriptorDacl時(shí),將DACL的pacl用NULL代替,這時(shí)任何人都可以訪問(wèn)該文件。沒(méi)有DACL意味著任何人可以訪問(wèn)該文件。編譯并運(yùn)行以上的代碼。在你運(yùn)行前,你要確保程序中指定的文件名在系統(tǒng)中并不存在。通過(guò)文件管理器的安全編輯器查看該新文件時(shí),你將會(huì)發(fā)現(xiàn)它的權(quán)限與代碼中設(shè)置得一樣。你可以很容易地修改這些代碼,以加深對(duì)安全描述器的了解。例如,你可以嘗試給某個(gè)組寫的權(quán)限,或者給DACL加入幾個(gè)ACE,或者使用AddAccessDeniedAce創(chuàng)建一個(gè)訪問(wèn)拒絕ACE。要確保訪問(wèn)拒絕ACE放在訪問(wèn)允許ACE的前面。使用SetSecurityDescriptorOwner

29、函數(shù)來(lái)修改安全描述器中的擁有者。另一個(gè)例子同樣的安全描述器代碼可以應(yīng)用到其它受保護(hù)的NT對(duì)象上,因?yàn)榘踩到y(tǒng)對(duì)于所有的對(duì)象都是一樣的。例如,你可以使用它來(lái)創(chuàng)建注冊(cè)表中的一個(gè)鍵值,具體見(jiàn)下面的代碼。如果你將下面的代碼和上面的作對(duì)比,你將會(huì)發(fā)現(xiàn)它們幾乎是完全一樣了,除了這里是用RegCreateKeyEx來(lái)創(chuàng)建一個(gè)注冊(cè)表鍵而不是一個(gè)文件。#include#include SECURITY_ATTRIBUTES sa;SECURITY_DESCRIPTOR sd;BYTE aclBuffer1024;PACL pacl=(PACL)&aclBuffer;BYTE sidBuffer100;PSID psid=(PSID)&sidBuffer;DWORD sidBufferSize=100;char domainBuffer80;DWORD domainBufferSize=80;SID_NAME_USE snu;LONG result;HKEY regKey;DWORD disposition;void

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論