看流星社区

 找回密码
 注册账号
查看: 3321|回复: 3

ring3改KernelCallbackTable防键盘钩子

[复制链接]

该用户从未签到

发表于 2014-3-4 15:21:16 | 显示全部楼层 |阅读模式
__declspec(naked) test()
{

  _asm
  {
    ret
    jmp oldaddr
  }
}

DWORD * KernelCallbackTable = NULL;
_asm
{
     push eax
     mov eax,dword ptr fs:[0x18]
     mov eax,dword ptr ds:[eax+0x30]
     mov eax,dword ptr ds:[eax+0x2C]
     mov KernelCallbackTable, eax
     pop eax
}
DWORD old = 0;
if(VirtualProtect(&KernelCallbackTable[40], sizeof(PVOID),PAGE_EXECUTE_READWRITE, &old))
{
  oldaddr = KernelCallbackTable[40];
  KernelCallbackTable[40] = (DWORD)test;
}

前几天研究windows的消息机制时偶尔发现。
通过修改KernelCallbackTable内供ring3回调用ring0的函数分派表实现

该用户从未签到

发表于 2014-3-4 15:21:31 | 显示全部楼层
HideTool就是这么做的,不过人家是在驱动实现的,在ntdll领空内找一个ret

另外,你这个硬编码40是从哪来的,好像不对,各平台上是不一样的。

该用户从未签到

发表于 2014-3-4 15:21:52 | 显示全部楼层
跟这个不一样吧,防全局钩子拦ClientLoadLibrary,XP下是66,不知道你的40是哪来的。。
查了下XPSP2的40是fnHkINDWORD,不知道你拦截了什么。也能拦键盘钩子?离奇了吧 呵呵

XP SP2的callback函数对照表

01       fnCOPYDATA
02       fnCOPYGLOBALDATA
03       fnDWORD
04       fnNCDESTROY
05       fnDWORDOPTINLPMSG
06       fnINOUTDRAG
07       fnGETTEXTLENGTHS
08       fnINCNTOUTSTRING
09       fnPOUTLPINT
10       fnINLPCOMPAREITEMSTRUCT
11       fnINLPCREATESTRUCT
12       fnINLPDELETEITEMSTRUCT
13       fnINLPDRAWITEMSTRUCT
14       fnINLPHLPSTRUCT
15       fnINLPHLPSTRUCT
16       fnINLPMDICREATESTRUCT
17       fnINOUTLPMEASUREITEMSTRUCT
18       fnINLPWINDOWPOS
19       fnINOUTLPPOINT5
20       fnINOUTLPSCROLLINFO
21       fnINOUTLPRECT
22       fnINOUTNCCALCSIZE
23       fnINOUTLPSCROLLINFO
24       fnINPAINTCLIPBRD
25       fnINSIZECLIPBRD
26       fnINDESTROYCLIPBRD
27       fnINSTRINGNULL
28       fnINSTRINGNULL
29       fnINDEVICECHANGE
30       fnINOUTNEXTMENU
31       fnLOGONNOTIFY
32       fnOPTOUTLPDWORDOPTOUTLPDWORD
33       fnOPTOUTLPDWORDOPTOUTLPDWORD
34       fnOUTDWORDINDWORD
35       fnOUTLPRECT
36       fnPOUTLPINT
37       fnINLPHLPSTRUCT
38       fnPOUTLPINT
39       fnSENTDDEMSG
40       fnINOUTSTYLECHANGE
41       fnHkINDWORD
42       fnHkINLPCBTACTIVATESTRUCT
43       fnHkINLPCBTCREATESTRUCT
44       fnHkINLPDEBUGHOOKSTRUCT
45       fnHkINLPMOUSEHOOKSTRUCTEX
46       fnHkINLPKBDLLHOOKSTRUCT
47       fnHkINLPMSLLHOOKSTRUCT
48       fnHkINLPMSG
49       fnHkINLPRECT
50       fnHkOPTINLPEVENTMSG
51       ClientCopyDDEIn1
52       ClientCopyDDEIn2
53       ClientCopyDDEOut1
54       ClientCopyDDEOut2
55       ClientCopyImage
56       ClientEventCallback
57       ClientFindMnemChar
58       ClientFontSweep
59       ClientFreeDDEHandle
60       ClientFreeLibrary
61       ClientGetCharsetInfo
62       ClientGetDDEFlags
63       ClientGetDDEHookData
64       ClientGetListboxString
65       ClientGetMessageMPH
66       ClientLoadImage
67       ClientLoadLibrary
68       ClientLoadMenu
69       ClientLoadLocalT1Fonts
70       ClientLoadRemoteT1Fonts
71       ClientPSMTextOut
72       ClientLpkDrawTextEx
73       ClientExtTextOutW
74       ClientGetTextExtentPointW
75       ClientCharToWchar
76       ClientAddFontResourceW
77       ClientThreadSetup
78       ClientDeliverUserApc
79       ClientNoMemoryPopup
80       ClientMonitorEnumProc
81       ClientCallWinEventProc
82       ClientWaitMessageExMPH
83       ClientWOWGetProcModule
84       ClientWOWTask16SchedNotify
85       ClientImmLoadLayout
86       ClientImmProcessKey
87       fnIMECONTROL
88       fnINWPARAMDBCSCHAR
89       fnGETTEXTLENGTHS
90       fnINLPKDRAWSWITCHWND
91       ClientLoadStringW
92       ClientLoadOLE
93       ClientRegisterDragDrop
94       ClientRevokeDragDrop
95       fnINOUTMENUGETOBJECT
96       ClientPrinterThunk
97       fnOUTLPCOMBOBOXINFO
98       fnOUTLPSCROLLBARINFO

该用户从未签到

发表于 2014-3-4 15:22:12 | 显示全部楼层
看了一下,你这样根本不叫真正拦键盘钩子,确实,在xxxHkCallHook时,最后会调用到fnHkINDWORD的键盘钩子调用,可以通过40拦截

可惜的是,这件事是做在用ClientLoadLibrary把键盘钩子加载到目标进程之后,此时DLL已在目标进程,实际上根本无需再多做一层调用,目标DLL就可以做键盘拦截和过滤动作,即使你拦截了这个调用,也只是表面拦住了常规键盘钩子而已!
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-14 19:11

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

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