我是靠谱客的博主 勤劳戒指,最近开发中收集的这篇文章主要介绍文件系统fsd hook (一)原理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

要知道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;

欢迎关注 windows驱动编程微信公众号,微信号:driverdevelop

转载于:https://www.cnblogs.com/xujinping/p/4912387.html

最后

以上就是勤劳戒指为你收集整理的文件系统fsd hook (一)原理的全部内容,希望文章能够帮你解决文件系统fsd hook (一)原理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部