Windows驱动开发入门-文件系统微过滤驱动
Windows驱动开发入门-文件系统微过滤驱动本节讲文件系统微过滤驱动Minifilter,着是sfilter的新型替代品,使用比sfilter方便,因为不需要手动构造IRP、维护设备对象等,但也有些局限性,更底层的功能完全实现不了。
本节例子是限制notepad.exe文件的操作,使其无法被双击执行、无法被复制、无法被改名、无法被删除。
微软把Minifilter框架从VS2022的WDK中删除了,从这里找:(https://learn.microsoft.com/en-us/windows-hardware/drivers/samples/file-system-driver-samples。
这里有个很好的示例:https://github.com/hkx3upper/FOKS-TROT。
编程框架微文件系统过滤注册用这个内核API:
12345NTSTATUS FltRegisterFilter( IN PDRIVER_OBJECT Driver, //本驱动对象 IN CONST PFLT_REGISTRATION Registration, //微过滤器注册结构 ...
Windows驱动开发入门-文件系统透明加密源码
Windows驱动开发入门-文件系统透明加密源码上一节的源码。
源代码cf_create.c1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871 ...
Windows驱动开发入门-文件系统透明加密
Windows驱动开发入门-文件系统透明加密这一节的内容就是讲讲知识点,没法做作品,本节的例子针对Windows XP和FAT32文件系统,且透明加密仅针对记事本软件进程。
区分进程找到进程名字位置进程名字保存在EPROCESS结构中,但每个Windows版本都不一样。又已知当前驱动进程名一定为“System”,所以在EPROCESS结构中搜索“System”字样即可。
1234567891011121314// 这个函数必须在DriverEntry中调用,否则cfCurProcName将不起作用。static size_t s_cf_proc_name_offset = 0; //要寻找的偏移位置VOID cfCurProcNameInit(VOID){ ULONG i; PEPROCESS curproc; curproc = PsGetCurrentProcess(); // 搜索EPROCESS结构,在其中找到字符串 for (i = 0; i < 3 * 4 * 1024; i++) if (!strncmp(&q ...
Windows驱动开发入门-sfilter源代码
Windows驱动开发入门-sfilter源代码sfilter这玩意儿因为过时了,微软官方WDK已经不再包含sfilter的实例源码模板了,所以这里放出。
sfilter.c12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317 ...
Windows驱动开发入门-文件系统过滤与监控
Windows驱动开发入门-文件系统过滤与监控碎碎念sfilter貌似已经过时,建议使用Minifilter写文件系统过滤。
当要求区分目录、涉及文件系统的要求时,存储设备驱动很难解决问题,需要使用文件系统过滤。FAT32的驱动为fastfat.sys,NTFS的驱动叫ntfs.sys,这俩都在Windows的drivers目录下。像这样的FS文件系统生成两类设备,一类CDO控制对象,用来修改这个驱动内部配置,一个文件系统只对应一个CDO;另一类文件系统卷设备,一个卷对应一个逻辑盘。例如逻辑盘“C:”只是个符号链接,真正的设备名叫“\Device\HarddiskVolume1”。卷设备时卷管理器生成的,没名字,不能直接绑定,要不绑定的不是系统生成的卷设备而是真正的卷设备。对文件的读写IRP都发送到卷设备,不论卷文件系统是什么,一个卷一个卷设备。绑定卷设备前先绑定文件系统控制设备。
在文件过滤中,按照国际惯例应该把控制设备生成到“\FileSystem\Filters”下,但有些早期Windows系统没这个路径,所以直接生成到“\FileSystem”下。
这节代码太复杂了,不打算格式 ...
Windows驱动开发入门-磁盘过滤驱动
Windows驱动开发入门-磁盘过滤驱动碎碎念这个驱动属于boot类型,这类驱动程序是启动最早的驱动程序,系统引导时必须加载完毕。需要在注册表HKEY_LOCAL_MACHINES\SYSTEM\CurrentControlSet\Services下驱动服务的start值需要指定为0。
驱动分析驱动入口DriverEntry1234567891011121314151617181920NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { int i; for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) //初始化这个驱动所有的分发函数,默认值是初始化为DPDispatchAny DriverObject->MajorFunction[i] = DPDispatchAny; //下面将我们特殊关注的分发函数重新赋值为我们自己的处理函数 DriverObject->MajorFunction[IR ...
Windows驱动开发入门-磁盘虚拟
Windows驱动开发入门-磁盘虚拟KMDF开发入门项目建立建立后可能报错找不到driver.tmh文件,但能正常编译,剩下的问题同普通WDM驱动的编写。
入口函数123456789101112131415161718NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) { WDF_DRIVER_CONFIG config; NTSTATUS status; WDF_OBJECT_ATTRIBUTES attributes; //WPP_INIT_TRACING(DriverObject, RegistryPath); //TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry"); WDF_OBJECT_ATTRIBUTES_INIT(&attributes); attributes.EvtCleanup ...
Windows驱动开发入门-键盘过滤驱动
Windows驱动开发入门-键盘过滤驱动碎碎念PDO是设备栈最下面的那个物理设备对象。
csrss.exe的进程有个线程叫做win32!RawInputThread,它通过一个GUID叫GUID_CLASS_KEYBOARD获得键盘设备栈PDO符号链接名。应用程序不能通过设备名字打开设备,一般通过符号链接名来打开。win32k!RawInputThread执行到win32k!OpenDevice,一个参数能找到键盘设备栈的PDO符号链接名。win32!OpenDevice有个OBJECT_ATTRIBUTES结构局部变量,它自己初始化这个局部变量,用传入参数中的符号链接名赋值OBJECT_ATTRIBUTES+0x8处的PUNICODE_STRING ObjectName。然后调用ZwCreateFile打开设备得到句柄。
ZwCreateFile通过系统服务,调用内核NtCreateFile,执行到nt!IopParseDevice调用nt!IoGetAttachedDevice,通过PDO获得键盘设备栈最顶端的设备对象,该对象+30 char StackSize作为参数调用IoAl ...
Windows驱动开发入门-串口过滤驱动
Windows驱动开发入门-串口过滤驱动设备绑定IoAttachDevice把一个物理设备与一个设备对象绑定。
12345678NTSTATUS IoAttachDevice( IN PDEIVE_OBJECT SourceDevice, //用来过滤的虚拟设备 IN PUNICODE_STRING TargetDevice, //要绑定的目标设备 例如\Device\Serial0以此类推 OUT PDEVICE_OBJECT *AttachedDevice //返回被绑定的设备指针)
IoAttachDeviceToDeviceStackSafe上面那个API没法绑定没名字的设备,这个根据设备对象指针绑定。
12345678NTSTATUS IoAttachDeviceToDeviceStackSafe( IN PDEVICE_OBJECT SourceDevice, //过滤设备 IN PDEVICE_OBJECT TargetDevice, //要被绑定的设备栈中设备 IN OUT PDEVICE_OBJECT ...
手把手教你手撕HIVE文件
手把手教你手撕HIVE文件介绍HIVE文件在HKLM\SYSTEM\CurrentControlSet\Control\hivelist下键值给出,这里以C:\Windows\System32\config\SOFTWARE为例。
常用数据结构header总长度为$4096$字节,重要信息:
偏移量
长度(字节)
描述
0x00
4
签名“regf”
0x0C
8
最后一次写入数据时间戳 UTC1601-1-1至今100纳秒间隔数
0x14
4
主版本号
0x18
4
次版本号
0x24
4
RootCell偏移量
0x28
4
HIVE文件长度 不包含表头和结尾附加数据
0x30
HIVE文件名 Unicode字符串
hbin cellsheader后紧接着就是这个。重要信息:
偏移量
长度(字节)
描述
0x00
4
签名“hbin”
0x04
4
相对于第一个hbin偏移量
0x08
4
该hbin数据长度大小
node key(nk)重要信息:
偏移量
长度(字节)
描述
0x00
4
大小 负数已被 ...