xuetr0.33版本增加了进程的快捷键的查看,

于是乎查了下资料,找到了实现的方法,不敢独享和大家分享一下~~~

其实Windows的所有的快捷键保存在win32k里面的一个单向连表里面,

链表里面的结构体如下:

代码:
typedef struct _HOT_KEY_ITEM
{
  LIST_ENTRY ListEntry;
  struct _ETHREAD *Thread;
  HWND hWnd;
  int id;
  UINT fsModifiers;
  UINT vk;
} HOT_KEY_ITEM, *PHOT_KEY_ITEM;
从_KTHREAD结构可以得到进程,fsModifiers和vk加起来就是组合键了。

所以关键是怎么找到那个单向链表

可以通过从导出函数查找内存的方法找到这个单向链表

首先是从shadow ssdt里的NtUserUnregisterHotKey函数开始查找

代码:
win32k!NtUserUnregisterHotKey:

(大段省略...)

912d32f8 e888ffffff      call    win32k!_UnregisterHotKey (912d3285)

(大段省略...)
然后在_UnregisterHotKey 里面找FindHotKey函数

代码:
win32k!_UnregisterHotKey:

(大段省略...)

912d32a0 e8cffaffff      call    win32k!FindHotKey (912d2d74)

(大段省略...)
最后从FindHotKey函数里面找到那个单向链表

这个时候XP和Win7的处理有所不同

代码:
win32k!FindHotKey:

(大段省略...)

XP的时候
bf89e4b4 8b35d4cb9abf    mov     esi,dword ptr [win32k!gphkFirst (bf9acbd4)]

Win7的时候
912d2d84 8b3495009b4891 mov     esi,dword ptr win32k!gphkHashTable (91489b00)[edx*4]

(大段省略...)

gphkFirst /gphkHashTable 就是那个单向链表了,

最后只要循环这个单向链表就可以枚举所有的快捷键了~~~