有没有这类的教程?望高手们指点一下小弟

解决方案 »

  1.   

    基本不可能,自己用别的方法实现
    给你一个例子吧,2000下执行,98无效,显示结果在立即窗口中。如果你有兴趣可以对buffer中的数据进行处理。
    创建一个工程,一个窗体放上两个按钮,新建一个标准模块模块代码:'代码开始
    'winsocket 2.0的API声明,对照着msdn慢慢写,累死人了
    Public Declare Function bind Lib "ws2_32.dll" (ByVal s As Long, addr As SOCK_ADDR, ByVal namelen As Long) As Long
    Public Declare Function closesocket Lib "ws2_32.dll" (ByVal s As Long) As Long
    Public Declare Function connect Lib "ws2_32.dll" (ByVal s As Long, name As SOCK_ADDR, ByVal namelen As Integer) As Long
    Public Declare Function inet_addr Lib "ws2_32.dll" (ByVal cp As String) As Long
    Public Declare Function htons Lib "ws2_32.dll" (ByVal hostshort As Integer) As Integer
    Public Declare Function recv Lib "ws2_32.dll" (ByVal s As Long, buffer As Any, ByVal length As Long, ByVal flags As Long) As Long
    Public Declare Function send Lib "ws2_32.dll" (ByVal s As Long, buffer As Any, ByVal length As Long, ByVal flags As Long) As Long
    Public Declare Function shutdown Lib "ws2_32.dll" (ByVal s As Long, ByVal how As Long) As Long
    Public Declare Function ioctlsocket Lib "ws2_32.dll" (ByVal s As Long, ByVal v As Long, ut As Long) As Long
    Public Declare Function socket Lib "ws2_32.dll" (ByVal af As Long, ByVal type_specification As Long, ByVal protocol As Long) As Long
    Public Declare Function WSACancelBlockingCall Lib "ws2_32.dll" () As Long
    Public Declare Function WSACleanup Lib "ws2_32.dll" () As Long
    Public Declare Function WSAGetLastError Lib "ws2_32.dll" () As Long
    Public Declare Function WSAStartup Lib "ws2_32.dll" (ByVal wVersionRequired As Integer, wsData As WSA_DATA) As Long
    Public Declare Function WSASocketA Lib "ws2_32.dll" (ByVal af As Long, ByVal type1 As Long, ByVal protocol As Long, lpProtocolInfo As Long, g As Long, ByVal dwFlags As Long)
    Public Declare Function WSAIoctl Lib "ws2_32.dll" (ByVal s As Long, ByVal dwIoControlCode As Long, lpvInBuffer As Long, ByVal cbInBuffer As Long, lpvOutBuffer As Long, ByVal cbOutBuffer As Long, lpcbBytesReturned As Long, lpOverlapped As Long, lpCompletionRoutine As Long) As Long
     
    '拷贝内存声明
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long)
    '延时声明
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)'常数及结构体声明
    Public Const WSADESCRIPTION_LEN = 256
    Public Const WSASYS_STATUS_LEN = 128Type WSA_DATA
    wVersion As Integer
    wHighVersion As Integer
    strDescription(WSADESCRIPTION_LEN + 1) As Byte
    strSystemStatus(WSASYS_STATUS_LEN + 1) As Byte
    iMaxSockets As Integer
    iMaxUdpDg As Integer
    lpVendorInfo As Long
    End TypeType IN_ADDR
    S_addr As Long
    End TypeType SOCK_ADDR
    sin_family As Integer
    sin_port As Integer
    sin_addr As IN_ADDR
    sin_zero(0 To 7) As Byte
    End Type
    Type IPHeader
    lenver As Byte
    tos As Byte
    len As Integer
    ident As Integer
    flags As Integer
    ttl As Byte
    proto As Byte
    checksum As Integer
    sourceIP As Long
    destIP As Long
    End TypePublic Const AF_INET = 2
    Public Const SOCK_RAW = 3
    Public Const IPPROTO_IP = 0
    Public Const IPPROTO_TCP = 6
    Public Const IPPROTO_UDP = 17
    Public Const MAX_PACK_LEN = 65535
    Public Const SOCKET_ERROR = -1&
    窗体代码Dim mwsaData As WSA_DATA
    Dim m_hSocket As Long
    Dim msaLocalAddr As SOCK_ADDR
    Dim msaRemoteAddr As SOCK_ADDRPrivate Sub Command1_Click()
    StopFlag = False
    Sleep (200)
    Call Main
    End SubPrivate Sub Command2_Click()
    StopFlag = True
    End
    End SubPrivate Sub Form_Load()
    StopFlag = False
    End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    StopFlag = True
    End Sub
    Sub Main()
    Dim nResult As LongnResult = WSAStartup(&H202, mwsaData)    'winsock启动
    DoEvents
    If nResult <> WSANOERROR Then
        MsgBox "WSA启动错误"
        Exit Sub
    End Ifm_hSocket = socket(AF_INET, SOCK_RAW, IPPROTO_IP) '获得socket句柄
    DoEvents
    If (m_hSocket = INVALID_SOCKET) Then
        MsgBox "初始化错误"
        Exit Sub
    End IfmsaLocalAddr.sin_family = AF_INET
    msaLocalAddr.sin_port = 4000
    msaLocalAddr.sin_addr.S_addr = inet_addr("10.168.188.59") '这里需要你自己的网卡的IP地址
                                                              '不能用127.0.0.1nResult = bind(m_hSocket, msaLocalAddr, Len(msaLocalAddr)) '绑定地址和端口
    DoEvents
    If (nResult = SOCKET_ERROR) Then
        MsgBox "绑定错误"
        Exit Sub
    End IfDim InParamBuffer As Long
    Dim BytesRet As Long
    BytesRet = 0
    InParamBuffer = 1
    nResult = WSAIoctl(m_hSocket, &H98000001, InParamBuffer, Len(InParamBuffer), 0, 0, BytesRet, 0, 0)
    'socket模式设置
    DoEvents
    If nResult <> 0 Then
        MsgBox "socket模式设置错误"
        Exit Sub
    End IfDim strData As String
    Dim nReceived As Long'截获来的数据放在BUFF里面
    Dim Buff(0 To MAX_PACK_LEN) As Byte
    Dim IPH As IPHeader
    Sleep (1000)
    Do Until False '死循环抓数据包,直到程序被终止
        DoEvents       '适当让别的程序也动一动,我们不要把所有资源都占用了
        DoEvents    nResult = recv(m_hSocket, Buff(0), MAX_PACK_LEN, 0) '抓包啦,数据保存在buff(0)数组里面。
        Call Sleep(200) '这条语句不能去掉,但可以调整一下范围,否则出现GPE错误。
        DoEvents
        If nResult = SOCKET_ERROR Then
            MsgBox "抓包错误"
            Exit Do
        End If
        CopyMemory IPH, Buff(0), Len(IPH) '把抓到的包的前二十个字节保存到自定义结构体里面
                                          '这二十个字节是IP报头,包括IP、端口、包类型等信息
                                          '从第二十一个字节开始就是数据了,大家有兴趣自己
                                          '处理
        
        Select Case IPH.proto             '对包类型进行过滤,当然,也可以对端口ip进行过滤
        Case IPPROTO_TCP                  '这里我只是对tcp报文进行处理,其他报文大家有兴趣自己
                                          '处理了
        
        Debug.Print HexIp2DotIp(IPH.sourceIP) & "----->" & HexIp2DotIp(IPH.destIP)
                                          '显示数据报流向
        End Select
    Loop
    '关闭socket
    nResult = shutdown(m_hSocket, 2)
    nResult = closesocket(m_hSocket)
    nResult = WSACancelBlockingCall
    nResult = WSACleanup
    End SubFunction HexIp2DotIp(ByVal ip As Long) As String
    '这个函数用来将16进制的IP信息转换成为大家习惯看的三点四段式Dim s As String, p1 As String, p2 As String, p3 As String, p4 As String
    s = Right("00000000" & Hex(ip), 8)
    p1 = Val("&h" & Mid(s, 1, 2))
    p2 = Val("&h" & Mid(s, 3, 2))
    p3 = Val("&h" & Mid(s, 5, 2))
    p4 = Val("&h" & Mid(s, 7, 2))
    HexIp2DotIp = p4 & "." & p3 & "." & p2 & "." & p1
    End Function
      

  2.   

    拜托,这已经是最基本代码了,API声明不能少吧,常数、结构体声明不能少吧,winsock初始化代码不能少吧,就连最后的运行结果展示我都放在立即窗口里面了,整个界面就两个按钮一个开始一个结束,还能怎么简单。vb是简单但是也不是简单到什么事情都弹指一挥间啊。
      

  3.   

    有道理。。
    可不可以给我发你做做起来了的那个工程来看看E-mail: [email protected]
    OK??
      

  4.   

    仅能够知道数据包的IP和port,无法知道是那个进程的,除非你知道进城打开的是哪个端口。上面这段代码是使用网卡的乱模式截取数据包,如果想知道是哪个进程的数据要使用api hook(不是hook api)vb很难做到这个
      

  5.   

    如果使用VXD技术呢?是不是很容易啊??有没有VXD之类的教程啊?麻烦各位师兄介绍一下!好吗?