能力值:
( LV12,RANK:210 )
|
-
-
2 楼
#include <stdio.h>
#include <Windows.h>
void _declspec(naked) NtUserCallOneParam()
{
__asm
{
mov eax, 1143h //XP:1143;2003:1142;Win7:114E
mov edx, 7FFE0300h
call dword ptr [edx]
retn 8
}
}
LRESULT CALLBACK lpfn (int nCode, WPARAM wParam, LPARAM lParam)
{
return CallNextHookEx (NULL, nCode, wParam, lParam);
};
void main()
{
int idHook;
HHOOK Hooktest= SetWindowsHookEx(WH_CALLWNDPROCRET,(HOOKPROC)lpfn, GetModuleHandle(NULL), 0);
__asm
{
push 30h
push Hooktest //已找到的钩子句柄
call NtUserCallOneParam
mov eax,[eax+18h]
mov idHook,eax
}
printf("%d",idHook); //钩子类型
}
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
十分感谢。
这段代码很精简。
但是Hooktest如果在之前被UnhookWindowsHookEx了,再用这段代码,就会应用程序错误。也就是要确保HHOOK存在的情况下,但是HHOOK好像没有判断的代码?窗体句柄有IsWindow,那HHOOK是什么呢?
|
能力值:
( LV12,RANK:210 )
|
-
-
4 楼
HHOOK跟HWND一样也是个句柄,如果被UnhookWindowsHookEx了,或者是个无效句柄,NtUserCallOneParam返回值就是0,这就需要你自己在call NtUserCallOneParam后添加对EAX判断了。
另外 push 30h 中的30h在XP/2003/Win7下是不同的
|
|
|