Windows钩子—我的需求

作者利用Windows钩子技术开发了一个程序,该程序能在编辑器输入内容时不显示出来,但内容会被保存到指定文件,以此来避免领导的监视。

我一直在利用工作时间写文章,这并不能说明我不爱工作一心做自己的事,而是因为我做事非常迅速,往往将分内的工作完成以后没有事干,可是领导就不愿意了,他们不可能让我闲着,然而我又十分不情愿接受新的任务而没有得到任务额外的报酬,于是我就写一些linux方面的文章,领导当然不愿意了,他们看到我在写文章总会过来说我几句。他们怎么能看到我在写文章呢?很简单,只要我一写,他们当然能看到我写的内容,于是他们就过来了,告诉我还有别的任务要做,我讨厌这种方式,于是我想通过我的老本行避开这样的骚扰。我一向对linux感兴趣,但是这并不能说我对别的就没有兴趣,我对windows也是十分了解的,只不过我不喜欢它罢了,说实话我一开始的第一份工作就是做windows驱动的,呵呵。我对windows还是有自己的理解的,特别是windows钩子方面的内容。

既然我不想让领导看到我在做什么,那么我就有必要写一个程序来实现这一个需求,谁让咱是干这的呢!于是我想写一个程序,要点就是我输入编辑器比如“记事本”的内容不回显,但是我输入的内容却已经保存在了另外的一个位置。这个很简单,利用windows钩子就可以做到,但是必须理解windows的消息机制,这个对于我来说已经不再话下了,我对windows钩子还是十分了解的,于是我就写了一个程序,该程序运行以后无论我往编辑器写什么内容都不会被回显,但是我写的内容却已经保存在了文件里面,呵呵,道高一尺魔高一丈,我就是这样避开领导的监视的。

啥也不说了,先看我的程序的核心内容,其实就是写了一个全局钩子,该钩子钩住了所有的windows消息,然后用我自己的方式处理了以后再发送,钩子的具体定义如下:

HHOOK hHook = NULL; //钩子句柄

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)

{

PMSG pmsg = (PMSG)lParam;

if(nCode != HC_ACTION)

return 0;

if(pmsg->message==WM_IME_COMPOSITION)

{

HIMC handle;

DWORD size;

HWND hWnd = pmsg->hwnd;

if(pmsg->lParam & GCS_RESULTSTR)

{

char buff[128];

handle = ImmGetContext(hWnd); //这些API都是MS提供了输入法API,学习它们是没有意义的,用着了查就得了。

size = ImmGetCompositionString(handle, GCS_RESULTSTR,NULL, 0);

size += sizeof(WCHAR);

memset(buff, 0, sizeof(buff));

ImmGetCompositionString(handle, GCS_RESULTSTR, buff, size); //得到输入的中文字符串

fp = fopen( "c://dd.txt","a+");

fwrite( lpstr,strlen(buff),1,fp ); //将中文输入法的输入汉字写入文件

fclose(fp);

pmsg->lParam = 0; //重置消息,这样的话消息就被更改了,于是编辑器上就显示不出你输入的中文字符串了。

pmsg->wParam = 0

ImmReleaseContext(hWnd, handle);

}

}

return 0;

}

void hook()

{

hHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)HookProc,/*this dll*/,0);

}

再写一个应用程序加载这个钩子,大功就告成了,就是这么简单,钩子函数的具体内容注释都有,如果不理解加之谁想用的话,直接复制就可以,呵呵。加载这个钩子以后,我写的任何内容都会被保存在c:/dd.txt文件里面,如此一来,领导就不会看到我写的是什么了,猛吧?其实windows挺好的,无论你有什么需求,它都会满足你的。

说到这里我不得不发一番感慨了,windows竟然提供了这么多策略性的API,在unix/linux中这是绝对不可能的。你可以看看MS的MSDN几乎什么都有的,你只要需要一个功能,它都会满足你的,这看起来十分不错,但是很艺术吗?不!我现在有点喝多了,有点语无伦次,但是,我还是十分欣赏unix的那种方式:策略由用户自己实现,而十分反 ”感windows的方式:为用户提供策略性的API。 像“ 输入法”这一类的API简直太“策略“化了,真的不明白为何windows的设计者要为用户提供如此的API。

