WindowsAPI编程核心技术-Minifilter文件监控
WindowsAPI编程核心技术-Minifilter文件监控这节不讲Minifilter,只讲实现,入门Minifilter看驱动篇。
拦截IRP请求本节在FLT_OPERATION_REGISTRATION中设置IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_WRITE、IRP_MJ_SET_INFORMATION,分别对应文件创建、读取、写入、属性修改等。
123456789101112131415161718192021// operation registrationCONST FLT_OPERATION_REGISTRATION Callbacks[] = { { IRP_MJ_CREATE, 0, Minifilter_FileMonitor_TestPreOperation, Minifilter_FileMonitor_TestPostOperation }, { IRP_MJ_READ, 0, Minifilter_FileMonitor_ ...
WindowsAPI编程核心技术-对象监控
WindowsAPI编程核心技术-对象监控碎碎念对象监控指的是线程句柄对象、进程句柄对象、桌面句柄对象的监控。
这个技术病毒木马常用。病毒木马的对象监控回调常用来会自行线程或进程的保护,保护指定程序不被杀毒软件或用户强制结束运行。结束进程时要获取打开的进程句柄,所以病毒木马通过对进程对象进行监控,使系统获取句柄失败,从而实现进程保护。
前置芝士ObRegisterCallbacks注册线程、进程和桌面句柄操作的回调函数。驱动程序必须有数字签名。
1234NTSTATUS ObRegisterCallbacks( _In_ POB_CALLBACK_REGISTER CallBackRegistration, //指定回调例程列表和其他注册信息 _Out_ PVOID* RegistrationHandle //接收已注册回调例程集合的标识)
用ObUnRegisterCallbacks注销回调例程。
OB_CALLBACK_REGISTRATION1234567typedef struct _OB_CALLBACK_REGISTRATION { _In_ ...
WindowsAPI编程核心技术-注册表监控
WindowsAPI编程核心技术-注册表监控前置芝士CmRegisterCallback注册注册表监控例程。卸载用CmUnRegisterCallback。
12345NTSTATUS CmRegisterCallback( _In_ PEX_CALLBACK_FUNCTION Function, //回调例程地址 _In_opt_ PVOID Context, //例程参数 一般空余 _Out_ PLARGE_INTEGER Cookie //回调例程标识/句柄)
PEX_CALLBACK_FUNCTION回调函数。
12345NTSTATUS RegistryCallback( _In_ PVOID CallbackContext, //参数 _In_opt_ PVOID Argument1, //操作类型 _In_opt_ PVOID Argument2 //操作信息)
Argument1的结构如下:
1234567891011121314151617181920212223242526272829303132333435363738394 ...
WindowsAPI编程核心技术-模块加载监控
WindowsAPI编程核心技术-模块加载监控前置芝士PsSetLoadImageNotifyRoutine设置模块加载回调函数,完成模块加载时通知回调函数。
123NTSTATUS PsSetLoadImageNotifyRoutine( _In_ PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine //指向回调函数);
可通过PsRemoveLoadImageNotifyRoutine删除回调。
PLOAD_IMAGE_NOTIFY_ROUTINE回调函数。
12345VOID SetLoadImageNotifyRoutine( _In_opt_ PUNICODE_STRING FullImageName, //标识可执行映像文件 _In_ HANDLE ProcessId, //加载模块所属进程ID 驱动程序为0 _In_ PIMAGE_INFO ImageInfo);
IMAGE_INFO1234567891011121314151617181920typedef struct _IMAGE_INFO { ...
WindowsAPI编程核心技术-进线程监控
WindowsAPI编程核心技术-进线程监控进线程枚举进程枚举:
1234567891011121314151617181920212223242526272829#include <ntifs.h>NTKERNELAPI UCHAR* PsGetProcessImageFileName(IN PEPROCESS Process); //未公开的进行导出即可NTKERNELAPI HANDLE PsGetProcessInheritedFromUniqueProcessId(IN PEPROCESS Process);//未公开进行导出// 根据进程ID返回进程EPROCESS结构体,失败返回NULLPEPROCESS LookupProcess(HANDLE Pid){ PEPROCESS eprocess = NULL; NTSTATUS Status = STATUS_UNSUCCESSFUL; Status = PsLookupProcessByProcessId(Pid, &eprocess); if (NT_SUCCES ...
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; PFILE_OBJECT ...
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 ...