Power Word

来源:互联网 发布:mysql 查看存储引擎 编辑:程序博客网 时间:2024/05/18 03:20

刚提到这个问题,所以去查了一下。当然金山也有相应的补丁,但是好像还是会有问题。我用的2005。

翻译软件等关键技术之一就是拦截操作系统的显示函数,从中抓到显示的单词,这点大家都明白不用再多说。比如金山词霸会拦截系统库GDI32.DLL的输出函数ExtTextOutA等,拦截方法是找到这个函数地址,在这入口填写一个JMP 指令,跳转到金山词霸的一个入口,当然其也保存了这个入口开始被JMP指令覆盖的几个字节。金山词霸的这个入口里面又要用这个函数,所以其得到控制权后又恢复了ExtTextOutA这个函数开始的指令,进行调用。这种不好的钩子处理办法就埋下了祸根。可能是其内部信号标记等处理不好,某种情况下钩子想调用恢复后的ExtTextOutA函数的时候,但可能没有恢复成功,就又进入了金山词霸的钩子,这样就导致循环了,堆栈迅速消耗,最终因为堆栈消耗完再进行堆栈操作的时候出现非法操作而导致程序关闭退出。
    这就告诉我们如果钩子里面要调用要钩的函数本身,最好要错过钩子。比如在函数入口用写JMP指令做钩子,那么再调用的时候最好调用其下面的哪个入口,或者钩子种在上面调用这个函数的指令那。要不就要保证恢复入口指令一定正确。再就是注意重入问题,就是钩子里面再调用别的函数的时候可能别的函数会用到钩子钩的函数,那你就得保证你的代码是可重入的。其实写过病毒的人恐怕都或多或少接触了重入问题。

未完。。。。。。。。

=============================

原文时间:2005.07.23
原文地址:http://mnky.bokee.com/2358527.html