请问如何当前输入是键盘输入的还是远程桌面模拟输入的?如何让输入框不被HOOK拦截?

这个还能被注册? 2009-10-22 10:54:10
如题,主要是想防止客户端被人恶意控制的情况下进行操作,判断当前的输入是本地引起的还是远程引起的,请高人指点!!!还有一个问题,如何让输入框不被HOOK拦截?有解决方案了立马结贴!另开贴送分200答谢大侠!!!
...全文
111 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
谢谢楼上的
_see_you_again_ 2009-10-22
  • 打赏
  • 举报
回复
钩子函数的反拦截

请留意前面带*号注释的代码,其中传入了钩子的句柄g_hhookKey,只要使用API钩子将CallNextHookEx函数替换,并在替换函数中将其卸载,消息钩子就完蛋了。同时,还要保证本进程安装的钩子不被卸载,其中既可能有local类型的还可能有remote类型的。不要以为自己没有在程序中安装钩子,程序中就一定没有安装钩子,在MFC4版本中,MFC会自己装一个local类型的钩子,MFC7版本中好像没了。好了,下面介绍其实现。
1、建立DLL,在头文件中添加如下代码。

#ifdef HOOKFORBID_EXPORTS
#define HOOKFORBID_API __declspec(dllexport)
#else
#define HOOKFORBID_API __declspec(dllimport)
#endif

HOOKFORBID_API int fnHookForbid(void);//在exe程序中调用此函数,使DLL加载
HOOKFORBID_API bool AddHhook(HHOOK Hhook);//若exe中安装remote类型消息钩子,将其句柄添加
HOOKFORBID_API bool DelHhook(HHOOK Hhook);//在exe中卸载remote类型消息钩子时,删除其句柄

2、在.cpp文件中添加代码。

CArray<HHOOK,HHOOK> array;//用于记录本进程安装的钩子的句柄
//////////////////////////////////////////////////////////////////////////////
int fnHookForbid(void)
{
return 1;
}

bool AddHhook(HHOOK Hhook)
{
array.Add(Hhook);
return true;
}

bool DelHhook(HHOOK Hhook)
{
bool ret=false;
for(int i=0;i<array.GetSize();i++)
{
if(array.GetAt(i)==Hhook)
{
array.RemoveAt(i);
ret=true;
break;
}
}
return ret;
}
//////////////////////////////////////////////////////////////////////////////

下面的代码用于API替换,其中用到了CAPIHook 类,《Windows 核心编程》(Jeffrey Richter著)一书中有源代码。使用其它开发包也可以实现此功能。

//////////////////////////////////////////////////////////////////////////////
typedef HHOOK (WINAPI *PFNSETWINDOWSHOOKEX)(
int idHook,
HOOKPROC lpfn,
HINSTANCE hMod,
DWORD dwThreadId
);

typedef LRESULT (WINAPI *PFNCALLNEXTHOOKEX)(
HHOOK hhk,
int nCode,
WPARAM wParam,
LPARAM lParam
);
//////////////////////////////////////////////////////////////////////////////

extern CAPIHook g_SetWindowsHookExA;
extern CAPIHook g_SetWindowsHookExW;
extern CAPIHook g_CallNextHookEx;

//////////////////////////////////////////////////////////////////////////////

//此函数用于替换SetWindowsHookEx函数的ASCII版本SetWindowsHookExA
HHOOK WINAPI Hook_SetWindowsHookExA( int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId )
{
HHOOK nResult =0;

nResult = ((PFNSETWINDOWSHOOKEX)(PROC) g_SetWindowsHookExA)( idHook, lpfn, hMod, dwThreadId );

//若在本进程中安装了local类型钩子,记录其句柄
if(hMod==NULL)
array.Add(nResult);

return(nResult);
}

//此函数用于替换SetWindowsHookEx函数的UNICODE版本SetWindowsHookExW
HHOOK WINAPI Hook_SetWindowsHookExW( int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId )
{
HHOOK nResult =0;

nResult = ((PFNSETWINDOWSHOOKEX)(PROC) g_SetWindowsHookExW)( idHook, lpfn, hMod, dwThreadId );

//若在本进程中安装了local类型钩子,记录其句柄
if(hMod==NULL)
array.Add(nResult);

return(nResult);
}

//此函数用于替换CallNextHookEx函数,此函数只有一个版本
LRESULT WINAPI Hook_CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam)
{
LRESULT nResult =0;

nResult = ((PFNCALLNEXTHOOKEX)(PROC) g_CallNextHookEx)( hhk, nCode, wParam, lParam );

//在数组中查找句柄,若找不到,将其卸载
bool bfind=false;
for(int i=0;i<array.GetSize();i++)
{
if(array.GetAt(i)==hhk)
{
bfind=true;
break;
}
}
if(!bfind)
{
UnhookWindowsHookEx( hhk );
}
return (nResult);
}

//////////////////////////////////////////////////////////////////////////////

//使用CAPIHook 类对函数进行替换
CAPIHook g_SetWindowsHookExA("User32.dll", "SetWindowsHookExA",
(PROC) Hook_SetWindowsHookExA, true);

CAPIHook g_SetWindowsHookExW("User32.dll", "SetWindowsHookExW",
(PROC) Hook_SetWindowsHookExW, true);

CAPIHook g_CallNextHookEx("User32.dll", "CallNextHookEx",
(PROC) Hook_CallNextHookEx, true);

到了这里,所有工作都完成了,只要在exe程序中调用fnHookForbid函数,并在安装remote类型钩子时调用AddHhook函数记录其句柄,卸载时调用DelHhook函数删除句柄就万事ok了。

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