挂接file system

//尝试挂接file system

 


#include "Hookfilesystem.h"


HANDLE        hFileHandle;
OBJECT_ATTRIBUTES        ObjectAttrib;
PDEVICE_OBJECT        pFileDeviceObject;


struct _DRIVER_OBJECT *pDeviceObject;


PDRIVER_DISPATCH RealCreateDispatch;


NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject ,IN PUNICODE_STRING RegistryPath)
{
        UNICODE_STRING        uninameString,unilinkString;
        NTSTATUS        ntStatus;
        PDEVICE_OBJECT        pDeviceObject;
       
        RtlInitUnicodeString(&uninameString,L"//Device//Shadow3");
       
        ntStatus = IoCreateDevice(DriverObject,
        0,
        &uninameString,
        FILE_DEVICE_UNKNOWN,
        0,
        TRUE,
        &pDeviceObject
        );
                                                                                                               
        if(!NT_SUCCESS(ntStatus))        //如果创建设备失败,则直接退出
                return ntStatus;
               
        //创建Win32可见的符号连接
        RtlInitUnicodeString( &unilinkString, L"//DosDevices//shadow3" );
       
        ntStatus = IoCreateSymbolicLink(&unilinkString ,&uninameString);
        if(!NT_SUCCESS(ntStatus))
        {
                return ntStatus;       
        }
       
        //设置Dispatch
        DriverObject->MajorFunction[IRP_MJ_CREATE] = DriverDispatch;
        DriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverDispatch;
        //设置Unload
        DriverObject->DriverUnload = DriverUnload;
        //Hook File System
        HookFileSystem();
       
        return 0;       
}


NTSTATUS
DriverDispatch(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    )
{
               
    Irp->IoStatus.Status = STATUS_SUCCESS;
    IoCompleteRequest (Irp,IO_NO_INCREMENT);
    return Irp->IoStatus.Status;
}


void DriverUnload(IN PDRIVER_OBJECT pDriverObject)
{
                UNICODE_STRING uniNameString;
               
                RtlInitUnicodeString(&uniNameString, L"//DosDevices//shadow3");
                IoDeleteSymbolicLink(&uniNameString);        //删除win32可见
                IoDeleteDevice(pDriverObject->DeviceObject);        //删除设备
               
                return ;
}


void HookFileSystem(void)
{
        UNICODE_STRING uniDeviceName;
        NTSTATUS        Ntstatus;
        IO_STATUS_BLOCK IoStatusBlock;
        PVOID pFileObject;
       
        RtlInitUnicodeString(&uniDeviceName ,L"//DosDevices//C://");
       
        InitializeObjectAttributes(&ObjectAttrib ,&uniDeviceName ,OBJ_CASE_INSENSITIVE, NULL, NULL);
        //打开一个设备
        Ntstatus = ZwCreateFile(
                                &hFileHandle,
                                SYNCHRONIZE|FILE_ANY_ACCESS,
                                &ObjectAttrib,
                                &IoStatusBlock,
                                0,
                                0,
                                FILE_SHARE_READ|FILE_SHARE_WRITE,
                                FILE_OPEN,
                                FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE,
                                0,
                                0
                                );
                                                       
        if(!NT_SUCCESS(Ntstatus))
        {
                DbgPrint("ZwCreateFile Failed,ntstatus:%ld/n",Ntstatus);       
                return;
        }
       
        //通过文件句柄得到与之向对应的文件对象
        Ntstatus = ObReferenceObjectByHandle(hFileHandle,FILE_READ_DATA,0,0,&pFileObject,NULL);
        if(!NT_SUCCESS(Ntstatus))
        {
                ZwClose(hFileHandle);
                DbgPrint("ObReferenceObjectByHandle Failed,ntstatus:%ld/n",Ntstatus);       
                return;
        }
       
        //在通过该文件对象查找相对应的文件设备
        pFileDeviceObject = IoGetRelatedDeviceObject(pFileObject);
        //文件对象引用计数器减一
        ObDereferenceObject(pFileObject);
        ZwClose(hFileHandle);
       
        if(pFileDeviceObject==NULL)
        {
                DbgPrint("Get File Object Failed/n");               
                return ;
        }
       
        pDeviceObject = pFileDeviceObject->DriverObject;
       
        if(pDeviceObject->MajorFunction[IRP_MJ_CREATE] == HookCreateDispatch)
        {
                DbgPrint("already hook IRP_MJ_CREATE/n");       
                return ;
        }
       
        //保存IRP_MJ_CREATE处理的地址
        RealCreateDispatch = pDeviceObject->MajorFunction[IRP_MJ_CREATE];
       
        //Hook Create DisPatch
        pDeviceObject->MajorFunction[IRP_MJ_CREATE] = HookCreateDispatch;
       
        return;       
}


