rootkit ring3進(jìn)ring0之門系列[二] -- 中斷門_第1頁
rootkit ring3進(jìn)ring0之門系列[二] -- 中斷門_第2頁
rootkit ring3進(jìn)ring0之門系列[二] -- 中斷門_第3頁
rootkit ring3進(jìn)ring0之門系列[二] -- 中斷門_第4頁
rootkit ring3進(jìn)ring0之門系列[二] -- 中斷門_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、標(biāo) 題:【原創(chuàng)】rootkit ring3進(jìn)ring0之門系列二 - 中斷門作 者:combojiang時(shí) 間:2008-04-01,16:31:08鏈 接:接上篇續(xù),我們繼續(xù)談?wù)?86保護(hù)模式中的門,今天一起學(xué)習(xí)下中斷門。386實(shí)模式下的中斷和異常的轉(zhuǎn)移方法與8086相同。這里介紹的中斷和異常的轉(zhuǎn)移方法是指80386在保護(hù)模式下響應(yīng)中斷和處理異常時(shí)所采用的轉(zhuǎn)移方法。1.中斷描述符表IDT象全局描述符表GDT一樣,在整個(gè)系統(tǒng)中,中斷描述符表IDT只有一個(gè)。中斷描述符表寄存器IDTR指示IDT在內(nèi)存中的位置。由于80386只識(shí)別256個(gè)中斷向量號(hào),所以IDT最大長度是2K。中斷描述符表IDT所含

2、的描述符只能是中斷門、陷阱門和任務(wù)門。也就是說,在保護(hù)模式下,80386只有通過中斷門、陷阱門或任務(wù)門才能轉(zhuǎn)移到對(duì)應(yīng)的中斷或異常處理程序。我們直觀的看看IDT的內(nèi)存位置,在本機(jī)IDT:8003f400lkd!pcrKPCRforProcessor0atffdff000:Major1Minor1NtTib.ExceptionList:b2c3fc7cNtTib.StackBase:b2c3fdf0NtTib.StackLimit:b2c3c000NtTib.SubSystemTib:00000000NtTib.Version:00000000NtTib.UserPointer:00000000N

3、tTib.SelfTib:7ffde000SelfPcr:ffdff000Prcb:ffdff120Irql:00000000IRR:00000000IDR:ffffffffInterruptMode:00000000IDT:8003f400GDT:8003f000TSS:80042000CurrentThread:873dd1e8NextThread:00000000IdleThread:80552d20前面我們講過80386只識(shí)別256個(gè)中斷向量號(hào),每個(gè)中斷向量號(hào)占8個(gè)字節(jié),對(duì)應(yīng)著一個(gè)描述符。因此,中斷描述表IDT共占256*8=2048字節(jié)。下面是中斷描述符的結(jié)構(gòu)。在IDT中,并不是這2

4、56個(gè)中斷向量都被系統(tǒng)占用了,系統(tǒng)緊緊占用了一小部分,大部分是空閑的,因此用戶可以在其中添加自己的中斷描述符,即中斷門。2.中斷響應(yīng)和異常處理的步驟由硬件自動(dòng)實(shí)現(xiàn)的中斷響應(yīng)和異常處理的步驟如下:首先,判斷中斷向量號(hào)要索引的門描述符是否超出IDT的界限。若超出界限,就引起通用保護(hù)故障,出錯(cuò)碼為中斷向量號(hào)乘8再加2。其次,從IDT中取得對(duì)應(yīng)的門描述符,分解出選擇子、偏移量和描述符屬性類型,并進(jìn)行有關(guān)檢查。描述符只能是任務(wù)門、286中斷門、286陷阱門、386中斷門或386陷阱門,否則就引起通用保護(hù)故障,出錯(cuò)碼是中斷向量號(hào)乘8再加2。如果是由INTn指令或INTO指令引起轉(zhuǎn)移,還要檢查中斷門、陷阱門

5、或任務(wù)門描述符中的DPL是否滿足CPL=DPL(對(duì)于其它的異?;蛑袛啵T中的DPL被忽略)。這種檢查可以避免應(yīng)用程序執(zhí)行INTn指令時(shí),使用分配給各種設(shè)備用的中斷向量號(hào)。如果檢查不通過,就引起通用保護(hù)故障,出錯(cuò)碼是中斷向量號(hào)乘8再加2。門描述符中的P位必須是1,表示門描述符是一個(gè)有效項(xiàng),否則就引起段不存在故障,出錯(cuò)碼是中斷向量號(hào)乘8再加2。最后,根據(jù)門描述符類型,分情況轉(zhuǎn)入中斷或異常處理程序。如下圖:3.通過中斷門的轉(zhuǎn)移如果中斷向量號(hào)所指示的門描述符是386中斷門,那么控制轉(zhuǎn)移到當(dāng)前任務(wù)的一個(gè)處理程序過程,并且可以變換特權(quán)級(jí)。與其它調(diào)用門的CALL指令一樣,從中斷門中獲取指向處理程序的48位全

