據我所知,內核模式代碼可以訪問任何可用的地址(高特權),但是如果我將用戶模式指針傳遞給內核模式函數,在使用它之前它會被更改嗎?我的意思是:它會像尋呼/分段系統一樣解決(或只是尋找長模式),就像在用戶模式下一樣?內核模式 - 是否可以訪問用戶模式?
1
A
回答
2
首先,你不「提供一個指向內核模式函數的指針」。內核調用不是簡單的跳轉,它們是特殊指令或軟件中斷。內核函數調用約定也與通常的函數調用不同。
無論如何,從內核上下文訪問用戶內存的工作方式取決於所討論的操作系統。內核通常擁有自己的(虛擬)地址空間。這可以是與用戶進程空間(例如32位OSX)完全獨立的地址空間,也可以位於特殊區域(在許多操作系統中分割爲高/低地址)。在高/低模式中,內核通常可以在指向該用戶空間的指針取消引用的同時在該進程的上下文中執行該指針。在一般情況下,內核可以顯式查找用戶虛擬地址引用的底層物理內存,然後將其映射到其自己的虛擬地址空間中。
由於用戶空間可能惡意提供壞指針,因此如果沒有首先檢查有效性,內核就不能使用它們。對於用戶進程的內存映射,這個和後續的訪問必須是原子的,否則進程可能會在內核的指針有效性檢查和實際讀取/寫入內存之間的時間範圍內。由於這個原因,大多數內核都有助手函數,在用戶空間和內核空間之間本質上是安全的memcpy
,在無效指針的情況下保證安全或返回錯誤。
在任何情況下,內核代碼都必須明確地做到這一點,沒有什麼是「自動」的。當然,您的系統調用可能會通過抽象層,在到達內核模塊之前自動執行此操作。
更新:現代硬件支持SMAP(管理員模式訪問阻止),旨在防止從內核意外/惡意取消指向用戶地址空間的指針。各種操作系統已經開始啓用該功能,因此在這些情況下,您絕對必須通過訪問用戶內存的特殊內核功能。
相關問題
- 1. 從內核模式執行用戶模式可執行文件
- 2. 如何訪問用戶模式內存?
- 3. LdrLoadDll是否有內核模式回調?
- 4. 如何從用戶模式調用/掛鉤內核模式API?
- 5. 用戶到內核模式的大圖?
- 6. 內核/用戶模式下的CPU
- 7. 內核如何知道CPU是處於用戶模式還是kenel模式?
- 8. 如何從用戶模式切換到內核模式?
- 9. 內核模式到用戶模式通信
- 10. Windows如何實現用戶模式/內核模式?
- 11. 內核模式和用戶模式驅動程序
- 12. 如何從Windows內核模式啓動用戶模式程序
- 13. 特權模式,內核模式和超級用戶模式之間的區別
- 14. 傳遞從用戶模式可變長度結構來內核模式
- 15. 是否可以使用WCF與Windows內核模式軟件進行通信?
- 16. Windows XP:我的程序是否以內核模式運行?
- 17. 是否可以動態訪問模塊模式中的私有變量?
- 18. 是否可以重新定義JSON模式核心關鍵字?
- 19. 笨2.1.0:模型內訪問模式
- 20. 以內核模式啓動服務(Vista)
- 21. 從用戶模式訪問Windows Native API
- 22. 用戶線程(OS Windows)的內核模式堆棧是什麼?
- 23. 什麼是內核模式軟件?
- 24. Emacs WinDbg內核模式
- 25. 內核模式轉換
- 26. 內核模式和用戶模式應用程序之間的通信
- 27. 在內核模式和用戶模式之間使用ioctl通信
- 28. 閱讀內核模式註冊表訪問?
- 29. 註冊表監控,包括內核模式註冊表訪問?
- 30. 如何在VC++中將信息從內核模式傳遞到用戶模式?