• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      Windows系統(tǒng)下Rootkit的隱藏與檢測

      2010-03-23 08:08:45
      通化師范學院學報 2010年4期
      關鍵詞:注冊表線程調(diào)用

      徐 睿

      (上海交通大學 軟件學院,上海 200240)

      1 Windows rootkit概述

      Rootkit是計算機安全領域的一個術語,來自root和kit兩個單詞的組合,其中root是Unix系統(tǒng)中超級用戶的名稱,擁有系統(tǒng)的最高權限;kit則是工具套件的意思.而Rootkit具體是指其主要功能為隱藏其他程式進程的軟件,是能夠持久或可靠地、無法檢測地存在于計算機上的一組程序和代碼.黑客通過修改系統(tǒng)程序,把這些系統(tǒng)程序變?yōu)楹箝T程序.從而使得攻擊者能夠保持訪問計算機上具有最高權限的用戶“root”.Rootkit一般都和木馬、后門等其他惡意程序結合使用.

      Rootkit功能和被植入操作系統(tǒng)的木馬相似,根據(jù)Windows系統(tǒng)下程序運行模式的不同,可以將Windows下的Rootkit分為應用程序級Rootkit,內(nèi)核級Rootkit兩類.

      Rootkit的攻擊過程主要包括:①收集目標系統(tǒng)信息.攻擊者在攻擊某個系統(tǒng)之前,需要知道目標系統(tǒng)有哪些漏洞,使用什么操作系統(tǒng),有哪些帳號等.②獲得管理員等級的用戶的訪問權限.在得到目標系統(tǒng)足夠的信息后,攻擊者便開始利用其漏洞發(fā)起進攻.比較常見的是先獲得普通用戶訪問權限,然后再利用目標系統(tǒng)的本地漏洞提高到超級用戶訪問權限.還有一種方式是直接利用ftp和telnet等網(wǎng)絡服務的漏洞獲得超級用戶訪問權限.③在目標操作系統(tǒng)上安裝Rootkit.獲得超級用戶訪問權限后,攻擊者就可以在目標系統(tǒng)上安裝Rootkit,來隱藏攻擊行為,創(chuàng)建各種后門.④控制目標系統(tǒng).在目標系統(tǒng)上安裝Rootkit后,就可以持久的控制目標系統(tǒng),對其進行各種攻擊,而且不被目標系統(tǒng)的管理員察覺.例如:利用目標系統(tǒng)攻擊其它系統(tǒng),使目標系統(tǒng)拒絕提供某些服務等等.

      2 Windows Rootkit隱藏技術

      Rootkit隱藏的實現(xiàn)過程主要有:(1)用戶態(tài)下的API Hook.在用戶態(tài),一種常用的隱藏方法就是修改PE文件的IAT(Import Address Table)來實現(xiàn).IAT中記錄了該文件運行時需要調(diào)用的所有函數(shù)鏈接庫.PE文件運行時會將自己和IAT中記錄的鏈接庫都加載到內(nèi)存,然后在當前進程空間的地址間建立庫函數(shù)符號名和相應代碼的映射,以后就通過IAT來調(diào)用這些函數(shù).Rootkit采取的手段是在進程加載時修改IAT,將Hook的API函數(shù)地址改為Rootkit代碼的地址.這樣,進程每次調(diào)用此函數(shù)時,其實執(zhí)行的是Rootkit代碼.另一種方法則是將被攔截函數(shù)的前幾條代碼改成JMP跳轉(zhuǎn)指令,使程序的執(zhí)行跳轉(zhuǎn)到Rootkit代碼.Rootkit進行額外處理后,執(zhí)行事先保存下來的被改寫部分的原指令,并跳轉(zhuǎn)回原函數(shù)相應位置,這樣,在Rootkit監(jiān)視函數(shù)調(diào)用的時候,函數(shù)的原有功能依然能得到完整的調(diào)用,從而更好的隱藏了自身.

      動態(tài)庫陷阱方法則是直接用重寫的DLL文件來替換系統(tǒng)中原有的DLL,并將原DLL改名.重寫的DLL的IAT和原DLL的EAT(Export Address Table)之間存在一個一一映射.這樣在系統(tǒng)調(diào)用對應DLL的時候就會直接去調(diào)用Rootkit的相關代碼.但是在Windows的文件保護機制中,當系統(tǒng)關鍵文件被修改時,操作系統(tǒng)會自動修復受損的文件.因此使用這一機制的Rootkit會通過改寫SFCDisable注冊表項和修改Sfc.dll來終止文件保護機制.

      (2)IDT Hooks和SYSENTER Hook.在Windows 2000系統(tǒng)中,通過中斷描述符表進行系統(tǒng)調(diào)用.IDT有256個入口,每個入口說明對應的中斷處理程序的地址.Rootkit通過修改IDT的0x2e入口來攔截系統(tǒng)調(diào)用,這種方法的缺點是僅能簡單地阻止請求,不能修改返回數(shù)據(jù).Intel x86平臺上的Windows XP系統(tǒng)用SYSENTER指令取代中斷,使系統(tǒng)陷入系統(tǒng)服務調(diào)用程序(AMD平臺上的Windows XP使用syscall指令實現(xiàn)相同功能),相應產(chǎn)生了新的Hook方法,即把IA32_ SYSENTER_EIP寄存器的值修改為要運行的Rootkit代碼的地址.

      (3)SSDT Hook.系統(tǒng)服務調(diào)度表(SSDT)中存放了所有系統(tǒng)服務函數(shù)的入口地址.系統(tǒng)服務調(diào)度程序通過查找SSDT來調(diào)用相應的系統(tǒng)服務.因此,Rootkit可以將SSDT中的系統(tǒng)服務地址替換為自己代碼的地址.這樣,當調(diào)用系統(tǒng)服務時,實際運行的是Rootkit代碼,由Rootkit代碼調(diào)用真正的系統(tǒng)服務并對結果作相應處理.系統(tǒng)中存在2個SSDT,位于文件ntoskrnl.exe中,分別由指針KeServiceDescriptorTable和KeServiceDescriptorTableShadow導出,對應了2類不同的系統(tǒng)服務.前者對應的系統(tǒng)服務,功能代碼在ntoskrnl.exe中實現(xiàn),用戶模式下的訪問接口由NTDLL.dll提供,通常kernel32.dll/advapi32.dll導出的API最終調(diào)用的都是這類系統(tǒng)服務;后者對應的是USER和GDI系統(tǒng)服務,訪問接口由User32.dll/Gdi32.dll提供,功能代碼在Win32k.sys中實現(xiàn).Rootkit關注的主要是對進程、文件、注冊表等的操作,對應的系統(tǒng)服務屬于第一類,需修改KeService Descriptor Table導出的SSDT.KeServiceDescriptor-Table指向一個KSERVICE_TABLE_ DESCRIPTOR結構,其中的Service TableBase指針指向真正的系統(tǒng)服務入口地址表.如要Hook某個系統(tǒng)服務,將該表中相應的代碼入口地址修改為鉤子函數(shù)的地址即可.例如,ZwQuerySystem-Information是系統(tǒng)列舉進程時需調(diào)用的系統(tǒng)服務,通過掛鉤它來實現(xiàn)進程的隱藏.

      3 Windows Rootkit檢測方法

      3.1 基于交叉視圖的檢測方法

      在操作系統(tǒng)中,用戶態(tài)下的程序最終都要切換到內(nèi)核態(tài)繼續(xù)執(zhí)行.因此無論針對用戶態(tài)的Rootkit還是內(nèi)核態(tài)的Rootkit,必須使用更加底層的方法查詢系統(tǒng)信息.這樣才能回避Rootkit的監(jiān)視,從而反過來找出系統(tǒng)中隱藏的Rootkit信息.

      基于交叉視圖的檢測方法是指:對于可能被Rootkit隱藏的信息,檢測程序進行兩次掃描檢測,第一次從高層次掃描,第二次從另外一個層次掃描,將兩次掃描的結果相比較,列舉出被Rootkit隱藏的信息.最常用的交叉視圖檢測程序分為兩個部分:用戶態(tài)部分負責第一次掃描;內(nèi)核態(tài)部分負責底層的掃描,同時將掃描的結果返回給用戶態(tài)對比輸出.

      (1)文件隱藏檢測.第一次掃描使用Kenrel32.dll的FindFirstFile和KerneI32.dll的FindNextFile函數(shù)枚舉磁盤上的文件,第二次掃描直接和磁盤驅(qū)動程序交互,讀取物理磁盤設備,得到磁盤上的文件信息,這樣就能夠跳過有可能被Rootkit掛鉤的函數(shù),發(fā)現(xiàn)隱藏文件.

      (2)注冊表隱藏檢測.第一次掃描使用Advapi32的RegEnumKey和RegEnumValue函數(shù)枚舉用戶能得到的注冊表子鍵(鍵值),第二次掃描直接和磁盤驅(qū)動交互,讀取磁盤上的注冊表備份文件,從而檢測出被Rootkit隱藏的注冊表信息.Windows系統(tǒng)中注冊表各個項在磁盤上都有備份,例如c:windowssystem32configsystem文件存儲了HKLMsystem鍵,用戶配置文件信息文件夾下的ntuser.dat文件HKU主鍵下的每一個用戶相應的注冊表項的配置信息.

      在用戶態(tài)下可以用以下的程序直接讀取磁盤扇區(qū):

      HANDLE hFile=CerateFile(“\.PhysicalDriveO,

      GENERIC_READ,F(xiàn)ILE_SHARE_READ, NULL,OPEN_EXISTING,F(xiàn)ILE_ATTRIBUTE_NORMAL, NULL);

      Char sBuffer[512];

      DWORD dwReadLength;

      ReadFile(hFile, sBuffer, 512, &dwReadLength, NULL);

      HANDLE hFile2 = CreateFile(“\.C:”, GENERIC_READ,

      FILE_SHARE_READ,NULL,OPEN_EXISTING, FILE_ATRIBUTE_NORMAL, NULL);pReadFile(hFile, sBuffer, 512, &dwReadLength, NULL);

      讀取了硬盤的分區(qū)表,就能得到磁盤上所有分區(qū)的磁盤格式;按照每個分區(qū)上文件系統(tǒng)的磁盤數(shù)據(jù)格式對磁盤上的文件進行枚舉就得到第二次掃描(注冊表或文件)的結果.

      (3)隱藏端口的檢測.對于被Rootkit隱藏的端口,用戶可以使用掃描軟件對本地主機進行一次掃描,將掃描結果和使用端口查看工具得到的結果比較,就能檢測出被Rootkit隱藏的端口,這種檢測本地開放端口的方法比較準確.

      (4)隱藏進程的檢測.Rootkit可以從多個方面對進程進行隱藏,有的修改系統(tǒng)服務表的ZwQuerySystemInfomation函數(shù);有的直接修改內(nèi)核數(shù)據(jù)鏈PsActiveProcessList的節(jié)點,例如fu_rootkit.Rootkit檢測程序檢測被隱藏的進程時,第一次掃描可以使用CreateToolhelp32Snapshot() , ProcessFirst()和ProcessNext()函數(shù)進行枚舉;第二次掃描則需要根據(jù)Windows操作系統(tǒng)的線程調(diào)度實現(xiàn).在Windows操作系統(tǒng)中,線程要想運行,必須接受操作系統(tǒng)的線程調(diào)度,接受操作系統(tǒng)的線程切換.在Windows系統(tǒng)下,線程切換是通過Ntoskrnl.Exe的SwapContext()函數(shù)實現(xiàn)的.這樣,檢測程序只需要掛鉤Ntoskrnl.exe中的SwapContext()函數(shù),就能得到正在進行切換的線程,進而得到系統(tǒng)中所有正在運行的線程.

      操作系統(tǒng)調(diào)用SwapContext()函數(shù)時,ESI指向?qū)⒈磺袚Q進來的線程的_EIHREAD結構體指針,EDI指向?qū)⒈磺袚Q出的線程的_ETHREAD結構體指針,根據(jù)ESI和EDI就能夠得到正在切換的線程的信息.可以根據(jù)_ETHREAD結構體中的ThreadsPorcess成員得到該線程所屬進程_EPROCESS結構體的指針,再由該進程的_EPROCFSS結構體ImageFileNam,就可以得到進程映像名.掛鉤SwapContext()函數(shù)的方法采用改寫SwapContext()函數(shù)前幾個字節(jié)的方法實現(xiàn).

      在Windows2000/XP下可以使用如下代碼得到SwapContext()的函數(shù)地址:

      PCHAR GetSwapAddr(){

      PCHARres = 0 ;

      NTSTATUS Status;

      PETHEREAD Thread;

      if(*NtBuildNumber<=2195)

      Status= PsLookupThreadByThreadId((PVOID)4, &Thread);

      else

      Status = PsLookupThreadByThreadId((PVOID)8, &Thread);

      if(NT_SUCCESS(Status)) {

      if(MmIsAddressValid (Tluead))

      res=(PCHAR)*PULONG(PCHAR(Therad)+0x28);

      if(MmIsAddressValid(res+8))

      res = (PCHAR)*P ULON G(res+ 8 );

      else

      res = 0 ;

      }

      return res;

      }

      將兩次掃描的結果對比,就能得到系統(tǒng)中被隱藏的進程.

      基于交叉視圖的檢測方法優(yōu)點是不論Rootkit使用了哪一層的隱蔽技術,檢測程序都能夠檢測出被隱蔽的信息;缺點是檢測程序需要使用比Rootkit更底層的檢測方法.

      3.2 基于內(nèi)存掃描的檢測方法

      無論是修改函數(shù)的執(zhí)行路徑還是修改內(nèi)核數(shù)據(jù)結構,Windows下Rootkit都通過改變內(nèi)存中的數(shù)據(jù)實現(xiàn)信息的隱藏,因此通過內(nèi)存掃描的方法就能夠檢測出Windows下的Rootkit.

      (1)代碼完整性掃描.代碼完整性掃描針對修改程序執(zhí)行的Rootkit,此類Rootkit主要功能通過修改函數(shù)人口指令、修改系統(tǒng)服務表、修改中斷服務表甚至修改驅(qū)動對象的派遣函數(shù)實現(xiàn).因此,通過檢測代碼的執(zhí)行路徑是否被修改就能判斷系統(tǒng)是否安裝了Rootkit.

      掃描方法:檢測程序讀取所有可能被Rootkit修改過的代碼,如果該代碼所在的模塊不在系統(tǒng)預定的模塊地址空間范圍中,就可以認為系統(tǒng)被安裝了Rootkit.例如:如果系統(tǒng)服務表中NtDeviceIoControl()函數(shù)指針不在Ntoskml.exe模塊的地址空間,則表示系統(tǒng)服務表已被Rootkit修改.

      (2)系統(tǒng)模塊掃描.有的 Rootkit并不修改函數(shù)的執(zhí)行路徑,而是直接修改內(nèi)核數(shù)據(jù)對象達到隱蔽進程(或者驅(qū)動)的功能,然而被隱藏的進程(或者驅(qū)動)仍然在系統(tǒng)內(nèi)存中.因此,通過掃描整個系統(tǒng)的內(nèi)存單元,就可以得到系統(tǒng)中正在運行的進程(或者驅(qū)動)信息.例如,Windows操作系統(tǒng)中系統(tǒng)代碼數(shù)據(jù)地址范圍為0x80000000-OxFFFFFFFF,這樣通過掃描這一段地址范圍內(nèi)的內(nèi)存數(shù)據(jù)就能枚舉系統(tǒng)中所有設備驅(qū).

      4 Windows下Rootkit檢測思考

      (1)操作系統(tǒng)一旦安裝了Rootkit就進入了不可信任狀態(tài),系統(tǒng)中得到的任何數(shù)據(jù)可能經(jīng)過Rootkit的修改.例如Hacker Defender通過掛鉤NtReadVirtualMemory()來防止用戶態(tài)的檢測程序讀取被掛鉤函數(shù)的前幾個字節(jié).一旦有程序讀取前幾個字節(jié),Hacker Defender立刻返回沒有修改的內(nèi)存值.

      (2)盡管檢測程序的內(nèi)核部分得到了系統(tǒng)的真實信息,但是它和用戶態(tài)的應用程序的通信也會被Rootkit監(jiān)聽到,甚至用于顯示結果的GUI函數(shù)也會被Rootkit修改.

      (3)從多個角度檢測被Rootkit隱藏的信息.例如檢測被隱藏進程時,可以使用掛鉤SwapContext()函數(shù)的方法,也可以使用讀取Csrss.exe句柄表的方法.因為Csrss.exe句柄表中也包含了系統(tǒng)中所有進程的信息.

      隨著計算機技術的發(fā)展,Rootkit及其相關的后門程序成為信息安全的嚴重威脅.由于Rootkit使用的技術也是常用的編程技術,這就使它們更難被檢測出來.下一代Rootkit將使用什么技術,暫時還難下結論,Rootkit檢測技術也必然隨著Rootkit技術的發(fā)展而發(fā)展.

      參考文獻:

      [1]周瑞麗,潘劍鋒,譚小彬,奚宏生.應用專家系統(tǒng)開發(fā)Windows惡意代碼檢測系統(tǒng)的研究[J].信息安全與通信保密,2009(09).

      [2]胡永濤,康學斌,李柏松.Windows Rootkit病毒進化與檢測[J].信息網(wǎng)絡安全,2009(09).

      [3]劉哲元,戴冠中,王曉伶.基于文件系統(tǒng)異常的內(nèi)核級Rootkit檢測[J].計算機應用研究,2009(09).

      [4]侯春明,陳斌.基于分層驅(qū)動的Windows內(nèi)核rootkit關鍵技術[J].吉首大學學報(自然科學版),2009(09)

      猜你喜歡
      注冊表線程調(diào)用
      核電項目物項調(diào)用管理的應用研究
      LabWindows/CVI下基于ActiveX技術的Excel調(diào)用
      測控技術(2018年5期)2018-12-09 09:04:46
      更上一層樓 用好注冊表編輯器
      淺談linux多線程協(xié)作
      基于系統(tǒng)調(diào)用的惡意軟件檢測技術研究
      利用RFC技術實現(xiàn)SAP系統(tǒng)接口通信
      Linux線程實現(xiàn)技術研究
      么移動中間件線程池并發(fā)機制優(yōu)化改進
      學習器揭開注冊表面紗
      移動一族(2009年3期)2009-05-12 03:14:30
      軟件不能運行,注冊表中找根源
      城市| 赤城县| 密云县| 中西区| 澜沧| 安塞县| 东兰县| 德保县| 长白| 定州市| 南汇区| 金山区| 静乐县| 岑巩县| 无极县| 新昌县| 惠州市| 台中县| 鲜城| 都匀市| 平江县| 南澳县| 汶川县| 永登县| 伊金霍洛旗| 顺平县| 阿克陶县| 巴马| 高雄县| 镇安县| 区。| 图木舒克市| 蒲城县| 河源市| 肇源县| 朝阳区| 洛隆县| 铜梁县| 太湖县| 鄂温| 柏乡县|