NTSTATUS
HookCreateDispatch(   
                IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    )
{
        // DbgPrint("hook success/r/n");
        PIO_STACK_LOCATION        pIocurrentstack;
        PFILE_OBJECT pFileObject;
       
        DbgPrint("DeviceName:%S/r/n",DeviceObject->DriverObject->DriverName.Buffer);
       
       
        pIocurrentstack = IoGetCurrentIrpStackLocation(Irp);
       
        pFileObject = pIocurrentstack->FileObject;
       
        DbgPrint("FileName:%S/r/n",pFileObject->FileName.Buffer);
       
        _asm
        {
                push Irp
                push DeviceObject
                call RealCreateDispatch       
        }
       
        return 0;       
}

 

hookfilesystem.h

 

代码
#ifndef _INCLUDE_
#define _INCLUDE_

 


#include <ntddk.h>


NTSTATUS
DriverDispatch(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    );
   
void DriverUnload(IN PDRIVER_OBJECT DriverObject);


void HookFileSystem(void);


NTSTATUS
HookCreateDispatch(   
                IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    );


#endif

 
浅谈迪杰斯特拉(Dijkstra)算法和A*算法原理及实现 迪杰斯特拉(Dijkstra)算法和A*算法的原理及实现。 阅读详情

相关推荐

ACM论文LaTeX模板解析(三)| 文章顶部信息(Top matter))Part 1

文章顶部信息(Top matter))Part 1,文章类型、作者信息等

FreshManInC的博客 4853

centos7初学者报错笔记

netstat 6379报错 netstat -tunlp -bash: netstat: command not found 解决方法: yum install net-tools

ok996的博客 886

proteus仿真51单片机操作指南:串口通信仿真配置详解

深入讲解如何在proteus仿真51单片机中实现串口通信,涵盖虚拟串口设置、电路连接与调试技巧,帮助开发者高效完成通信仿真验证。

weixin_36197669的博客 573

centos启动问题的解决

由于配置Hadoop开发环境的需要,配置了两天虚拟机器,系统为centos6.3, 虚拟机配置过程中发现,系统正常运行 但是重启后,选择系统,显示centosos6.3,  一个进度条,进度条进行到100%后,无反应直接卡死。 重装后 问题依旧. 再重装   take snapshot,   再重启  问题依旧。 恢复快照。 几经度娘,   修订/boot/grub/grub.conf 找

bdjc的专栏 1669

SAP EWM 内向交货流程(一)

本文介绍了SAP EWM系统中内向交货单的基本配置与操作流程。

huqinghai的专栏 2402

保姆级教程:用Fiddler+夜神模拟器搞定抖音App抓包(附SSL Pinning绕过实战)

本文提供了一套完整的移动端抓包解决方案,详细介绍了如何使用Fiddler和夜神模拟器进行抖音App抓包,并重点讲解了SSL Pinning绕过技术。通过Xposed框架和JustTrustMe模块的组合,实现高效抓包,适用于产品分析、竞品研究和安全测试等场景。

weixin_30855099的博客 423

驱动开发之二:尝试挂接file system

hookfilesystem.c 代码 //尝试挂接file system   #include "Hookfilesystem.h" HANDLE        hFileHandle;

rageliu的专栏 3515

基于STM32F407VET6的智能巡检小车灰度循迹系统优化设计

本文详细介绍了基于STM32F407VET6主控芯片的智能巡检小车灰度循迹系统优化设计。通过将传感器输出从数字量升级为模拟量以获取更丰富的路面信息,并采用PD控制算法结合速度管理策略,有效提升了小车在复杂弯道上的循迹稳定性与适应性。文章分享了硬件电路抗干扰设计、软件滤波及实战调优经验,为嵌入式开发者提供了从“能跑”到“跑得稳”的系统性解决方案。

