我想截获21端口的FTP数据包 然后将其IP报头的一部分无用位修改并发送 
不知道这样用Winsock2 SPI可行不可行? 这几天在网上搜来搜去 已经安装上了一个LSP分层服务提供者 
然后运行FTP软件 
利用DbgView.exe查看调试信息发现可以Hook到WSPSend函数 
但是完全Hook不到WSPSendTo函数 也不知道是为什么 是不是与FTP的工作机理有关? 还有,是不是即便用SPI Hook到了也无法修改IP(或者TCP)报头呀? 
请哪位大牛来解答一下..100分跪谢~ 

解决方案 »

  1.   

    SPI好象得不到报头吧,要更底层的接口才行
      

  2.   

    可以明确的告诉你。得不到。你Hook到socket这一级别已经决定了你只能拿到tcp,udp这一层的数据。
    可以告诉一下你打算实现什么功能吗? 真想这么做。可以写网络驱动。或者用现有的驱动开发包。不过都比较麻烦。
      

  3.   

    可以修改的,呵呵。
    你可以用winpcap提供的接口在网口抓包,再分析报文是否是FTP报文,是的话按照你的想法去修改IP头,再发送出去,呵呵。
      

  4.   

    也可以写一个网卡的filter driver,在这一层检查报文,是FTP报文就就行修改
      

  5.   

    仔细考虑了一下,winpcap可以抓包,可以修改报文的一个拷贝,但是不能修改原始报文,还是自己写底层驱动好了
      

  6.   


    呵呵 想实现的功能是修改欲发送的特定数据包的报头然后将其发送 报头中隐藏一些信息 接收端可以对其进行还原
    大体思路是接收端使用winpcap
    发送端暂定使用winsock SPI 但是这样看来似乎有些不可行了
    即便是可以截获特定的数据包 但是也无法修改
    截获数据包之后自己使用RAW SOCKET进行构造似乎也不大可行
    winpcap应该是在SPI的下层吧? 这样看来截获数据包之后用winpcap构造数据包再发送似乎也不可行了无奈 看来只能采用TDI或者NDIS底层驱动了…… 
      

  7.   


    恩 winpcap是不能实现数据包拦截的 呵呵
    谢谢您对该问题的关心
      

  8.   

    winpcap应该是可以的。RAW SOCKET组包早封了。winpcap里面就是一个驱动。你看看接口就知道了。
    下面是简介:
     winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它提供了以下的各项功能:
      1> 捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据包;
      2> 在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉;
      3> 在网络上发送原始的数据包;
      4> 收集网络通信过程中的统计信息。第二条就是截掉了对方的包。 很多软件强制断对方断网功能也是通过这个做到的。不过可能有些其他操作。
    比如先用arp协议告诉对方你是网关。让他把数据先经过你。而不是直接发给路由。你可以选择某些包不转发。然后自己组包发,这样就可以阻止COPY的问题。很多防BT软件都是用winpcap做的。不能拦截包还混个毛啊。
    第三条就是自己组包。
      

  9.   


    人家问的是SPI,winpcap是用SPI吗?
      

  10.   


    SPI主要是重定向数据发送的方向(例如本来要连接到XX.XX.XX.XX,通过SPI,可以修改成连接成yy.yy.yy.yy,数据发送也一样)
      

  11.   

    winpcap是用ndis协议驱动,无法对数据包操作
    ndis中间层才行
      

  12.   


    很多很多人对我说过winpcap只是获取流经网卡的数据包的一个拷贝 并不能拦截应用程序发到下层的数据包啊
    那个防BT软件的功能好像是靠它发送RST使TCP连接不能建立来实现的,并没有拦截
      

  13.   

    把这贴结了吧
    已经有了初步的计划
    直接改包要用NDIS中间层 这个有点麻烦
    所以换一种方式
    用SPI实现拦截,用winpcap构造数据包发送
    也算是变相地修改数据包了
    感谢楼上回答的各位~ 散分~
      

  14.   

    我不是回你了么。winpcap不能实现直接对数据包的拦截,它只是对流经网卡的数据包做一个拷贝。所谓的"拦截"是通过发送RST切断连接来实现的,跟我所想要实现的功能有很大的出入。
    Whatever,谢谢你的关注。