900
人物
[原創]搶先DriverStudio奪取機器控製權
原創搶先奪取機器控製權
廢話不談,言歸正傳!
大家都知道,裝了DriverStudio軟件(我使用的是v3.2版)的係統在啟動時會顯示其配置畫麵,(如圖0所示)
圖 0
這時操作係統的其他部件還沒有運行。那麼顯示的原理是什麼?能不能早於DriverStudio而先執行其他代碼呢?答案是肯定的。下麵先談談原理吧。
原理比較簡單,詳細的大家可以看網文<<Inside NT boot>>
,我這裏簡單說說。當引導扇區被引導後,會查找NTLDR,NTLDR做
的一件非常重要的事就是將CPU從實模式轉換到保護模式下。在
加載完NTDECT.COM後接下來就會將NT的核心裝入內存,它們是HAL.DLL和NTOSKRNL.EXE,加載完畢後,NTLDR再加載所有引導
必須的驅動程序。接下來就是我們所關心的地方:它會將HKLM/SYSTEM/Services中值為 SERVICE_BOOT_START的DRIVER
裝入,但此時不初始化。
(補充附注:
NtLdr第3步動作:掃描內存中SYSTEM注冊表hive文件找到所有引
導設備驅動程序,這些Driver仔注冊表中通過SERVICE-BOOT-
START啟動值標記。
NtLdr第5步動作:加載引導驅動程序,在啟動畫麵Starting
Windows下顯示出不斷更新的進度欄,該進度欄隨每個驅動程
序的加載而變化。
Kernel第23步動作:I/O管理器初始化……所有前麵加載的
Boot-Start型驅動程序被調用以完成驅動程序相關初始化,
這時才輪到System-Start型的驅動程序被加載並初始化。
更詳細的信息請參考<<Windows 2000 內部揭秘>>
)
那麼DriverStudio是不是也是使用了這個特性呢?
運行 regedit.exe ,在Services目錄中找到bootcfg這個注冊
項,可以看到它是一個內核驅動,並且Start類型為0。如圖1
所示:
圖1
為了證實這個Driver就是提供DriverStudio開機時配置功能的
驅動程序,我用一個會引起係統崩潰驅動的名字來替換它,然
後重新啟動。原本該顯示配置畫麵的地方果然發生了係統崩潰。
(如圖2所示)
圖 2
既然知道了原理,再來看看操作。實際上windows自身提供
了這個實現。細心的朋友可能早就知道Win32 API
CreateService的dwStartType 形參有個選項為:SERVICE_BOOT_START 。
SERVICE_BOOT_START -- Specifies a device driver started by the operating system loader. This value is valid only if the service type is SERVICE_KERNEL_DRIVER or SERVICE_FILE_SYSTEM_DRIVER.
好像看起來和普通的諸如SERVICE_DEMAND_START 的用法沒
什麼不同嘛,結果手動編製嚐試結果返回非法參數。
為什麼會這樣呢?經過一番thinking之後,我猜測由
於使用
了SERVICE_BOOT_START 時,是在係統引導的早期發生load
Driver事件,這時可能除了少數幾個OS必須的路徑以外,還
無法訪問其他windows目錄。為了證實,我將自己的Driver拷
貝到係統目錄:
%root%/system32/drivers/
下,再次運行結果成功!
下麵再引出注冊表中的一個與驅動程序加載相關的KEY:
ServiceGroupOrder ,如圖3所示:
圖3
再看一下圖1中DriverStudio引導驅動的組名,是Boot Bus Extender,它排在啟動順序的第2位。現在我新加一個
Group名:Hopy。
如圖4:
圖4
然後將代碼改寫如下:
;BTmain.asm節選
namesvr db 'TryBootSvr',0
notesvr db 'Test Drv Start at System Boot',0
namefile db 'BTdrv.sys',0
szLOG db 'hopy',0
szSSN db 'TBSvr2007',0 ;ServiceStartName
szpath db 'C:/WINNT/system32/drivers/BTdrv.sys',0
invoke CreateService,hSCM,addr namesvr,addr notesvr,/
SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,/
SERVICE_BOOT_START,SERVICE_ERROR_NORMAL,/
addr szpath,addr szLOG,addr tagid,NULL,/
NULL,NULL
驅動代碼如下:
;BTdrv.asm節選
local status:NTSTATUS
local pDeviceObject:PVOID
mov status, STATUS_DEVICE_CONFIGURATION_ERROR
xor edi,edi
mov [edi],eax
jmp $
mov eax,status
ret
結果如我們所預料,該Driver搶在DriverStudio之前發生
藍屏,如果將這個Driver換成帶有特定功能的代碼的驅動,
則可以實現超前的目的。這個留給大家去想象吧,嗬嗬。
hopy|侯佩
2007.09.16 寫於中國
女足慘敗於巴西之後
最後更新:2017-04-02 00:06:21