[英]int instruction from user space
我的印象是x86上的“ int”指令沒有特權。 因此,我認為我們應該能夠從用戶空間應用程序執行此指令。 但似乎並非如此。
我正在嘗試從Windows上的用戶應用程序執行int。 我知道這樣做可能不正確。 但是我想找點樂子。 但是Windows正在殺死我的應用程序。
我認為問題是由於條件cpl <= iopl引起的。 有人知道如何解決嗎?
對於一般用戶模式代碼舊的分配機制轉變,以調用內核服務,以內核模式是通過實施int 2Eh
(現改為sysenter
)。 直到今天, int 3
仍保留用於斷點。
基本上,內核會為某些中斷設置陷阱(盡管不記得是否全部),並根據陷阱代碼,它們將為用戶模式調用者執行某些服務,否則,您的應用程序將被殺死,因為它會嘗試特權操作。
無論如何,詳細信息取決於您嘗試調用的確切中斷。 例如,函數DbgBreakPoint
( ntdll.dll
)和DebugBreak
( kernel32.dll
)除了調用int 3
(或實際上是特定的操作碼int3
)外沒有其他作用。
編輯1:在較新版本的Windows(XP SP2和更新,IIRC) sysenter
取代int 2Eh
正如我在回答中寫道。 它被終止的一個可能原因-盡管您應該能夠通過異常處理來捕獲它-是因為您沒有在堆棧上傳遞它期望的參數。 基本上,本機API的usermode部分將您調用的系統服務的參數放在堆棧上,然后將服務的編號(系統服務調度程序表中的索引-SSDT,有時是SDT)放置到特定的寄存器中,然后調用在較新的系統sysenter
和較舊的系統int 2Eh
。
給定中斷向量的最小振鈴級別(決定給定“ int”是否具有特權)基於與中斷描述符表中的向量相關聯的振鈴級別描述符。
在Windows中,大多數中斷是特權指令。 這樣可以防止用戶模式僅調用雙重故障處理程序立即對操作系統進行錯誤檢查。
Windows中有一些非特權中斷。 特別:
所有其他中斷均具有特權,調用它們會導致發出“無效指令”中斷。
INT是“特權控制”指令。 內核必須以此方式保護自己免受用戶模式的攻擊。 INT所經歷的陷阱向量與硬件中斷和處理器異常所經歷的陷阱向量完全相同,因此,如果usermode可以任意觸發這些異常,則中斷分配代碼將感到困惑。
如果要在Windows尚未設置的特定向量上觸發中斷,則必須使用調試器或內核驅動程序修改該中斷向量的IDT條目。 Patchguard不允許您使用x64版本Windows上的驅動程序執行此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.