文件系统fsd hook (一)原理
要知道FSDHook原理,首先我們必須了解什么是FSD,也就是FileSystem。我們電腦上的文件系統ntfs.sys,他有個設備\FileSystem\Ntfs,這個設備是用IoCreateDevice創建,跟我們寫驅動的時候一樣,那么我們可以通過這個設備,來對ntfs做一些操作,跟ntfs驅動進行一些通信。我們來看IDA分析:
?
//這個就是我們以前的代碼,創建一個通信設備
RtlInitUnicodeString(&DestinationString, L"\\Ntfs");
result = IoCreateDevice(DriverObject, 0, &DestinationString, 8u, 0, 0, &DeviceObject);
?
?
是不是跟我們的驅動代碼一樣,而我們這里說的文件系統,其實是我們在讀寫文件的時候,都會通過通信,經過ntfs.sys的各個歷程,
DriverObject->MajorFunction[IRP_MJ_CREATE]
= (PDRIVER_DISPATCH)NtfsFsdCreate;
?
createfile
?
比如我們創建打開文件就會經過IRP_MJ_CREATE這個例程,讀文件就會經過 IRP_MJ_READ這個例程。那么我們想象下,其實ntfs文件系統,我們從編程角度理解,每一個文件的操作,都會經過它的例程,就跟我們自己的驅動一樣。
1:我們不要管他是不是一個文件系統,我們只關注,他也是一個驅動本身
2:他作為一個普通的驅動,那么就具備各種例程。
?
然后對文件操作的時候,系統就會訪問文件系統,那么我們可以通過對文件系統做手腳,就可以改變文件操作的結果。這就是我們要hook的目的。
?
?
?
?
?
?
?
那么從我們應用層調用CreateFile開始,會是怎么樣的一個流程呢:
?
CreateFile--->ntdll!zwcreatefile---->ntos!SSDT!zwcreatefile--->ntos!主體!ntcreatefile
?
----->IoCreateFile-----》IopCreateFile---》后面還有經過各種各樣的函數之后,進入到ntfs!IRP_MJ_CRREATE
?
這個函數主體,其實也是一個封裝函數:
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
?
可見文件操作還是會經過很多流程。那么我們的FSD Hook到底是在哪個流程中呢?
DriverObject->MajorFunction[0]
我們從C語言的角度來看,其實MajorFunction這個成員就是一個數組。
我們前面的課程,SSDT 是數組,shadowSSDT也是數組。
?
?
在windows下,只要是數組都可以hook,比如 SSDT ShadowSSDT,MajorFunction(FSDHook這個名稱的由來),EAT,IAT。都是數組。 只要是由匯編代碼的都可以hook(inline Hook),比如 只要是變量都可以hook 比如 猥瑣的變量patch
Tp雙機調試這節課,就是用到了邪惡變量patch,tp的debugobject權值,我們也可以用到邪惡的變量patch。
?
?
Windows是一個充滿hook世界的地方,那么我們這節課的hook,是屬于數組hook呢,還是屬于匯編代碼的hook呢?
?
//原始
DriverObject->MajorFunction[0] = (PDRIVER_DISPATCH)NtfsFsdCreate;
?
//hook
DriverObject->MajorFunction[0] = (PDRIVER_DISPATCH)NewNtfsCreate;
歡迎關注 windows驅動編程微信公眾號,微信號:driverdevelop
轉載于:https://www.cnblogs.com/xujinping/p/4912387.html
總結
以上是生活随笔為你收集整理的文件系统fsd hook (一)原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实例演示如何在spring4.2.2中集
- 下一篇: 39.原码、反码、补码的转换