记得在什么地方见过一些文章,讲授关于用HOOK IAT表的方法挂接/拦截API,
但其中好象说道: 与SOCKET相关的DLL,例如ws2_32.dll,wsock32.dll不能
用这种方法拦截,跟踪.今天尝试着用HOOK IAT表的方法拦截ws2_32.dll,wsock32.dll果然失败,
应用程序总是返回WSAStartup()返回100091. 但正常启动应用程序时(不拦截)
应用程序运行良好.哪位高人能解释一下其中的缘由, 另外有谁知道通常情况下用什么方法拦截 
诸如ws2_32.dll,wsock32.dll这样与SOCKET相关DLL的API调用.谢谢 
请问为什么不能用HOOK IAT表的方法跟踪与SOCKET相关的DLL,例如ws2_32.dll,wsock32.dll?

解决方案 »

  1.   

    你是要拦截那几个 API 啊?
      

  2.   

    使用Depends.exe工具打开wsock32.dll,从看到的输出函数选择几个,例如:
    accept,bind,closesocket,connect等.
      

  3.   

    closesocket我成功过,其他的不行。
      

  4.   

    从依赖关系上看wsock32.dll(Windows Socket 32-Bit DLL)调用了
    ws2_32.dll(Windows Socket 2.0 32-Bit DLL)中的函数,但直接调用
    的函数只有两个WSARecv(), WSARecvFrom()。其他都是通过
    "forward function"机制完成的。但具体"forward function"机制是
    怎么实现调用转移的,就不清楚了。
      

  5.   

    从依赖关系上看wsock32.dll(Windows Socket 32-Bit DLL)调用了
    ws2_32.dll(Windows Socket 2.0 32-Bit DLL)中的函数,但直接调用
    的函数只有两个WSARecv(), WSARecvFrom()。其他都是通过
    "forward function"机制完成的。但具体"forward function"机制是
    怎么实现调用转移的,就不清楚了。
      

  6.   

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

  7.   

    谢谢 verybigbug() 的提示,我刚才跟踪了一下,果然在跟踪WSAStartup()函数
    时,发现在WSAStartup()中调用了很多GetProcAddress("xxx")函数。
    并且只要程序中替换了WS2_32.dll的任何一个函数的IAT地址,并且这个函数被
    WSAStartup()通过GetProcAddress("xxx")调用过,则WSAStartup()必返回FALSE。从跟踪结果分析,在WSAStartup()函数中对WS2_32.dll的除以下3个函数之外的所
    有函数都调用了GetProcAddress(),这3个函数是:
    __WSAFDIsSet
    WEP
    WSApSetPostRoutine从跟踪结果上分析好象是“在WSAStartup中判断该地址是不是等于send的真正地
    址”,但总觉得Windows系统没有必要“防止你进行Hook”。因为通过外包DLL一样
    可以对SOCKE API进行HOOK的。另外LSP(layered service provider)也允许对
    应用程序的SOCKET API调用进行再定向。我将进一步深入研究WSAStartup()的汇编代码,看看到底它在干什么。
      

  8.   

    谢谢 verybigbug() 的提示,我刚才跟踪了一下,果然在跟踪WSAStartup()函数
    时,发现在WSAStartup()中调用了很多GetProcAddress("xxx")函数。
    并且只要程序中替换了WS2_32.dll的任何一个函数的IAT地址,并且这个函数被
    WSAStartup()通过GetProcAddress("xxx")调用过,则WSAStartup()必返回FALSE。从跟踪结果分析,在WSAStartup()函数中对WS2_32.dll的除以下3个函数之外的所
    有函数都调用了GetProcAddress(),这3个函数是:
    __WSAFDIsSet
    WEP
    WSApSetPostRoutine从跟踪结果上分析好象是“在WSAStartup中判断该地址是不是等于send的真正地
    址”,但总觉得Windows系统没有必要“防止你进行Hook”。因为通过外包DLL一样
    可以对SOCKE API进行HOOK的。另外LSP(layered service provider)也允许对
    应用程序的SOCKET API调用进行再定向。我将进一步深入研究WSAStartup()的汇编代码,看看到底它在干什么。
      

  9.   

    我估计是用来判断版本信息的。
    我已经很久没研究Hook API 了,最近研究了一下Debug发现比
    Hook Api功能强劲多了,还没发现有什么它搞不定的。除非特别
    对Debug进行了处理。
      

  10.   

    我知道verybigbug兄是CSDN中对操作系统及Win32系统编程很有造诣的几个高手
    之一, 尤其对HOOK技术. 希望以后能多和你交流.