解决方案 »

  1.   

    ip 包过长被拆开, 这很正常
    分析的话从最上层  ETH_HEADER  PPPOE_HEADER  根据类型 ethtype 判断 PPPOE_HEADER
    然后根据 Protocol 判断包数据类型, 简单的不加密的话, 可以比较容易分析出承载的数据这个是一个工具, 网络嗅探 基于WinPcap写的, 可以看到PPP的一些信息, 可以得到简单承载的IP数据
    http://download.csdn.net/detail/zzz3265/7646935
    一下是该工具计算承载IP数据偏移的函数
    BOOL CNetFilter::CheckEarthPckInfo(PACK_INFO *pInfo)
    {
    ETH_HEADER *pEthHeader;
    WORD ethtype;
    CHAR *pEthType;
    WORD wPPP_Protocol; pEthHeader = pInfo->pEthHeader;
    if(pEthHeader == NULL)
    return FALSE; ethtype = htons(pEthHeader->ethtype);
    GetEthType(ethtype, &pEthType);
    pInfo->pEthType = pEthType;
    pInfo->pProtocol = pInfo->pEthType;
    if(ethtype == 0x0800)
    {
    pInfo->pIpHead = (IP_HEADER *)(pInfo->pPckDat + sizeof(ETH_HEADER));
    pInfo->nIpSize = pInfo->nPckSize - sizeof(ETH_HEADER);
    }
    else if(ethtype == 0x8863 || ethtype == 0x8864)
    {
    pInfo->pPppHead = (PPPOE_HEADER *)(pInfo->pPckDat + sizeof(ETH_HEADER));
    pInfo->nPppSize = pInfo->nPckSize - sizeof(ETH_HEADER);
    } if(pInfo->pPppHead)
    {
    wPPP_Protocol = htons(pInfo->pPppHead->wProtocol);
    GetPppType(wPPP_Protocol, &pInfo->pProtocol);
    if(wPPP_Protocol == 0x0021) // IP
    {
    pInfo->pIpHead = (IP_HEADER *)((BYTE*)pInfo->pPppHead + sizeof(PPPOE_HEADER));
    pInfo->nIpSize = htons(pInfo->pPppHead->wDatLen)-sizeof(wPPP_Protocol);
    }
    } if(pInfo->pIpHead == NULL)
    {
    NData::DataToHex(pEthHeader->source_hwaddr, 6, pInfo->szSorAddr, sizeof(pInfo->szSorAddr));
    NData::DataToHex(pEthHeader->dest_hwaddr, 6, pInfo->szDestAddr, sizeof(pInfo->szDestAddr));
    }
    return TRUE;
    }
      

  2.   

    ppp分帧,我觉得wireshark自己能组合起来的。除非是特别的协议。