weixin_28273593的博客 444

Linux基础-----Linux系统的文件系统与日志文件

目录 一.inode与block概述 二.indoe的内容 三.inode的号码 四.inode的大小 五.inode的特殊作用 六.恢复误删除的xfs文件 七.日志文件的分类与位置 八.内核及系统日志 九.用户日志 十.程序日志 十一.日志管理策略 一.inode与block概述 Linux系统文件中有三个部分:文件名,元信息,数据。 通常元信息存放在inode(索引...

qq_42761527的博客 761

ENVI预处理GF-1号WFV1遥感数据提取NDVI指数

使用ENVI处理GF-1号遥感数据提取NDVI指数

所有专家都曾始于新手 8180

Python爬虫实战:携程旅游攻略爬取全流程解析(动态接口+反爬破解+异步爬取)

本文介绍了携程旅游攻略的爬取全流程,涵盖静态和动态页面抓取、异步请求、高级反爬策略以及数据存储和简单分析。增加用户评论和评分抓取结合NLP分析攻略文本情感与关键词建立旅游推荐系统自动化代理IP池和验证码识别模块。

2201_76125261的博客 2039

【51码儿】【Linux学习笔记】第1章 安装、登录CentOS7

本笔记由51码儿(www.51mar.com)提供 1.1学习之初预习和复习的重要性(预习:大致看看命令等,有印象。复习:随时浏览)当日事当日毕(只能做到当周事当周毕,保证给自己的理由,不能越堆越多)记笔记(清晰)利用好资源(VIP群,一起学习,借鉴别人分享的解决问题的方法,QQ找老师,视频下方区域可提交问题,圈子里有工作介绍)3年有效期(有更新可继续学习) 1.2约定系统CentOS 7.3...

weixin_34138255的博客 2475

Vue3 - 实现集成配置百度语音识别转文字,长按或开启录音并将录音文件实时转换为文字,上传音频文件利用百度语音识别API转换为文本并展示(vue3百度智能云API实现上传录音文件并转换成文字案例)

vue3对接百度智能云语音识别,vue3 h5移动端网页中实现语音识别,百度语音识别录音转文字_百度智能云,vue3如何使用百度语音识别,如何将语音转文字,使用vue3实现录音并将录音转换为文字,vue3如何实现语音输入功能功能,vue3集成百度智能云API实现录音转文字详细教程完整示例代码demo,VUE3使用百度语音识别语音转文字,vue调用百度语音识别,vue3百度语音识别文字并展示功能,vue3免费语音转文本api,百度语音识别申请配置教程,Vue3项目配置自定义界面百度语音识别转文字和原生使用方式

🏆 前端领域优质创作者 2730

NFS服务器的配置与管理

配置与管理NFS网络文件系统一、NFS服务概述Linux和Windows之间可以通过Samba进行文件共享,那么Linux之间怎么进行资源共享呢?这就要说到NFS(Network File System,网络文件系统),它最早是UNIX操作系统之间共享文件和操作系统的一种方法,后来被Linux操作系统完美继承。 NFS最早是由Sun公司于1984年开发出来的,其目的...

weixin_33714884的博客 415

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

虚拟文件系统(Virtual File System,VFS)

Linux虚拟文件系统 Linux包含一个通用的、强有力的文件处理机制,该机制利用虚拟文件系统(Virtual File System,VFS)来支持大量的文件管理系统和文件结构。VFS向用户进程提供了一个简单的,统一的文件系统接口。VFS定义了一个能代表任何可想到的文件系统的通用特征和行为的通用文件模型。VFS认为文件是计算机大容量存储器上的对象。这些计算机大容量存储器具有共同的特征,这与目标文件系统或底层的处理器硬件无关。文件有一个符号名,以便在一个文件系统的特定目录下能唯一地标识该文件。同时文件有一个

qq_39918677的博客 3979

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Network File System

Network File System NFS 是由SUN公司发展, 并於1984年推出, NFS是一个RPC service ,它使我们能够达到档案的共享, 它的设计是为了在不同的系统间使用, 所以它的通讯协定设计与主机及作业系统无关.当使用者想用远端档案时只要用"mount"就可把remote档案系统挂接在自己的档案系统之下,使得远端的档案使用上和local机器的档案没两样. machine

ぅ箭せ絃上ぃ的专栏 427

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

20080925 busybox and file system

 1  download  busybox2  edit the  Makefile,  arch  & crosscomplile3 make  menuconfig   busybox setting--> build option-> [*]build busybox as  astatic binary  installation options-->[*] dont u

defoecn的专栏 505

Android read-only file system解决方法

adb shell su - mount -o rw,remount /system 转载于:https://www.cnblogs.com/qiangxia/p/5049959.html

weixin_33989058的博客 178

fsck(file system check)

fsck(file system check)用来检查和维护不一致的文件系统。若系统掉电或磁盘发生问题,可利用fsck命令对文件系统进行检查 Linux技巧:使用Fsck命令修复损坏的分区 输入Root密码登录后采用:fsck -t ext3 -r /usr/local 修复 fsck的命令的几个使用方法 指令:fsck 使用权限 : 超级使用者 root 使用方式 : fsck [-

程序狗的成长之路 1562

DBA警示录:断电与Read-only file system

eygle的DBA警示录: 昨天有一个用户的数据库系统发生断电,重启后发现数据库无法启动。日志中抛出如下错误:Sat May 12 11:01:51 2007 Errors in file /oracle/admin/ccdb/udump/ccdb_ora_27215.trc: ORA-01110: data file 14: /data/system05.dbf

(Andrew)的专栏 1283

paip System out println乱码解决

paip System out println乱码解决

sdfhncfw的博客 173

Linux系统篇25——通信(三):System V 共享内存:从页表映射到 shmget/shmat 一文搞懂

共享内存 = 同一块物理内存,被映射到多个进程的虚拟地址空间;进程之间不再经过内核拷贝即可交换数据。但它的代价是"不带同步互斥",必须自己配信号量/管道来控制访问顺序。那篇把 IPC 全家福摆过一遍,其中对共享内存的定位是:"把同一块物理内存映射到多个进程,大家直接读写,零拷贝、性能最高。但它不负责同步,必须配信号量使用。" 本篇就是把那一句"零拷贝"背后的页表映射原理和API 实战补齐。

2502_94387000的博客 903

【Linux 】二十.进程间通信篇三《Linux System V IPC 完全指南:共享内存、消息队列与信号量全解》

共享内存区是最快的IPC形式。⼀旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执⾏进⼊内核的系统调⽤来传递彼此的数据进程间通信的第一步永远是"让两个进程能看到同一块资源",资源都看不到,数据就没法传。管道是怎么实现的?匿名管道靠父子进程继承文件描述符,命名管道靠文件路径唯一,大家认准同一个路径就能找到同一份文件。不管哪种管道,本质上都是文件资源,之前给大家也介绍了,Linux下一切皆文件。之前学管道的时候就知道,进程间通信的第一步永远是"让两个进程先看到同

2501_93351213的博客 933

sfilter

整理自:http://topic.youkuaiyun.com/t/20060629/11/4849948.html 好资料如下:     书:Windows   NT   File   System   Internals,IFS   DDK文档。     零碎资料:驱动开发网,OSR(它的新闻组很赞),sysintels.com,以及DDK的源代码。         最后

sunhf_my的专栏 2322

mount -t usbdevfs none/proc/bus/usb

USB设备检测也是通过/proc目录下的USB文件系统进行的。为了使一个USB设备能够正常工作,必须要现在系统中插入USB桥接器模块。在检测开始时,一般要先检测是否存在/proc/bus/usb目录,若不存在则尝试插入USB桥接模块。 我们在正确的插入了桥接器模块之后,/pro

drbinzhao的专栏 3389

Creating a Root File System for Linux on OMAP35x - 为Linux基于OMAP35x创建根文件系统

本文原载于 http://processors.wiki.ti.com/index.php?title=Creating_a_Root_File_System_for_Linux_on_OMAP35x 翻译文章,转载本文请标明出处,谢谢。 今天,我们只关注root file system的创建,并不聚焦具体的芯片是什么。 ABSTRACT A Lin

pro_or_gram的专栏 4440
上一篇: 微软Windows软件防火墙实现技术简述
下一篇: 驱 动 版 Hello World
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值