zoukankan      html  css  js  c++  java
  • 文件系统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

  • 相关阅读:
    docker从容器里面拷文件到宿主机或从宿主机拷文件到docker容器里面
    maven构建的项目相关的命令
    gradle build文件中文乱码解决
    adobe acrobat看PDF文档显示字体发虚,有毛刺的解决办法
    Jenkins 用Tomcat部署War出现 反向代理设置有误
    变量 $cfg['TempDir'] (./tmp/)无法访问。phpMyAdmin无法缓存模板文件,所以会运行缓慢。
    phpMyAdmin配置文件中的密文(blowfish_secret)太短
    phpmyadmin报错:mysqli_real_connect(): (HY000/2002): No such file or directory 错误正确解决方法
    Gradle编译设置编码格式
    redis中的hash
  • 原文地址:https://www.cnblogs.com/xujinping/p/4912387.html
Copyright © 2011-2022 走看看