不过还好,我既然用windows的API解决了我的一个实际问题,那么我就没有什么好说的了。感谢我现在用windows系统,感谢我们都用windows系统。

其实对于这个钩子我还有一些要说的,这不关windows和unix/linux的比较,而是仅仅对于windows钩子说的,如果你截获WH_KEYBOARD钩子的话,你在钩子函数里面的到的仅仅是一个键盘消息的副本,而不是键盘消息的真实值,但是WH_GETMESSAGE不一样,他所得到的就是消息的指针,你更改的指针就是实际消息。这样的话,你所得到的 lParam其实就是消息的指针值,这样的话,你就可以更改消息了,具体的流程如何还请参见windows的消息流程啦。

一款改自IPHook的IP数据包监控过滤程序 By ccc 2009-6-13 完成(ch2zh1@tom.com) IP包过滤程序采用IPHook驱动器程序,在内核层用钩子回调函数(IpHookFilter)勾住系统自带的IP过滤驱动器(System32\Drivers\IpFltDrv.sys),从而返回过滤驱动器传输的所有IP包数据。可以通过回调函数的返回值(PF_DROP、PF_FORWARD、PF_PASS),指示滤波驱动器对包的处理,是抛弃还是通过。 应用启动驱动器过程可以使用驱动器的安装,或使用系统的服务控制器(ServiceControl)直接启动和停止驱动程序。 服务控制器利用OpenSCManager等服务控制函数控制驱动程序的加载与卸载。这就使得应用程序可以在运行时自动加载和卸载需要的驱动程序。而不必设置驱动程序的安装过程。 初始的IPHook.sys只提供了IP包的监视过程即,仅仅返回IP头信息。在应用中解释并显示这个头信息。经过写改的IPHook增加了对IP包的过滤处理,有几个设置命令: START_IP_HOOK :启动钩子过滤命令,建立连接IP滤波器的回调函数(原始命令) STOP_IP_HOOK :停止钩子过滤命令,撤销IP滤波器回调函数(原始命令) ADD_IP_HOOKADDR :添加过滤IP地址,回调函数判断IP包,以决定是放弃还是通过(新命令) DEL_IP_HOOKADDR :删除过滤IP地址(新命令) ADD_IP_HOOKPORT :添加过滤端口号(新命令) DEL_IP_HOOKPORT :删除过滤端口号(新命令) ADD_IP_OVER_HOOK :添加置换的IP地址,用于对指定目的的IP包置换源地址和端口号(New) DEL_IP_OVER_HOOK :取消IP地址置换。(New) 应用程序可一次设置和删除对个滤波地址和端口号。对于重复设置,IPHook可以正确识别并加以剔除。这是一个演示程序主要想说明windows2000驱动程序编程过程,及应用自动加载和卸载驱动的方式。 驱动程序的源码在DrvChecked.rar中,要想正确编译,必须安装windows2000 DDK,并在VS2003下设置包含目录指向DDK的目录,库目录也要指向DDK的库目录: C:\NTDDK\inc C:\NTDDK\inc\ddk C:\NTDDK\libchk\i386 并且在排列上一定要排在头两个位置上。 这个驱动程序在VC++下是可以正确编译通过的。驱动程序名:DrvChecked.sys。使用时应该改为:iphook.sys。delphi下的应用程序为:IPPacketMonitor.exe,它使用IPHook.sys。 任何人可以自己编译和修改这个驱动程序,使之能够按照一定的方式运行,这里给出的只是本人的一个想法,希望能给各位带来一点帮助。任何应用程序都可以想打开文件一样使用这个驱动程序,关于使用方法请参考Release Notes.htm提供的线索。 有什么问题和建议请电邮:ch2zh1@tom.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值