文件系统fsd hook (一)原理
要知道FSDHook原理,首先我們必須了解什么是FSD,也就是FileSystem。我們電腦上的文件系統(tǒng)ntfs.sys,他有個設(shè)備\FileSystem\Ntfs,這個設(shè)備是用IoCreateDevice創(chuàng)建,跟我們寫驅(qū)動的時候一樣,那么我們可以通過這個設(shè)備,來對ntfs做一些操作,跟ntfs驅(qū)動進行一些通信。我們來看IDA分析:
?
//這個就是我們以前的代碼,創(chuàng)建一個通信設(shè)備
RtlInitUnicodeString(&DestinationString, L"\\Ntfs");
result = IoCreateDevice(DriverObject, 0, &DestinationString, 8u, 0, 0, &DeviceObject);
?
?
是不是跟我們的驅(qū)動代碼一樣,而我們這里說的文件系統(tǒng),其實是我們在讀寫文件的時候,都會通過通信,經(jīng)過ntfs.sys的各個歷程,
DriverObject->MajorFunction[IRP_MJ_CREATE]
= (PDRIVER_DISPATCH)NtfsFsdCreate;
?
createfile
?
比如我們創(chuàng)建打開文件就會經(jīng)過IRP_MJ_CREATE這個例程,讀文件就會經(jīng)過 IRP_MJ_READ這個例程。那么我們想象下,其實ntfs文件系統(tǒng),我們從編程角度理解,每一個文件的操作,都會經(jīng)過它的例程,就跟我們自己的驅(qū)動一樣。
1:我們不要管他是不是一個文件系統(tǒng),我們只關(guān)注,他也是一個驅(qū)動本身
2:他作為一個普通的驅(qū)動,那么就具備各種例程。
?
然后對文件操作的時候,系統(tǒng)就會訪問文件系統(tǒng),那么我們可以通過對文件系統(tǒng)做手腳,就可以改變文件操作的結(jié)果。這就是我們要hook的目的。
?
?
?
?
?
?
?
那么從我們應(yīng)用層調(diào)用CreateFile開始,會是怎么樣的一個流程呢:
?
CreateFile--->ntdll!zwcreatefile---->ntos!SSDT!zwcreatefile--->ntos!主體!ntcreatefile
?
----->IoCreateFile-----》IopCreateFile---》后面還有經(jīng)過各種各樣的函數(shù)之后,進入到ntfs!IRP_MJ_CRREATE
?
這個函數(shù)主體,其實也是一個封裝函數(shù):
kd> u ntcreatefile l 50
nt!NtCreateFile:
8056f2fc 8bff mov edi,edi
8056f2fe 55 push ebp
8056f2ff 8bec mov ebp,esp
8056f301 33c0 xor eax,eax
8056f303 50 push eax
8056f304 50 push eax
8056f305 50 push eax
8056f306 ff7530 push dword ptr [ebp+30h]
8056f309 ff752c push dword ptr [ebp+2Ch]
8056f30c ff7528 push dword ptr [ebp+28h]
8056f30f ff7524 push dword ptr [ebp+24h]
8056f312 ff7520 push dword ptr [ebp+20h]
8056f315 ff751c push dword ptr [ebp+1Ch]
8056f318 ff7518 push dword ptr [ebp+18h]
8056f31b ff7514 push dword ptr [ebp+14h]
8056f31e ff7510 push dword ptr [ebp+10h]
8056f321 ff750c push dword ptr [ebp+0Ch]
8056f324 ff7508 push dword ptr [ebp+8]
8056f327 e860d8ffff call nt!IoCreateFile (8056cb8c)
8056f32c 5d pop ebp
8056f32d c22c00 ret 2Ch
?
可見文件操作還是會經(jīng)過很多流程。那么我們的FSD Hook到底是在哪個流程中呢?
DriverObject->MajorFunction[0]
我們從C語言的角度來看,其實MajorFunction這個成員就是一個數(shù)組。
我們前面的課程,SSDT 是數(shù)組,shadowSSDT也是數(shù)組。
?
?
在windows下,只要是數(shù)組都可以hook,比如 SSDT ShadowSSDT,MajorFunction(FSDHook這個名稱的由來),EAT,IAT。都是數(shù)組。 只要是由匯編代碼的都可以hook(inline Hook),比如 只要是變量都可以hook 比如 猥瑣的變量patch
Tp雙機調(diào)試這節(jié)課,就是用到了邪惡變量patch,tp的debugobject權(quán)值,我們也可以用到邪惡的變量patch。
?
?
Windows是一個充滿hook世界的地方,那么我們這節(jié)課的hook,是屬于數(shù)組hook呢,還是屬于匯編代碼的hook呢?
?
//原始
DriverObject->MajorFunction[0] = (PDRIVER_DISPATCH)NtfsFsdCreate;
?
//hook
DriverObject->MajorFunction[0] = (PDRIVER_DISPATCH)NewNtfsCreate;
歡迎關(guān)注 windows驅(qū)動編程微信公眾號,微信號:driverdevelop
轉(zhuǎn)載于:https://www.cnblogs.com/xujinping/p/4912387.html
總結(jié)
以上是生活随笔為你收集整理的文件系统fsd hook (一)原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实例演示如何在spring4.2.2中集
- 下一篇: 39.原码、反码、补码的转换