⑴ 可疑鍵盤過濾驅動是個什麼東東,登錄網銀時才提示有的。
有些盜號軟體是通過記錄鍵盤輸入信息來盜取網銀信息的,所使用的程序接近鍵盤驅動,可以鍵盤過濾驅動就是將這些程序過濾掉,確保安全
⑵ 如何同時過濾USB/PS2鍵盤驅動
你發錯地方了,應該發在編程區的。抱歉幫不了你。
⑶ 怎麼讓無沖突的鍵盤產生沖突
按照如下步驟開發一個鍵盤過濾驅動程序:
1 設置分發常式
2 將過濾驅動程序attach到系統的鍵盤設備上;
3 創建線程,用於記錄擊鍵行為;
......
主要是要捕獲,IRP_MJ_READ請求,對於其他的IRP請求,直接將其傳遞給下層設備對象處理;捕獲後根據自己的需要進行更改;
⑷ USB過濾驅動開發
《USB Design By Example》(http://www.usb-by-example.com)的作者John Hyde實現了一個USB鍵盤過濾驅動程序,即給此程序增內加了一個「攔截(Intercept)」功能容來處理USB鍵盤的Report以實現特定的功能:當驅動程序在IRP_MJ_INTERNAL_DEVICE_CONTROL設置的完成常式從USB設備攔截到一個Get_Report_Descriptor時,攔截程序將此Descriptor中的USAGE值從「Keyboard」改為「UserDefined」,再返回給系統。
⑸ 求 鍵盤過濾驅動程序 的講解
好...好大條
⑹ 如何構造一個簡單的USB過濾驅動程序
一、基本原理抄 我們知道,WDM(和KDM)是分層的,在構造設備棧時,IO管理器可以使一個設備對象附加到另外一個初始驅動程序創建的設備對象上。與初始設備對象相關的驅動程序決定的IRP,也將被發送到附加的設備對象相關的驅動程序上。
⑺ 如何把ndis filter框架利用到日膚indows驅動開發工作中
NDIS Filter NET_BUFFER_LIST NET_BUFFER MDL
1
網路數據結構如下圖:
5
第二種方法:
/*******************************************************************GetNetBufferData函數的功能:從1個NET_BUFFER裡面獲取數據。1個NET_BUFFER裡面含有1個或者多個的MDL*******************************************************************/VOIDGetNetBufferData(PNET_BUFFERNetBuffer,PUCHAROutputBuffer,ULONGOutputBufferSize,PULONGOutputBytesCopied){PMDLMdl=NetBuffer->CurrentMdl;*OutputBytesCopied=0;if(NetBuffer->DataLength>OutputBufferSize){#ifDBGDbgPrint("Notenoughoutputbufferspace,in:%d,out:%d ",NetBuffer->DataLength,OutputBufferSize);#endifreturn;}NdisMoveMemory(OutputBuffer,(PUCHAR)MmGetSystemAddressForMdlSafe(Mdl,LowPagePriority)+NetBuffer->CurrentMdlOffset,Mdl->ByteCount-NetBuffer->CurrentMdlOffset);OutputBuffer+=Mdl->ByteCount-NetBuffer->CurrentMdlOffset;*OutputBytesCopied+=Mdl->ByteCount-NetBuffer->CurrentMdlOffset;////循環MDL鏈表,獲取每一個結點的數據,數據被保存到OutputBuffer裡面//OutputBuffer的空間不斷地擴大。//當鏈表不為空,並且OutputBuffer的長度<1個NET_BUFFER的總長度while(((Mdl=Mdl->Next)!=NULL)&&(*OutputBytesCopied<NetBuffer->DataLength)){NdisMoveMemory(OutputBuffer,MmGetSystemAddressForMdlSafe(Mdl,LowPagePriority),Mdl->ByteCount);OutputBuffer+=Mdl->ByteCount;//數據被保存到OutputBuffer裡面*OutputBytesCopied+=Mdl->ByteCount;//OutputBuffer的空間不斷地擴大}if(Mdl!=NULL){NdisMoveMemory(OutputBuffer,MmGetSystemAddressForMdlSafe(Mdl,LowPagePriority),NetBuffer->DataLength);OutputBuffer+=Mdl->ByteCount;*OutputBytesCopied+=Mdl->ByteCount;}#ifDBGDbgPrint("buffercopied:%dbytes ",*OutputBytesCopied);#endif}
6
上面的2種方法,只是獲取數據。而原本NDISFilter框架提供的這4個函數默認的代碼,都沒有做任何操作,沒有實質性質的功能,這4個函數原本默認的代碼,我們都不需要,因為我們的驅動程序需要處理網路數據包。這4個函數分別是:
7
在我們的NDISFilter工程裡面,我們需要修改掉這4個函數的功能,把它們替換成我們所想要的功能。比如,你在發送數據包或者接收數據包的時候,需要實現自己的一些業務邏輯,而不是去使用MicrosoftNDISFilter提供的原始代碼的功能。
8
函數的功能:NDIS調用把發送的結構和數據返還給FilterDriver。NDIS可以收集多次NdisFSendNetBufferLists發送的結構和數據形成一個單鏈表傳遞給。除非到NDIS調用,否則一個發送請求的當前狀態總是未知的。一個過濾驅動是不能在NDIS調用返回結構之前對NET_BUFFER_LIST和其關聯的數據做檢查的。要完成一個發送請求完成後的任何必要的後繼處理。當NDIS調用時,FilterDriver就重新獲地對結構及結構相關資源的所有權。可以在中釋放相關的資源和准備下一個NdisFSendNetBufferLists調用。NDIS總是按照過濾驅動調用NdisFSendNetBufferLists提交的順序傳遞給下層驅動,但是回返的順序則是任意的。FilterDriver可以請求一個回環發送請求,只要把NdisFSendNetBufferLists的SendFlags設置成NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK就行了。NDIS會引發一個包含發送數據的接收包指示。
9
一個FilterDriver應該對自己引發的發送請求保持跟蹤並確保在完成時不調用NdisFSendNetBufferComplete常式。
步驟閱讀
10
FilterSendNetBufferLists函數的功能:NDIS調用一個FilterDriver的FilterSendNetBufferLists常式來過濾上層驅動的發送請求。FilterDriver不能改變其它驅動傳來的NET_BUFFER_LIST結構中的SourceHandle成員的值。它可以過濾數據並發送過濾的數據到下層驅動。
11
對每一個提交到FilterSendNetBufferLists的NDIS_BUFFER_LIST,我們可做下面的操作:
1)可以把緩沖區通過NdisFSendBufferLists傳遞給下層驅動,NDIS保證上下文空間對FilterDriver的有效性。過濾驅動可以在發送前修改緩沖區的內容。可以像處理自己引發的發送請求的緩沖區一樣處理這個緩沖區。2)可以調用拒絕傳遞這個包3)排隊緩沖區內容到本地的供以後處理。例如要在一定超時後處理或要接收到特定包後才處理等。如果支持這種處理方式就要支持取消請求的操作。4)可以拷貝緩沖區並引發一個發送請求。它類似自己引發一個發送請求,但必須先調用NdisFSendNetBufferComplete返回上層驅動的緩沖區。
12
發送請求在驅動棧繼續完成,當一個微埠驅動調用完成一個發送請求時,NDIS會調用微埠
13
在一個發送操作完成後,FilterDriver可以做在FilterSendNetBufferLists中所有修改的相反操作。返回一個NET_BUFFER_LIST結構的單鏈表和發送請求的最終狀態給上層的驅動。當最頂層的FilterMole的被調用完成後NDIS會調用引發發送請求的協議驅動的。如果FilterDriver不提供FilterSendNetBufferLists它還是可以引發一個發送操作的,但它必須提供一個並且不能在這個常式里把這個事件傳遞給上層驅動。
14
一個FilterDriver可以傳遞或過濾一個上層驅動的回環請求,要傳遞一個回環請求,NDIS會設置FilterSendNetBufferLists的SendFlags參數為NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK,FilterDriver在調用NdisFSendNetBufferLists時把這個標記傳給它即可。在回環請求的情況下NDIS會指示一個包含發送數據的接收包。
15
如果一個FilterDriver修改的任何行為不是NDIS提供的標准服務,那麼它應該當自己為NDIS提供相應的服務。例如,如果一個FilterDriver修改了一個硬體地址請求,就必須處理直接到這個新地址回環包。在這種情況下,因為FilterDriver已經更改了地址NDIS是不能提供一個回環服務的。
16
_Use_decl_annotations_VOIDFilterSendNetBufferLists(NDIS_HANDLEFilterMoleContext,PNET_BUFFER_LISTNetBufferLists,NDIS_PORT_NUMBERPortNumber,ULONGSendFlags){PMS_FILTERpFilter=(PMS_FILTER)FilterMoleContext;PNET_BUFFERNetBuffer;UCHARTempBuffer[MAX_BUFFER_SIZE];ULONGBytesCopied;pEthHdrEthernetHeader;pIPHdrIpHeader;#ifDBGDbgPrint(">>>FilterSendNetBufferLists:%p ",NetBufferLists);#endiffor(NetBuffer=NetBufferLists->FirstNetBuffer;NetBuffer!=NULL;NetBuffer=NetBuffer->Next){GetNetBufferData(NetBuffer,TempBuffer,MAX_BUFFER_SIZE,&BytesCopied);if(BytesCopied==0){#ifDBGDbgPrint("Netbuffercatcherror ");#endif}else{EthernetHeader=TempBuffer;if(EthernetHeader->Type==0x0800)//乙太網類型{IpHeader=EthernetHeader+sizeof(EthHdr);//去掉乙太網頭,抓出IP頭#ifDBGDbgPrint("Getippacket ");#endif}}}NdisFSendNetBufferLists(pFilter->FilterHandle,NetBufferLists,PortNumber,SendFlags);}
17
FilterReturnNetBufferLists函數的功能:如果FilterDriver設置了的狀態為NDIS_STATUS_SUCCESS,NDIS通過驅動的FilterReturnNetBufferLists返回指示數據。在這種情況下FilterDriver失去了對NET_BUFFER_LIST的所有權,直到FilterReturnNetBufferLists被調用。FilterDriver調用NdisFIndicateNetBufferLists傳遞接收指示給驅動棧上的上層驅動,如果上層驅動保留了對緩沖區(NET_BUFFER_LIST)的所有權,NDIS會調用FilterDriver的FilterReturnNetBufferLists常式。在FilterReturnNetBufferLists中應該撤消在接收路徑上(如在FilterReciveNetBufferLists中做的一些處理)的操作。當最底層的FilterMole完成對緩沖區(NET_BUFFER_LIST)的處理後,NDIS把緩沖區返回給微埠驅動。如果FilterReceiveNetBufferLists的ReceiveFlags沒有設置NDIS_RECEIVE_FLAGS_RESOURCES標記,FilterDriver調用NdisFReturnNetBufferList返回這個緩沖區數據,如果設置了FilterReceiveNetBufferLists直接返回時就把緩沖區返還給了下層微埠驅動。
步驟閱讀
18
FilterReceiveNetBufferLists函數的功能:FilterDriver調用來指示發送數據。這個函數通過NET_BUFFER_LIST結構給上層驅動指示數據。FilterDriver可以從池中分配這個結構。如果FilterDriver設置了的狀態為NDIS_STATUS_SUCCESS,NDIS通過驅動的FilterReturnNetBufferLists返回指示數據。在這種情況下FilterDriver失去了對NET_BUFFER_LIST的所有權直到FilterReturnNetBufferLists被調用。如果FilterDriver在調用時設置ReceiveFlags為NDIS_RECEIVE_FLAGS_RESOURCES,在函數返回後FilterDriver會立即恢復對NET_BUFFER_LIST的所有權,這時FilterDriver必須立即處理這個NET_BUFFER_LIST的返回,因為NDIS在這種情況下是不會調用FilterReturnNetBufferLists返回NET_BUFFER_LIST結構的。注意:一個FilterDriver應該跟蹤自己引發的接收指示確保它在FilterReturnNetBufferLists中不調用NdisFReturnNetBufferLists。
19
_Use_decl_annotations_(NDIS_HANDLEFilterMoleContext,PNET_BUFFER_LISTNetBufferLists,NDIS_PORT_NUMBERPortNumber,ULONGNumberOfNetBufferLists,ULONGReceiveFlags){PMS_FILTERpFilter=(PMS_FILTER)FilterMoleContext;PNET_BUFFERNetBuffer;UCHARTempBuffer[MAX_BUFFER_SIZE];ULONGBytesCopied;pEthHdrEthernetHeader;pIPHdrIpHeader;#ifDBGDbgPrint(">>>FilterReceiveNetBufferLists:%p ",NetBufferLists,ReceiveFlags,NumberOfNetBufferLists);#endifdo{for(NetBuffer=NetBufferLists->FirstNetBuffer;NetBuffer!=NULL;NetBuffer=NetBuffer->Next){GetNetBufferData(NetBuffer,TempBuffer,MAX_BUFFER_SIZE,&BytesCopied);if(BytesCopied==0){#ifDBGDbgPrint("Netbuffercatcherror ");#endif}else{EthernetHeader=TempBuffer;if(EthernetHeader->Type==0x0800){IpHeader=EthernetHeader+sizeof(EthHdr);#ifDBGDbgPrint("IPpacketexist ");#endif}}}}while(FALSE);
20
調用來指示發送數據。如果FilterDriver設置了的狀態為NDIS_STATUS_SUCCESS,NDIS通過驅動的FilterReturnNetBufferLists返回指示數據。如果FilterDriver設置了的ReceiveFlags值為NDIS_RECEIVE_FLAGS_RESOURCES,那麼在函數返回後FilterDriver會立即恢復對NET_BUFFER_LIST的所有權,這時FilterDriver必須立即處理這個NET_BUFFER_LIST的返回。在這種情況下是不會調用FilterReturnNetBufferLists返回NET_BUFFER_LIST結構的。