Win7下屏幕取词 HOOK
目前的情况是这样的:
屏幕取词的功能,之前在winXP及以下的操作系统中一直运行稳定,但在win7操作系统下时常导致explorer.exe挂掉,我们的代码直接来源于网上的一个很古旧的屏幕取词动态库,下面是一些细节,请大家帮忙分析一下问题及原因
1,系统使用的应该是APIHOOK
2,hook了 BitBlt, TextOutA, TextOutW, ExtTextOutA, ExtTextOutW 这几个API,这里是不是还需要hook LoadLibraryA,LoadLibraryW 等等??
3,hook了之后, 在WIN7的桌面或右键菜单下,每次都能成功的进入NHExtTextOutW,但是不够稳定,explorer时常崩溃,被同事告之可能是win7的DEP保护问题,是不是真的这样?
4,由于对那个古旧的动态库基本没什么修改,所以在win7下桌面图标取得的实际上是字体的字符索引,之前的程序中没有对这种情况做处理,显示的是乱码, 现在我想加入GetFontUnicodeRanges函数到NHExtTextOutW中进行对字符索引到字符编码的转换,但是这样基本上10次有9次崩溃了,而当我将NHExtTextOutW里面的内容都注释掉后,系统则变得稳定,基本不蹦(但是还是有蹦的情况),我怀疑是不是内容加多了,处理过程慢引发的多线程冲突?
Answers
DEP和Hook的方式(APIHOOK)不是造成Win7下屏幕取词崩溃的原因。
DEP :是为了防止软件漏洞中的溢出,微软推出的防御措施。是保护栈溢出的。当把输入copy到申请的栈内存(函数中申请的局部内存)中时,由于栈内存大小小于输入大小,会把栈中的返回地址覆盖,导致跳到自己构造的恶意代码中执行。微软的办法是不让栈中的代码执行,即把这块内存的执行权限去掉。但也是有一些办法绕过的。Hook ExtTextOutW函数并不是覆盖函数返回地址,所以不是这个原因。
APIHOOK :属于Hook的一种,采用替换PE文件导入表的方法,使程序执行时调用我们自己的函数。Win7并没有对替换PE文件导入表的方法做限制,也不是这个原因。
由于我不能看到你的NHExtTextOutW的实现,所以只能根据你的描述做如下推测:
你说的系统崩溃,实际上都是explorer崩溃了。explorer.exe的一项主要任务是显示桌面图标,它实际上是一个ListView控件。它调用”BitBlt, TextOutA, TextOutW, ExtTextOutA, ExtTextOutW“这几个函数的频率很高,explorer处理不过来,就僵死了。尤其是Win7对显示效果做过优化,调用这几个函数更频繁。
解决方
法:
1.对于桌面图标不需要屏幕取词,在程序中判断下,是explorer.exe进程则不用注入dll。
2.应该还是“NHExtTextOutW”中的代码有问题,比如申请的buffer被越界了、代码流程太长了(导致explorer.exe处理不过来)等。
另外,hook LoadLibraryA,LoadLibraryW完全没有必要,跟要实现的功能没有关系。