WindowsAPI编程核心技术-键盘按键记录过滤驱动
WindowsAPI编程核心技术-键盘按键记录过滤驱动实现原理驱动中有设备栈的概念,栈内成员是设备,一个连着一个。同一个设备栈中的设备,IRP传递方向是从栈顶到栈底。新添加的设备附加在设备栈顶,新设备总最先获取IRP数据。
键盘过滤驱动工作在异步模式下,发送请求IRP_MJ_READ到驱动设备栈,驱动收到后挂起,直到按下一个键,驱动完成IRP并作为返回值返回。IRP带着数据返回后被传递给对应事件系统处理,系统再紧接着发送下一个IRP_MJ_READ请求。
驱动程序创建一个键盘设备,附加在键盘类KbdClass设备栈上顶。
创建过滤驱动设备123456789101112131415161718192021222324252627282930NTSTATUS AttachKdbClass(PDEVICE_OBJECT pDevObj) { DbgPrint("Enter HookKdbClass\n"); NTSTATUS status = STATUS_SUCCESS; UNICODE_STRING ustrObjectName; P ...
WindowsAPI编程核心技术-SSDT_Hook
WindowsAPI编程核心技术-SSDT HookSSDT入门SSDT系统服务描述符表。SSDT把Ring3的WIN32 API函数与Ring0的内核API函数联系起来。Ring3下一些API最终对应于ntdll.dll里的一个以“Nt”为前缀的函数。例如CreateFile最终会调用ntdll.dll里的NtCreateFile函数,NtCreateFile将系统服务号放入EAX,再调用系统服务分发函数KiSystemService进入到内核中,这样完成一次系统服务调用。
SSDT Hook就是修改此表的函数地址,对常用的Windows函数进行挂钩,对一些核心系统动作进行过滤、监控。
获取SSDT函数索引号ZwCreateSection创建一个节对象。
123456789NTSTATUS ZwCreateSection( _Out_ PHANDLE SectionHandle, //接收段对象句柄 _In_ ACCESS_MASK DesiredAccess, //请求的对象访问 SECTION_MAP_READ SECTION_MAP_WRITE 读取/编写该部分视图 ...
Windows驱动开发入门-Minifilter示例代码
Windows驱动开发入门-Minifilter示例代码NPminifilter.inf、DLL源代码、应用层源代码在教程节都有完整的,这里不贴了。
NPminifilter.c123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 ...
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。
编 ...
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; //下面将我们特殊关注的分发函数重新赋值为我们自己的处理函数 Driver ...
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 ...