要知道FSDHook原理,首先我们必须了解什么是FSD,也就是FileSystem。我们电脑上的文件系统ntfs.sys,他有个设备FileSystemNtfs,这个设备是用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;