我Hook了SOCKET库中的任意函数,这儿就以send函数为例。
启动钩子之后,在钩子启动之前已运行的使用SOCKET的程序一切正常,仍然可以访问网络
但之后启动的程序却没法再访问网络。经过调试发现,一旦启动了钩子之后,在这之后启动的程序运行WSAStartup时运行失败,
报告的错误是WSASYSNOTREADY (WinSock的实现不能正常工作),由此导致了不能再访问网络
请问这是怎么回事,该如何解决呢? 求高手指点一下请问之前有人Hook过Socket库中函数吗,有碰到这个问题吗?

解决方案 »

  1.   

    哦,忘记说明了   
    钩子是全局的,注入方式有消息钩子注入和远程线程注入二种可以选择,不过结果一样。刚才看了一遍文章,http://community.csdn.net/Expert/TopicView1.asp?id=3692183
    和我的其实是同一个问题(WSASYSNOTREADY 的错误编号就是10093),
    其中雅克医生提到:WinSock的API最好是不用API HOOK,而是用SPI.好像以前记得有人说过Socket的Hook比较特别,是不是指的就是这个?
      

  2.   

    我想也是因为sock函数比较特殊,所以与一般的API hook有差别
      

  3.   

    我曾经hook过oe里用到的send/WSARecv这些函数,没有遇到过你说的问题,我用的是WINDOWS核心编程里用的方法.不知道你是用什么方式hook的
      

  4.   

    我用的也是WINDOWS核心编程里提供的APIHook类(他原来的BUG已经修正了,应该不是API Hook本身的问题,因为其他的函数我都能正常Hook的),
    IE 的send/WSARecv 也能HOOK到,  但启动钩子后再开新的IE的话,这个新IE就不能连上网络了。
      

  5.   

    我也遇到了,好像不能用lib的方法导入动态库,那样WSAStartup就用不了了。用LoadLibrary,然后用GetProcAddress来调用函数就可以了
      

  6.   

    我发现在hook socket函数时,在你自己的hook函数中调用getsockname或者getpeername时会造成数据传输错误,从而导致之后的socket失败.
      

  7.   

    to smart_jing(尾巴)
        不太明白你的意思,“用lib的方法导入动态库”这是什么意思啊?
      

  8.   

    隐式调用不行。原来我是在project->setting里面link的lib,然后把.h文件导入的方法,这种方法就会使WSAStartup不能用#pragma comment(lib,"***")也一样不能用显示调用可以。在需要的地方用LoadLibrary("***.dll")就可以了
      

  9.   

    to smart_jing(尾巴)
    你的意思是指在我已经挂钩的情况下,如果我要正常调用SOCKET的话,就要用动态调用的方式来执行?
    但IE里调用SOCKET的方式是我没法控制的,
    难道是挂钩WSAStartup,在这其中再次动态导入SOCK库?不知道我理解的对不对?
      

  10.   

    to smart_jing(尾巴)
        没事 :)
      

  11.   

    好像挂了好久了,一直没心情结帖。
    今天心情一般,所以来结帖了。WSAStartup在运行时会检查SOCKET库中各个函数的地址,如果用了IAT方式Hook了的话,
    地址就变得不匹配了,所以WSAStartup就失败了。
    如果用的是修改2进制代码的方式Hook的话,由于他的入口点没变(他在原来的入口点处用jmp语句进行了跳转来实现Hook的),所以WSAStartup不会失败。解决方法:
    一 Hook WSAStartup,强制返回TRUE。这种方法后开的IE可以正常访问网络了,但MSN还是不行,不知道为啥  :(
    二 换一种Hook方式,目前我用的是mad,还不错,98和2000下都挺稳定的
    三 改用其他的方式实现网络数据的拦截  如 NDIS