6、指針。其中16位選擇子是對(duì)應(yīng)處理程序或代碼段的選擇子,它指示全局描述符表GDT或局部描述符表LDT中的代碼段描述符;32位偏移指示處理程序入口點(diǎn)在代碼段內(nèi)的偏移量。通過中斷門的轉(zhuǎn)移過程如下所示,該過程由硬件自動(dòng)進(jìn)行,簡單了解下。(1)若選擇子為空,則產(chǎn)生通用保護(hù)故障;(2)取對(duì)應(yīng)的描述符;(3)若非存儲(chǔ)段描述符,則產(chǎn)生通用保護(hù)故障;(4)若非一致代碼段且DPL且段存在,則切換到內(nèi)層堆棧;(5)調(diào)整RPL=0;(6)把描述符裝入CS;(7)若入口偏移越界,則產(chǎn)生通用保護(hù)故障;(8)EFLAGS壓入堆棧;(9)CS壓入堆棧;(10)EIP壓入堆棧;(11)使TF=0,NT=0;(12)若為中斷門,

7、則使IF=0;(13)若有出錯(cuò)碼,則把出錯(cuò)碼壓入堆棧;(14)轉(zhuǎn)入處理程序。由上述轉(zhuǎn)移過程可見,中斷門中指示處理程序的選擇子必須指向描述一個(gè)可執(zhí)行的代碼段的描述符。如果選擇子為空,就引起通用保護(hù)故障,出錯(cuò)碼是0。如果描述符不是代碼段描述符,就引起通用保護(hù)故障,出錯(cuò)碼含選擇子。中斷或異??梢赞D(zhuǎn)移到同一特權(quán)級(jí)或內(nèi)層特權(quán)級(jí)。上述指定處理程序代碼段的描述符中的類型及DPL字段,決定了這種同一任務(wù)內(nèi)的轉(zhuǎn)移是否要發(fā)生特權(quán)級(jí)變換。如果是一個(gè)非一致代碼段,并且DPLCPL則產(chǎn)生通用保護(hù)異常。上述轉(zhuǎn)移過程中的第六步,也就是“把描述符裝入CS”,是指把上述指定處理程序段的描述符裝入CS的高速緩沖寄存器中,在這一步

8、驟中要對(duì)描述符進(jìn)行類似通過調(diào)用門進(jìn)行轉(zhuǎn)移的其它檢查,包括是否代碼段描述符和代碼段描述符是否存在等,因此可能再發(fā)生異常。在對(duì)該描述符進(jìn)行檢查時(shí),通過調(diào)整門中選擇子的RPL=0(在處理器內(nèi)部調(diào)整,而不影響存儲(chǔ)器中的選擇子的RPL字段)的方法,實(shí)現(xiàn)只考慮代碼段的DPL,而不考慮門中選擇子的RPL。把描述符裝入CS之后,還要檢查門描述符中給出的表示處理程序代碼段入口的偏移是否越界,即是否超出段界限。如果越界,就引起出錯(cuò)碼為0的通用保護(hù)故障。把TF置成0,表示不允許處理程序單步執(zhí)行。把NT置成0,表示處理程序在利用中斷返回指令I(lǐng)RET返回時(shí),返回到同一任務(wù)而不是一個(gè)嵌套任務(wù)。通過中斷門的轉(zhuǎn)移和通過陷阱門

9、的轉(zhuǎn)移之間的差別只是對(duì)IF標(biāo)志的處理。對(duì)于中斷門,在轉(zhuǎn)移過程中把IF置為0,使得在處理程序執(zhí)行期間屏蔽掉INTR中斷。4.中斷或異常處理后的返回中斷返回指令I(lǐng)RET用于從中斷處理程序的返回。該指令的執(zhí)行根據(jù)任務(wù)嵌套標(biāo)志NT位是否為1分為兩種情形。該過程由硬件自動(dòng)進(jìn)行,簡單了解下。NT位為1,表示是嵌套任務(wù)的返回。NT位為0,表示當(dāng)前任務(wù)內(nèi)的返回。后面跟上我們的代碼:.386.modelflat,stdcalloptioncasemap:noneincludemyIntGate.inc.constCCOUNTED_UNICODE_STRINGDeviceMyIntGate,g_usDeviceN

