日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

3 《Undocumented Windows 2000 Secrets》翻譯 --- 第三章( 二 )


現(xiàn)在,可以看出 IOCTL 是 Win32 應(yīng)用程序的一種后門,通過(guò) IOCTL ,程序可以執(zhí)行幾乎所有的操作,而在此之前,這些操作僅允許特權(quán)模塊執(zhí)行 。當(dāng)然,這需要首先編寫一個(gè)特權(quán)級(jí)的模塊,但是,一旦你擁有一個(gè)運(yùn)行于系統(tǒng)中的 Spy 模塊,一切就變得很簡(jiǎn)單了 。本書的兩個(gè)目標(biāo)是:詳細(xì)展示如何編寫內(nèi)核模式的驅(qū)動(dòng)程序以及一個(gè)可以完成很多讓人驚異的事的驅(qū)動(dòng)程序的示例代碼 。
Windows 2000 的 Killer Device
在開始更高級(jí)的驅(qū)動(dòng)程序工程之前,讓我們先看看一個(gè)非常簡(jiǎn)單的驅(qū)動(dòng)程序 。在第一章中,我介紹了 Windows 2000 的 Killer Device----w2k_kill.sys ,它被設(shè)計(jì)為引發(fā)一個(gè)良性的系統(tǒng)崩潰 。這個(gè)驅(qū)動(dòng)程序并不需要 示例 3-3 中的大多數(shù)代碼,因?yàn)樗谟袡C(jī)會(huì)收到第一個(gè) I/O 請(qǐng)求包之前就會(huì)使系統(tǒng)崩潰 。示例 3-7 給出了它的實(shí)現(xiàn)代碼 。這里沒(méi)有給出 w2k_kill.h 文件,因?yàn)樗徊话魏挝覀兏信d趣的代碼 。
示列 3-7 中的代碼沒(méi)有在 DriverEntry() 中執(zhí)行初始化操作,因?yàn)橄到y(tǒng)會(huì)在 DriverEntry() 返回前就崩潰,所以沒(méi)有必要進(jìn)行這些額外的工作 。
#define _W2K_KILL_SYS_
#include
#include "w2k_kill.h"
// =================================================================
// DISCARDABLE FUNCTIONS
// =================================================================
NTSTATUS DriverEntry (PDRIVER_OBJECT pDriverObject,
PUNICODE_STRING pusRegistryPath);
#ifdef ALLOC_PRAGMA
#pragma alloc_text (INIT, DriverEntry)
#endif
// =================================================================
// DRIVER INITIALIZATION
// =================================================================
NTSTATUS DriverEntry (PDRIVER_OBJECT pDriverObject,
PUNICODE_STRING pusRegistryPath)
{
return *((NTSTATUS *) 0);
}
// =================================================================
// END OF PROGRAM
// =================================================================
示列 3-7. 一個(gè)小巧的系統(tǒng)崩潰者
加載 / 卸載驅(qū)動(dòng)程序
在完成一個(gè)內(nèi)核驅(qū)動(dòng)程序之后,你可能會(huì)想立即執(zhí)行它 。怎么做呢?典型的做法是,在系統(tǒng)啟動(dòng)時(shí)加載驅(qū)動(dòng)程序并執(zhí)行之 。但這是不是就意味著我們每次更新驅(qū)動(dòng)程序后,都必須重新啟動(dòng)系統(tǒng)呢?很幸運(yùn),這并不是必須的 。Windows 2000 的一個(gè)特色就是提供了一個(gè) Win32 接口以允許在運(yùn)行時(shí)加載或卸載驅(qū)動(dòng)程序 。這是由服務(wù)控制管理器( Service Control Manager , SCM )完成的,下面的將詳細(xì)介紹它的用法 。
服務(wù)控制管理器
“服務(wù)控制管理器”這個(gè)名字容易讓人誤解,因?yàn)樗凳驹摻M件僅用于服務(wù)的管理 。服務(wù)( Service )是 Windows 2000 的一類非常強(qiáng)大的模塊,它們?cè)诤笈_(tái)運(yùn)行配套的程序,并且不需要用戶交互(也就是說(shuō)沒(méi)有常見(jiàn)的用戶界面或者控制臺(tái)) 。換句話說(shuō),一個(gè)服務(wù)就是一個(gè)始終運(yùn)行于系統(tǒng)中的 Win32 進(jìn)程,即使沒(méi)有用戶登陸進(jìn)來(lái)也如此 。盡管開發(fā)服務(wù)是一個(gè)令人興奮的話題,但它并不屬于本書的范疇 。想進(jìn)一步了解服務(wù)的開發(fā),請(qǐng)閱讀 Windows Developer"s Journal ( WDJ )( Tomlinson 1996a )中 Paula Tomlinson 提供的非常不錯(cuò)的教程,以及隨后在她的 WDJ 專欄 ----Understanding NT 中發(fā)表的有關(guān)服務(wù)的論文 。
SC 管理器(即服務(wù)控制管理器)可以控制服務(wù)和驅(qū)動(dòng)程序 。為了簡(jiǎn)單起見(jiàn),我在這里使用“服務(wù)”一詞來(lái)代表 SC 管理器控制的所有對(duì)象,這包括嚴(yán)格意義上的服務(wù)和內(nèi)核驅(qū)動(dòng)程 。SC 的接口對(duì)于 Win32 程序是可用的,它由 Win32 子系統(tǒng)組件 ----advapi32.dll 提供,這個(gè) DLL 還提供了很多有趣的 API 函數(shù) 。表 3-3 給出了用于加載、控制和卸載服務(wù)的 API 函數(shù)的名稱,同時(shí)還給出了簡(jiǎn)單的描述 。在你可以加載或訪問(wèn)任何服務(wù)之前,你必須獲取 SC 管理器的句柄(通過(guò)調(diào)用 OpenSCManager() ),在隨后的討論中,該句柄將被稱為:管理器句柄 。CreateService() 和 OpenService() 都需要此句柄,而這些函數(shù)返回的句柄將被稱為:服務(wù)句柄 。這種類型的句柄可以傳遞給需要引用一個(gè)服務(wù)的函數(shù),如 ControlService() 、 DeleteService() 和 StartService()。這兩種類型的 SC 句柄都通過(guò) CloseServiceHandle() 函數(shù)來(lái)釋放 。

推薦閱讀