我Hook了SOCKET库中的任意函数,这儿就以send函数为例。
启动钩子之后,在钩子启动之前已运行的使用SOCKET的程序一切正常,仍然可以访问网络
但之后启动的程序却没法再访问网络。经过调试发现,一旦启动了钩子之后,在这之后启动的程序运行WSAStartup时运行失败,
报告的错误是WSASYSNOTREADY (WinSock的实现不能正常工作),由此导致了不能再访问网络
请问这是怎么回事,该如何解决呢? 求高手指点一下请问之前有人Hook过Socket库中函数吗,有碰到这个问题吗?
启动钩子之后,在钩子启动之前已运行的使用SOCKET的程序一切正常,仍然可以访问网络
但之后启动的程序却没法再访问网络。经过调试发现,一旦启动了钩子之后,在这之后启动的程序运行WSAStartup时运行失败,
报告的错误是WSASYSNOTREADY (WinSock的实现不能正常工作),由此导致了不能再访问网络
请问这是怎么回事,该如何解决呢? 求高手指点一下请问之前有人Hook过Socket库中函数吗,有碰到这个问题吗?
钩子是全局的,注入方式有消息钩子注入和远程线程注入二种可以选择,不过结果一样。刚才看了一遍文章,http://community.csdn.net/Expert/TopicView1.asp?id=3692183
和我的其实是同一个问题(WSASYSNOTREADY 的错误编号就是10093),
其中雅克医生提到:WinSock的API最好是不用API HOOK,而是用SPI.好像以前记得有人说过Socket的Hook比较特别,是不是指的就是这个?
IE 的send/WSARecv 也能HOOK到, 但启动钩子后再开新的IE的话,这个新IE就不能连上网络了。
不太明白你的意思,“用lib的方法导入动态库”这是什么意思啊?
你的意思是指在我已经挂钩的情况下,如果我要正常调用SOCKET的话,就要用动态调用的方式来执行?
但IE里调用SOCKET的方式是我没法控制的,
难道是挂钩WSAStartup,在这其中再次动态导入SOCK库?不知道我理解的对不对?
没事 :)
今天心情一般,所以来结帖了。WSAStartup在运行时会检查SOCKET库中各个函数的地址,如果用了IAT方式Hook了的话,
地址就变得不匹配了,所以WSAStartup就失败了。
如果用的是修改2进制代码的方式Hook的话,由于他的入口点没变(他在原来的入口点处用jmp语句进行了跳转来实现Hook的),所以WSAStartup不会失败。解决方法:
一 Hook WSAStartup,强制返回TRUE。这种方法后开的IE可以正常访问网络了,但MSN还是不行,不知道为啥 :(
二 换一种Hook方式,目前我用的是mad,还不错,98和2000下都挺稳定的
三 改用其他的方式实现网络数据的拦截 如 NDIS