我成功截获了 TextOutW(...) TextOutA(...) 等 win32 api 函数也成功截获了 wsock32.dll 里的 recv 和 recvfrom 函数。但是偏偏 wsock32.dll 里的 send 和 sendto 函数无法很成功的截获。
(当截获这两个函数的时候,icq 软件会说:初始化socket错误,
可是截获 recv 却没问题,能够正常得到 icq 的 recv 的数据)为什么呢???

解决方案 »

  1.   

    对不起,我也在做这方面的编程,我可以截获在一些常用dll中的函数,(如User32.dll中的MessageBoxA等)但一旦截获recv等函数,它总是报告dll中没有此函数,能把你处理此问题的源码发给我吗?Mail [email protected],谢谢。
      

  2.   

    IceCoolBea, 要截获 recv 函数,要在你的钩子dll里加入 wsock32.lib, 并且在dll里加入
    void temp()
    {
        SOCKET s;
        shutdown(s);   
    }在 dll 里不调用 temp() 函数,定义此temp()函数是为了让 dll 能够将 wsock32.dll 映射进钩子dll的地址空间里。然后你再截获 recv 函数,
    此时就能够成功的了。只是截获 send 函数时会有问题,有待研究。如果
    你找到答案,请告诉我。
      

  3.   

    非常感谢,已经不报错了,:),但工作还远没做完,我Windows编程水平低,无法帮到你,我是用来改游戏的,所以我不会去截获send,我准备复制这个Socket到线程里,然后直接用这个线程发送信息。还有,我用的是2000,所以我加入的是ws2_32.lib,我也想到了这点,所以加入了lib,但不知道用声明temp函数的方法加入映射,见笑了,再次表示感谢。
      

  4.   

    能给我一份吗??
    [email protected]
      

  5.   

    我也遇到一个奇怪的现象,不知是否与这有一丝联系。我自己写了流协议,比如说TCP1(类似TCP),然后,有两个线程A和B,A从TCP1接收数据发向TCP,B从TCP接收数据发向TCP1,两线程采用的都是轮循方式,连接数很多(超过1000个),发现,B线程CPU利用率很高,而A线程CPU利用率还不到B的十分之一(TCP和TCP1都有很多的数据),两线程采用的是一样的实现方式,我怎么也想不清原因,其中,B线程调用TCP的RECV函数,A线程调用TCP的SEND函数,我觉得,有可能是SOCKET实现中 RECV 和SEND 函数实现机制是不同的,也许这也造成了你上面的现象。
      

  6.   

    有趣,给我一份    [email protected]
      

  7.   

    源码学习,,给我一份 [email protected]
      

  8.   

    谢谢,我也来研究一下,[email protected]
      

  9.   

    原码给我一份吧。谢谢。
    [email protected]
      

  10.   

    我也想要一份
        [email protected]
    thanks!
      

  11.   

    [email protected]
    thanks
    ★★★ Nothing to worry about ★★★
      

  12.   

    也给我一份阿!^_^,谢谢~~[email protected]
      

  13.   

    me: [email protected]
    thank u
      

  14.   

    来一分吧
    [email protected]
      

  15.   

    流星,看你的留言,send我也没法hook,但是,根据错误信息来看,我觉得错误信息和我在使用recv时,我引用了一个错误的Dll一样,不是指引用了一个不相关的Dll,而是,这个Dll也有recv这个函数,比方说,我要引用wsock32.dll,但我使用了winsocket.dll,我觉得send是不是在其他的dll里面。而且,我看到上面有个叫hookapi的东东,可以hook send(),你可以试试。我现在的问题是,我在recv里得到socket后,把它传了出来,然后用DuplicateHandle复制一个,然后在自己进程里调用send的时候,错误显示堆栈溢出了,我发现,我无法调用任何wsock32.dll中的函数了,我已经hook了LoadLibrary和GetProcAddress,请问知道原因吗?
      

  16.   

    你好,我要一份源码,谢谢/
    [email protected]
      

  17.   

    (当截获这两个函数的时候,icq 软件会说:初始化socket错误,??
    知道为什么吗?因为在WSAStartup中调用GetProcAddress("send")得到的值就是
    你HookFun的地址,而不是send函数的真正地址,再WSAStartup中
    就进行判断该地址是不是等于send的真正地址,如果不是的话,
    就返回false,这样,初始化就错误了,知道原因了吧,所以,用
    Hook API的方法有一个很大的缺点就是别人能防止你进行Hook。
      前提是你已经Hook了GetProcAddress函数。
      

  18.   

    不知道你们费这么大的力气,Hook那些Socket API是想为了解决什么,其实Windows的各个部分都有很好的开放接口,HOOK来HOOK去多累呀!如果单纯地为了能过滤TCP数据流,在Ring3也有很多种方法呀!
      

  19.   

    我也想要一份
        [email protected]
    thanks
      

  20.   

    当我HOOK LoadLibrary和GetProcAddress,后再单击资源管理器中的文件夹时总是弹出“非法操作”其中说某某OCX错误,请问知道原因吗?
      

  21.   

    比较感兴趣,想研究研究
    [email protected]
      

  22.   

    看了楼上我各位,如读书十年.但我还是不明白怎么hook 一个api,特别是自己写的
      

  23.   

    〉 回复人: sum_1(sum_1) (  ) 信誉:100  2002-04-18 16:48:00  得分:0  
    〉 
    〉 
    〉  当我HOOK LoadLibrary和GetProcAddress,后再单击资源管理器中的文件夹时总是弹出“非法操作”其中说某某OCX错误,请问知道原因吗? 
    〉在Hook GetProcAddress时将LoadLibrary也Hook了吧?这样会有问题的!
    目标程序如果将LoadLibrary的地址送到另外一个进程中,这个地址就不对
    了。在新的进程中肯定会异常的。
      

  24.   

    [email protected]给我一份
    我帮你测试
      

  25.   

    呵呵,希望也能给我一份,
    让我也研究研究。
    [email protected]
      

  26.   

    [email protected]给我一份,谢谢
      

  27.   

    你栽树,我是否可以乘凉?分享一下原代码吧!谢了[email protected]
      

  28.   

    API HOOK 源代码
    http://www.csdn.net/magazine/source/2/APIHooK.zip
      

  29.   

    是否可以给我一份源代码,谢谢您。
    [email protected]
      

  30.   

    我也想要一份
        [email protected]
    thanks!
      

  31.   

    justjet(小杰) 
    tcp 就是如此
    recv时只测试host一次
    而send就要每个数据包都要测试 
    你自己写的tcp1是???? 可能这是两个线程速度不同的原因吧
    SEND,RECV
      

  32.   

    谁能给我一份原码研究一下,
    [email protected]
    谢谢
      

  33.   

    我也要份源码,谁能给我,谢谢![email protected]
      

  34.   

    我也要份源码,谁能给我,谢谢![email protected]
      

  35.   

    能给我源码吗?[email protected]谢谢!