好友
阅读权限40
听众
最后登录1970-1-1
|
Windows 系统热键是通过
RegisterHotKey
来注册的 通过 UnregisterHotKey l来注销的
但是没有提供相关查询函数,在想是否可以提供一个函数查询所有热键信息
网上找了下,然后用IDA了看了Win32k.sys一下 翻了下源码 把相关结构贴了出来
大家一起来研究下
热键保存的结构为
typedef struct tagHOTKEY
{
PDWORD pti; // 也是 PPETHREAD
PDWORD spwnd; //指向窗口句柄 PHWND
WORD fsModifiers; // MOD_SHIFT, MOD_ALT, MOD_CONTROL, MOD_WIN
WORD wFlags; // MOD_SAS
UINT vk; //
int id; //热键ID
struct tagHOTKEY *phkNext; //下一个热键结构
} HOTKEY, *PHOTKEY;
系统
常量定义
#define MOD_ALT 0x0001
#define MOD_CONTROL 0x0002
#define MOD_SHIFT 0x0004
#define MOD_LEFT 0x8000
#define MOD_RIGHT 0x4000
而系统热键是存在win32k!gphkFirst 以头部的单链结构
所以只要得到这个变量地址 然后遍历所有结构就可以了
lkd> u win32k!FindHotKey
win32k!FindHotKey:
bf890dd3 8bff mov edi,edi
bf890dd5 55 push ebp
bf890dd6 8bec mov ebp,esp
bf890dd8 8b4d20 mov ecx,dword ptr [ebp+20h]
bf890ddb 832100 and dword ptr [ecx],0
bf890dde 83652000 and dword ptr [ebp+20h],0
bf890de2 53 push ebx
bf890de3 56 push esi
lkd> u
win32k!FindHotKey+0x11:
bf890de4 8b35d8fb9abf mov esi,dword ptr [win32k!gphkFirst (bf9afbd8)]
bf890dea 85f6 test esi,esi
bf890dec 57 push edi
bf890ded 7420 je win32k!FindHotKey+0x6a (bf890e0f)
bf890def 8b7d0c mov edi,dword ptr [ebp+0Ch]
bf890df2 33db xor ebx,ebx
bf890df4 43 inc ebx
bf890df5 8b16 mov edx,dword ptr [esi]
lkd> dd win32k!FindHotKey+13
bf890de6 bf9afbd8 7457f685 0c7d8b20 8b43db33
bf890df6 08553b16 8b669774 3b660846 13741445
bf890e06 768bfe8b 75f68514 20458be6 5d5b5e5f
bf890e16 8b001cc2 453b0c46 83e57518 7500047e
bf890e26 08553b05 1989da75 06e8d6eb 3bfff709
bf890e36 9aeccc05 c76975bf 0001fc45 60eb0000
bf890e46 90909090 55ff8b90 5151ec8b 00fc6583
bf890e56 358b5653 bf9af078 107d8b57 7f116580
lkd> dd bf9afbd8
bf9afbd8 e5c989a8 00000000 e3d47570 00000000
bf9afbe8 e730ba78 e730ba78 00000000 bb68a368
bf9afbf8 00000000 e32157e8 00000000 bb5d1150
bf9afc08 e5b934a0 bb5d1190 e5ed7a30 bb5d11b0
bf9afc18 00000000 bb5d1170 00000000 bb5d11d0
bf9afc28 0000000a 00000004 00000004 00000000
bf9afc38 00000000 00000000 000927c0 00000000
bf9afc48 00000000 00000000 00000000 00000000
lkd> dd e5c989a8
e5c989a8 e2f3e900 bb761930 00000003 0000004d
e5c989b8 0000c04b e57b1c58 00010404 31616c47
e5c989c8 0c0d0401 5546744e 0058070e e5d34008
e5c989d8 00000000 00000000 00000000 e6942bb0
e5c989e8 00000040 00000002 0001a5f1 008d0000
e5c989f8 00011761 02430000 8ffe2410 00000001
e5c98a08 2e080c66 01cd5f15 00000000 00000000
e5c98a18 00000c5d 00000010 003c0004 00350042
e57b1c58 为下一个热键地址
lkd> dd e57b1c58
e57b1c58 e2f3e900 bb761930 00000003 000000bb
e57b1c68 0000c04a e1276860 0c410404 74536d4d
e57b1c78 2c6a08c0 00000000 35cbc8c0 00000000
e57b1c88 38dfd8c0 00000000 366be8c0 00000000
e57b1c98 369ff8c0 00000000 39f408c0 00000000
e57b1ca8 368818c0 00000000 2e4428c0 00000000
e57b1cb8 324438c0 00000000 307848c0 00000000
e57b1cc8 332458c0 00000000 36c868c0 00000000
lkd> dd e2f3e900
e2f3e900 8a250020 00000001 00000000 02f10cb0
e2f3e910 00d90d20 00000000 00000000 00000000
e2f3e920 00000000 00000000 00000000 e5971cf8
e2f3e930 e716c008 e24ced38 bb69f640 8ac38038
e2f3e940 bb640650 7ffdf6cc 01100020 00000000
e2f3e950 00000000 00000000 00000000 00c73fdf
e2f3e960 e75bb358 00000000 0000009c 00000000
e2f3e970 00000000 00000000 00000000 00000000
lkd> !object 8a250020
Object: 8a250020 Type: (8b1adca0) Thread
ObjectHeader: 8a250008 (old version)
HandleCount: 4 PointerCount: 6
lkd> dd bb761930
bb761930 000b0418 0000000d e2f3e900 8ac38038
bb761940 bb761930 00020000 80000300 00000008
bb761950 8c000000 0ad80000 00000000 bb69dbf0
bb761960 bb761d28 bb6406e8 00000000 bb69dbf0
bb761970 00000000 00000000 00000000 00000000
bb761980 00000000 00000000 00000000 00000000
bb761990 0ade6500 bb75f930 00000000 bb69dd68
bb7619a0 00000000 00000000 00000000 00000000
000b0418 为窗口句柄
使用 GetWindowThreadProcessId GetProcessImageFileName 可以获得进程全路径
win32k地址和映像大小可以使用
NtQuerySystemInformation
SystemModuleInformation
获得
读取可以使用
NtSystemDebugControl 8号功能
提取特征码
static BYTE s_staticCode[0x10] = {0x8b,0xff,0x55,0x8b,0xec,0x8b,0x4d,0x20,0x83,0x21,0x00,0x83,0x65,0x20,0x00,0x53};
搜索就可以了,XP测试可以通过
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|