10、ame,4CCOUNTED_UNICODE_STRING?MyIntGate,g_usSymbolicLinkName,4IDT_LIMIT=256*8GATE_TYPE=0eeh.data?g_myIntdd?g_myIntoffsetdd?g_IsAddMyGatedd?.code;中斷執(zhí)行函數(shù)MyIntGateFunctionprocinvokeDbgPrint,$CTA0(MyIntGatecalling.n)iretdMyIntGateFunctionendp;在IDT中添加中斷門,返回中斷號(hào)AddMyIntGateprocFuncAddr:DWORDpushebxpushecxsi

11、dtesp-2popecxmoveax,0.whileeaxIDT_LIMITleaedx,ecx+eaxassumeedx:ptrGATEtestedx.GTYPE,80h.ifZERO?climovebx,FuncAddrmovedx.OFFSETL,bxmovedx.SELECTOR,08hmovedx.DCOUNT,0movedx.GTYPE,GATE_TYPEshrebx,16movedx.OFFSETH,bxsti.break.endifassumeedx:nothingaddeax,8.endwpopebxmovg_myInt,eaxretAddMyIntGateendp;去掉添

12、加的中斷門RemoveMyIntGateprocpushebxpushecxsidtesp-2popecxmoveax,g_myIntoffsetleaedx,ecx+eaxassumeedx:ptrGATEclimovedx.OFFSETL,0movedx.SELECTOR,08hmovedx.DCOUNT,0movedx.GTYPE,0movedx.OFFSETH,0stiassumeedx:nothingpopebxretRemoveMyIntGateendpDispatchControlprocusesesiedipDeviceObject:PDEVICE_OBJECT,pIrp:PI

13、RPmovesi,pIrpassumeesi:ptr_IRPmovesi.IoStatus.Status,STATUS_UNSUCCESSFULandesi.IoStatus.Information,0IoGetCurrentIrpStackLocationesimovedi,eaxassumeedi:ptrIO_STACK_LOCATION.ifedi.Parameters.DeviceIoControl.IoControlCode=IOCTL_MYINTGATE&!g_IsAddMyGateinvokeAddMyIntGate,offsetMyIntGateFunctionmovg_myI

14、ntoffset,eaxxoredx,edxcdqmovecx,8divecxmovg_myInt,eaxmovedx,esi.AssociatedIrp.SystemBuffermovedx,eaxmovesi.IoStatus.Status,STATUS_SUCCESSmovesi.IoStatus.Information,4movg_IsAddMyGate,1.elsemovesi.IoStatus.Status,STATUS_INVALID_DEVICE_REQUEST.endifpushesi.IoStatus.Statusassumeedi:nothingassumeesi:not

15、hinginvokeIoCompleteRequest,esi,IO_NO_INCREMENTpopeaxretDispatchControlendpDispatchCreateCloseprocpDeviceObject:PDEVICE_OBJECT,pIrp:PIRPmoveax,pIrpassumeeax:ptr_IRPmoveax.IoStatus.Status,STATUS_SUCCESSandeax.IoStatus.Information,0fastcallIofCompleteRequest,pIrp,IO_NO_INCREMENTassumeeax:nothingmoveax

16、,STATUS_SUCCESSretDispatchCreateCloseendpDriverUnloadprocpDriverObject:PDRIVER_OBJECT.ifg_IsAddMyGateinvokeRemoveMyIntGate.endifinvokeIoDeleteSymbolicLink,addrg_usSymbolicLinkNamemoveax,pDriverObjectinvokeIoDeleteDevice,(DRIVER_OBJECTPTReax).DeviceObjectretDriverUnloadendpDriverEntryprocpDriverObjec

17、t:PDRIVER_OBJECT,pusRegistryPath:PUNICODE_STRINGLOCALpDeviceObject:PDEVICE_OBJECTLOCALstatus:NTSTATUSmovstatus,STATUS_DEVICE_CONFIGURATION_ERRORinvokeIoCreateDevice,pDriverObject,0,addrg_usDeviceName,FILE_DEVICE_UNKNOWN,0,FALSE,addrpDeviceObject.ifeax=STATUS_SUCCESSinvokeIoCreateSymbolicLink,addrg_u

18、sSymbolicLinkName,addrg_usDeviceName.ifeax=STATUS_SUCCESSmoveax,pDriverObjectassumeeax:ptrDRIVER_OBJECTmoveax.MajorFunctionIRP_MJ_CREATE*(sizeofPVOID),offsetDispatchCreateClosemoveax.MajorFunctionIRP_MJ_CLOSE*(sizeofPVOID),offsetDispatchCreateClosemoveax.MajorFunctionIRP_MJ_DEVICE_CONTROL*(sizeofPVOID),offsetDispatchControlmoveax.DriverUnload,offsetDriverUnl

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論