c++ :线程级钩子会被杀毒软件拦截吗?
1、线程钩子一般是win操作系统所有的,它的根本是win底层API的功能调用。
一般使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中。
具体的做法不是这里讨论的话题。
2、从上面的说法可知,win提供了这种标准的做法。
即然提供,那就是不禁止,就是可以做的事,所以,理论上,杀毒软件不应对这种调用进行拦截。
3、然而话说回来,杀毒软件也是人去编写的,它的具体行为也只是编写者的思想的体现,比如很多国产杀防软件,连一些稍敏感的注册表的改写,比如起动项、IE主页的改变也会进行拦截与提示。
4、很多恶意软件、病毒软件,因为其运行机理是切入别的应用的调用过程中,切入用户的输入中断中,所以会使用线程钩子来进行触发,所以,杀毒软件对这类的行为进行拦截与提示也是可以理解的。
5、新版的win,比如win7及其后的版本的win对这类的操作有一定的限制性,比如需要管理员帐户,比如需要打开“数据持行保护”等等。
钩子按装失败
一、 介绍 本文将讨论在.NET应用程序中全局系统钩子的使用。
为此,我开发了一个可重用的类库并创建一个相应的示例程序(见下图)。
你可能注意到另外的关于使用系统钩子的文章。
本文与之类似但是有重要的差别。
这篇文章将讨论在.NET中使用全局系统钩子,而其它文章仅讨论本地系统钩子。
这些思想是类似的,但是实现要求是不同的。
二、 背景 如果你对Windows系统钩子的概念不熟悉,让我作一下简短的描述: ?一个系统钩子允许你插入一个回调函数-它拦截某些Windows消息(例如,鼠标相联系的消息)。
?一个本地系统钩子是一个系统钩子-它仅在指定的消息由一个单一线程处理时被调用。
?一个全局系统钩子是一个系统钩子-它当指定的消息被任何应用程序在整个系统上所处理时被调用。
已有若干好文章来介绍系统钩子概念。
在此,不是为了重新收集这些介绍性的信息,我只是简单地请读者参考下面有关系统钩子的一些背景资料文章。
如果你对系统钩子概念很熟悉,那么你能够从本文中得到你能够得到的任何东西。
?关于MSDN库中的钩子知识。
?Dino Esposito的《Cutting Edge-Windows Hooks in the .NET Framework》。
?Don Kackman的《在C#中应用钩子》。
本文中我们要讨论的是扩展这个信息来创建一个全局系统钩子-它能被.NET类所使用。
我们将用C#和一个DLL和非托管C++来开发一个类库-它们一起将完成这个目标。
三、 使用代码 在我们深入开发这个库之前,让我们快速看一下我们的目标。
在本文中,我们将开发一个类库-它安装全局系统钩子并且暴露这些由钩子处理的事件,作为我们的钩子类的一个.NET事件。
为了说明这个系统钩子类的用法,我们将在一个用C#编写的Windows表单应用程序中创建一个鼠标事件钩子和一个键盘事件钩子。
这些类库能用于创建任何类型的系统钩子,其中有两个预编译的钩子-MouseHook和KeyboardHook。
我们也已经包含了这些类的特定版本,分别称为MouseHookExt和KeyboardHookExt。
根据这些类所设置的模型,你能容易构建系统钩子-针对Win32 API中任何15种钩子事件类型中的任何一种。
另外,这个完整的类库中还有一个编译的HTML帮助文件-它把这些类归档化。
请确信你看了这个帮助文件-如果你决定在你的应用程序中使用这个库的话。
MouseHook类的用法和生命周期相当简单。
首先,我们创建MouseHook类的一个实例。
mouseHook = new MouseHook();//mouseHook是一个成员变量 接下来,我们把MouseEvent事件绑定到一个类层次的方法上。
mouseHook.MouseEvent+=new MouseHook.MouseEventHandler(mouseHook_MouseEvent); // ... private void mouseHook_MouseEvent(MouseEvents mEvent, int x, int y){ string msg =string.Format("鼠标事件:{0}:({1},{2}).",mEvent.ToString(),x,y); AddText(msg);//增加消息到文本框 } 为开始收到鼠标事件,简单地安装下面的钩子即可。
mouseHook.InstallHook(); 为停止接收事件,只需简单地卸载这个钩子。
mouseHook.UninstallHook(); 你也可以调用Dispose来卸载这个钩子。
在你的应用程序退出时,卸载这个钩子是很重要的。
让系统钩子一直安装着将减慢系统中的所有的应用程序的消息处理。
它甚至能够使一个或多个进程变得很不稳定。
因此,请确保在你使用完钩子时一定要移去你的系统钩子。
我们确定在我们的示例应用程序会移去该系统钩子-通过在Form的Dispose方法中添加一个Dispose调用。
protected override void Dispose(bool disposing) { if (disposing) { if (mouseHook != null) { mouseHook.Dispose(); mouseHook = null; } // ... } } 使用该类库的情况就是如此。
该类库中有两个系统钩子类并且相当容易扩充。
四、 构建库 这个库共有两个主要组件。
第一部分是一个C#类库-你可以直接使用于你的应用程序中。
该类库,反过来,在内部使用一个非托管的C++ DLL来直接管理系统钩子。
我们将首先讨论开发该C++部分。
接下来,我们将讨论怎么在C#中使用这个库来构建一个通用的钩子类。
就象我们讨论C++/C#交互一样,我们将特别注意C++方法和数据类型是怎样映射到.NET方法和数据类型的。
你可能想知道为什么我们需要两个库,特别是一个非托管的C++ DLL。
你还可能注意到在本文的背景一节中提到的两篇参考文章,其中并没有使用任何非托管的代码。
为此,我的回答是,"对!这正是我写这篇文章的原因"。
当你思考系统钩子是怎样实际地实现它们的功能时,我们需要非托管的代码是十分重要的。
为了使一个全局的系统钩子能够工作,Windows把你的DLL插入到每个正在运行的进程的进程空间中。
既然大多数进程不是.NET进程,所以,它们不能直接执行.NET装配集。
我们需要一种非托管的代码代理- Windows可以把它插入到所有将要被钩住的进程中。
首先是提供一种机制来把一个.NET代理传递到我们的C++库。
这样,我们用C++语言定义下列函数(SetUserHookCallback)和函数指针(HookProc)。
int SetUserHookCallback(HookProc userProc, UINT hookID) typedef void (CALLBACK *HookProc)(int code, WPARAM w, ...
有什么杀毒软件能完全防止键盘钩子?
一般情况下,病毒挂钩子是为了截取信息。
键盘hook跟键盘输入有关,因此这里的Hook可以实现一些键盘记录等功能,当这里出现Hook,要仔细辨认是否为恶意的键盘记录器,正常程序也可能Hook这里。
题主可以下载个杀毒软件,类似腾讯电脑管家或者360,首先用软件全盘查杀下,然后把防火墙以及各种防护措施都打开,这样可以相对提高网络安全系数。
在今后的使用过程中,要经常用电脑管家定期清理自己的垃圾,以保持自己的计算机常用常新,使用电脑管家进行有效的拦截、清杀病毒,定期全盘扫描下,来保障你电脑的安全。
钩子也分几种,有进程钩子,就是只是捕获某一个特定进程的键盘输入。
有程序钩子,只捕获某一个程序的键盘输入。
还有全局钩子,可以捕获所有进程或者程序的键盘输入。
捕获就是说钩子程序能获取你输入的信息,比方说原来有一些QQ木马就是安装键盘钩子,用于记录你输入的QQ号和密码,又或者一些游戏的盗号程序就是这样的。
所以我们在日常使用中一定要定期清理电脑中的垃圾,时常杀毒,养成良好的电脑使用习惯,创造更安全的上网环境。
编程里说的 钩子和勺子是什么
Windows系统中钩子具有相当强大的功能,通过这种技术可以对几乎所有的Windows 系统中的消息进行拦截、监视、处理。
这种技术可以广泛应用于各种软件,尤其是需要有监控、自动记录等对系统进行监测功能的软件。
VB编程中钩子的实现(一)钩子函数(HOOK Function)的格式。
Hook Function实际上是一个函数,如果是系统钩子,该函数必须放在动态链接库中。
该函数有一定的参数格式,在VB中如下:Private Function HookFunc(ByVal nCode As Long,ByVal wParam As Long,ByVal lParam As Long)As Long 其中,nCode代表是什么情况之下所产生的钩子,随钩子的不同而有不同组的可能值;参数wParam,lParam传回值包括了所监视到的消息内容,它随Hook所监视消息的种类和nCode的值不同而不同。
对于用VB所设置的钩子函数,一般的框架形式如下:Private Function HookFunc(ByVal nCode As Long,ByVal wParam As Long,ByVal lParam As Long)As LongSelect case of nCode case ncodecase值1:处理过程1:HookFunc=X1case2:处理过程2:HookFunc=X1……end selectend Function 函数的传回值,如果消息要被处理,则传0,否则传1,吃掉消息。
(二)钩子的安装及执行。
钩子的安装要用到几个API函数:可以使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中。
SetWindowsHookEx()函数的声明如下:Declare function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA"(ByVal idHook As Long,ByVal lpfn As Long,ByVal hmod As Long,ByVal dwThreadId As Long)As Long idHook值为它处理的消息类型;lpfn值为钩子子程序的地址指针。
如果dwThreadId参数为0或是一个由别的进程创建的线程的标识,lpfn必须指向DLL中的钩子子程。
除此以外,lpfn可以指向当前进程的一段钩子子程代码。
hMod值为应用程序的句柄,标识包含lpfn所指的子程的DLL。
如果dwThreadId标识当前进程创建的一个线程,而且子程代码位于当前进程,hMod必须为0。
dwThreadId值为与安装的钩子子程相关联的线程的标识符,如果为0,钩子子程与所有的线程关联。
钩子安装成功则返回钩子子程的句柄,失败返回0。
另外,一般应在钩子子程中调用CallNextHookEx()函数以执行钩子链表所指的下一个钩子子程,否则安装了别的钩子的应用程序就会收不到钩子通知,从而产生错误的结果。
CallNextHookEx()函数的声明如下:Declare Function CallNextHookEx Lib"user32" Alias "CallNextHookEx"(ByVal hHook As Long,ByVal ncode As Lonog, ByVal wParam As Long,lParam As Any)As Long hHook值是SetWindowsHookEx()的传回值,nCode、wParam、lParam则是Hook函数中的三个参数。
在程序终止之前,必须调用UnhookWindowsHookEx()函数释放与钩子关联的系统资源。
UnhookWindowsEx()函数声明如下:Declare Function Unhook WindowsHookEx Lib "user32" Alias "Unhook WindowsHookEx(ByVal hHook As Long)As Long hHook为安装钩子时的返回值,即钩子子程的句柄。
大家看我电脑加载驱动 加载的全局钩子是什么 我上图片了
“加载全局钩子”说白了就是全局的监控一个程序如果加载了全局钩子那基本就可以说这个程序可以监控到你在计算机上的一举一动一般认为除了杀毒软件一类的程序加载全局钩子是正常现象之外,其余程序有类似动作都可以认为可疑。
如果你不知道这个程序是干什么的,那就更可疑了(杀毒软件需要监控其他所有程序以分析是否是病毒,所以类似于加载全局钩子的行为可以认为是正常的,不过其实杀毒软件也不一定加载全局钩子,因为监控的方法很多,而加载全局钩子的监控手段又并不是非常有效。
)危害必然是有的,很多流行的木马和后门都是要加载全局钩子的~能监控到你的一举一动,那你还有什么隐私和秘密可言呢?解决方法当然是用杀毒软件清理了~其他的方案也可以使用XueTr或者IceSword一类的工具手动清除这些钩子~祝您好运!!!
进程如何检测自己是否被安装了钩子?
如果你的描述没错,你自个开办了一个网站,否则下面的就不用看了。
要防止挂马,主要是以下几条: 一、禁止有人随意进入与改动你的网站里的网页源码,做到防黑。
1、最主要是系统不要有漏洞。
2、关闭所有不应开放的端口。
3、定期查看端口进程情况。
4、保证源码无问题。
5、定期查毒。
6、尽可能不在服务器上运行任何不必要在服务器上运行的软件。
这样就可以保证你的服务器上不会有木马等恶意软件。
二、注意源码漏洞。
某些别人做好的源码可能会产生跨站联接,这些联接可以使来访者经你的网站跨入到别人的网站中背地里下载木马。
对此情况的防止主要是通过网站管理者的经验及这些源码的补丁及网上公布的一些方法去对付。
三、来访者本身做好系统漏洞补丁也是一个非常有效的方法,此外,可以让发现问题的朋友以留言等方法告知网站管理者,以及时发现此类现象,采用有效的方法去解决它。
c#鼠标钩子问题
用mouse_event发送鼠标右键事件。
如果仅是恶作剧的话,修改右手鼠标为左手鼠标就行了。
鼠标钩子,八成会被杀毒软件干掉。
[DllImport("user32.dll")]static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo);enum MouseEventFlag : uint{Move = 0x0001,LeftDown = 0x0002,LeftUp = 0x0004,RightDown = 0x0008,RightUp = 0x0010,MiddleDown = 0x0020,MiddleUp = 0x0040,XDown = 0x0080,XUp = 0x0100,Wheel = 0x0800,VirtualDesk = 0x4000,Absolute = 0x8000}
键盘钩子失灵
VB编程中钩子的实现及应用 Windows系统中钩子具有相当强大的功能,通过这种技术可以对几乎所有的Windows 系统中的消息进行拦截、监视、处理。
这种技术可以广泛应用于各种软件,尤其是需要有监控、自动记录等对系统进行监测功能的软件。
本文针对这个专题进行了探讨,希望可以为读者朋友们起到抛砖引玉的作用。
一、钩子的机制及类型 Windows的应用程序都是基于消息驱动的,应用程序的操作都依赖于它所得到的消息的类型及内容。
钩子与Dos中断截获处理机制有类似之处。
钩子(Hook)是Windows消息处理机制的一个平台,通过安装各种钩子,应用程序可以在上面设置子程序以监视指定窗口的某种消息,并且当消息到达目标窗口之前处理它。
在Windows中,钩子有两种,一种是系统钩子(RemoteHook),它对消息的监视是整个系统范围,另一种是线程钩子(LocalHook),它的拦截范围只有进程内部的消息。
对于系统钩子,其钩子函数(HookFunction)应在Windows系统的动态链接库(DLL)中实现,而对于线程钩子来说,钩子函数可以在DLL之中实现,也可以在相应的应用程序之中实现。
这是因为当开发人员创建一个钩子时,Windows先在系统内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去,并且新的钩子将排在老的钩子的前面。
当一个事件发生时,如果安装的是一个局部钩子,当前进程中的钩子函数将被调用。
如果是一个远程钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点就要求钩子函数必须在一个动态链接库中,所以如果想要使用远程钩子,就必须把该钩子函数放到动态链接库中去。
对于钩子所监视的消息类型来说,Windws一共提供了如下几种类型:如表1所示:表一、Windows消息类型 消息类型常量标识 值 消息类型 适用范围 WH_CALLWNDPROC4 发给窗口的消息 线程或系统 WH_CALLWNDPROCRET12 窗口返回的消息 线程或系统 WH_CBT5 窗口变化、焦点设定等消息 线程或系统 WH_DEBUG 9 是否执行其它Hook的Hook 线程或系统 WH_FOREGROUNDIDLE11 前台程序空闲 线程或系统 WH_GETMESSAGE 3 投放至消息队列中的消息 线程或系统 WH_JOURNALPLAYBACK1 将所记载的消息进行回放 系统 WH_JOURNALRECORD0 监视并记录输入消息 系统 WH_KEYBOARD 2 键盘消息 线程或系统 WH_MOUSE7 鼠标消息 线程或系统 WH_MSGFILTER-1 菜单滚动条、对话框消息 线程或系统 WH_SHELL10 外壳程序的消息 线程或系统 WH_SYSMSGFILTER6 所有线程的菜单滚动条、对话框消息 系统 二、VB编程中钩子的实现 (一)钩子函数(HOOK Function)的格式。
Hook Function实际上是一个函数,如果是系统钩子,该函数必须放在动态链接库中。
该函数有一定的参数格式,在VB中如下:Private Function HookFunc(ByVal nCode As Long,ByVal wParam As Long,ByVal lParam As Long)As Long 其中,nCode代表是什么情况之下所产生的钩子,随钩子的不同而有不同组的可能值;参数wParam,lParam传回值包括了所监视到的消息内容,它随Hook所监视消息的种类和nCode的值不同而不同。
对于用VB所设置的钩子函数,一般的框架形式如下:Private Function HookFunc(ByVal nCode As Long,ByVal wParam As Long,ByVal lParam As Long)As Long Select case of nCode case ncode case值1:处理过程1:HookFunc=X1 case2:处理过程2:HookFunc=X1 …… end select end Function 函数的传回值,如果消息要被处理,则传0,否则传1,吃掉消息。
(二)钩子的安装及执行。
钩子的安装要用到几个API函数:可以使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中。
SetWindowsHookEx()函数的声明如下:Declare function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA"(ByVal idHook As Long,ByVal lpfn As Long,ByVal hmod As Long,ByVal dwThreadId As Long)As Long idHook值为它处理的消息类型;lpfn值为钩子子程序的地址指针。
如果dwThreadId参数为0或是一个由别的进程创建的线程的标识,lpfn必须指向DLL中的钩子子程。
除此以外,lpfn可以指向当前进程的一段钩子子程代码。
hMod值为应用程序的句柄,标识包含lpfn所指的子程的DLL。
如果dwThreadId标识当前进程创建的一个线程,而且子程代码位于当前进程,hMod必须为0。
dwThreadId值为与安装的钩子子程相关联的线程的标识符,如果为0,钩子子程与所有的线程关联。
钩子安装成功则返回钩子子程的句柄,失败返回0。
另外,一般应在钩子子程中调用CallNextHookEx()函数以执行钩子链表所指的下一个钩子子程,否则安装了别的钩子的应用程序就会收不到钩子通知,从而产生错误的结果。
CallNextHookEx()函数的声明如下:Declare Function CallNextHookEx Lib"user32" Alias "CallNextHookEx"(ByVal hHook As Long,ByVal ncode As Lonog, ByVal wParam As Long,lParam As Any)As Long hHook值是...
DLL注入后hook钩子未运行
好久不写SDK程序了。
。
都快忘光了,汗~~1、在case DLL_PROCESS_ATTACH:前面再加句 case DLL_THREAD_ATTACH:因为不一定是进程加载这个DLL,某个线程也一样。
2、你在主程序里是怎样调用的?是静态加载DLL,还是用LoadLibrary动态加载的?3、你的Hook回调函数没有运行,也不排除第三方因素,现在WH_GETMESSAGE类型的钩子,很敏感,你应该知道,键盘记录器都是用这个实现的,很多杀软坑爹的主动防御都会拦截这个特征的程序;或是你要注入的那个程序,本身有反Hook机制,就是在系统中注册一个优先级更高的Hook,来拦截你的Hook,那就要先把它卸载掉。
最后,你要知道TX的程序员不是SB,他们就是靠这个吃饭的,会让你……