首页
社区
课程
招聘
[求助]宽带连接下使用winpcap的问题
发表于: 2015-3-4 15:22 8561

[求助]宽带连接下使用winpcap的问题

2015-3-4 15:22
8561
各位好!最近在研究SYN Flood,在windows平台下使用winpcap实现。先用winpcap枚举网卡,选择实际用来上网的物理网卡,然后获取本机IP地址,本机MAC,网关MAC,按照tcp协议构造syn包,并使用winpcap发送出去。在自己的机器上测试没有问题,数据包有发送出去,且目标有返回(syn+ack)。但是换了台机器后出现了问题,该机器网络配置如下:


有本地连接和宽带连接。winpcap打开网卡(只能枚举到一个设备),将IP地址设置为宽带地址,硬编码了一个网关MAC(ps:网关的MAC是从其它数据包里看出来的),数据包发送成功了,但是没有回应。网络是通的,鲨鱼抓包数据包也是正确的。

请问各位大牛,哪里出了问题。

源文件就一个CPP,见附件。谢谢!!!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 292
活跃值: (153)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
它是固定的~ 只要程序找到,自动显示的,你没搜出来,就说明已经有了问题。

目测是查找网络类型和接口的代码有些问题~

NetworkInterface.GetAllNetworkInterfaces(); 获取网络接口
dapter.NetworkInterfaceType == NetworkInterfaceType.*  判断接口类型
2015-3-4 18:08
0
雪    币: 1327
活跃值: (370)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
3
谢谢解答! 你的两句代码貌似是C#的,我用的是VC... 暂时还不想改用C#,不知道宽带连接跟下面的本地连接是否属于一块网卡上,不懂
2015-3-4 18:42
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
adpter适配器的问题,应该有很多,找对物理的才行。
2015-3-4 21:03
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
UINT i = 0;
        PIP_ADAPTER_INFO pAdapterInfo = NULL;
        PIP_ADAPTER_INFO pAdapter = NULL;
       
        ULONG ulOutBufLen = 0;
        DWORD dwRetVal = GetAdaptersInfo( NULL, &ulOutBufLen);
        if (dwRetVal == ERROR_BUFFER_OVERFLOW)
        {
                pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
                dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen);
        }
        if (dwRetVal == NO_ERROR)
        {
                pAdapter = pAdapterInfo;
                while (pAdapter)
                {       
                        if (0 == strcmp(pAdapter->IpAddressList.IpAddress.String,lpIP))
                        {
                                //变量这里赋值
                                wsprintf(lpAdapter,"\\Device\\NPF_%s",pAdapter->AdapterName);
                                for (i = 0; i < pAdapter->AddressLength; i++)
                                        bMac[i]=pAdapter->Address[i]; // 本机mac
                                strcpy(szGate, pAdapter->GatewayList.IpAddress.String);
                                strcpy(szMask, pAdapter->IpAddressList.IpMask.String);
                                bRet = TRUE;
                                break;
                        }
                        pAdapter = pAdapter->Next;
                }
        }
       
        if(pAdapterInfo != NULL)
                free(pAdapterInfo);

这是我前几年项目里面的代码,一直没出过问题,不知道你这里是不是还有类似权限等问题没考虑进去?
2015-3-4 21:29
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
自己写驱动,就没权限问题了。winpcap必须要获得adminstroatr
2015-3-4 22:35
0
雪    币: 1327
活跃值: (370)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
7
谢谢 dppdpp 和 gougous的解答,按照你们的提示再摸索下!!
2015-3-5 10:34
0
雪    币: 1327
活跃值: (370)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
8
thanks~
可是这里枚举到物理的网卡,相应的IP地址是内网的,不是宽带的那个IP。
2015-3-5 10:58
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
拨号连接用的是PPOE协议,IP数据包是被PPOE协议封装过的的。你直接去过滤IP协议,当然过滤不到,因为此时不存在任何直接的TCP、ip协议数据包。
2015-3-5 12:46
0
雪    币: 1327
活跃值: (370)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
10
thanks~ 你说的抓包吗?抓包倒是可以抓到PPP协议封装的包。
我说的是winpcap枚举物理网卡,只获得一个:
Number 0:\Device\NPF_{2FBCA9A9-7723-4FFC-B025-188E396144A5}:Intel(R) 82566DM-2 G
igabit Network Connection
Please Choose the Device Number:(0-0)0

然后用GetAdapterInfo函数后去适配器,有两个:
\Device\NPF_{669A51AE-9527-4EC4-9A1F-F8FC44FE0756}
本机IP地址为:117.28.215.124
本机MAC为:00-00-00-00-00-00
网关IP地址为:0.0.0.0

\Device\NPF_{2FBCA9A9-7723-4FFC-B025-188E396144A5}
本机IP地址为:169.254.233.235
本机MAC为:00-23-AE-61-81-3E
网关IP地址为:0.0.0.0

网关IP都是0,不知为何?

我用宽带的IP和下面的MAC地址填进数据包,发送不出去。怀疑是winpcap没有枚举到宽带的那个设备。
2015-3-5 14:31
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
当然要自己构造满足PPPOE协议数据包,然后通过物理网卡发出去。。。。直接IP包当然不行
2015-3-5 16:33
0
雪    币: 1327
活跃值: (370)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
12
PPP协议也封装了,发送不出去。问题不在这。

发现了一个问题,winpcap可以枚举到一个设备,但是从设备结构体中遍历地址时发现都是0,不知道是这么回事

代码片段:
int Result = pcap_findalldevs(&NetwokDevice, WinpcapError);
    if (Result ==  - 1)
    {
        printf("pcap_findalldevs Error");
        return 0;
    }
       
        for (Device = NetwokDevice, i = 0; Device && i < 10; Device = Device->next, i++)
    {
        printf("Number %d:", i);
        printf("%s:", Device->name);
        printf("%s\n", Device->description);
        sprintf(DeviceName[i], "%s", Device->name);
    }
    for (;;)
    {
        printf("Please Choose the Device Number:(0-%d)", i - 1);
        scanf("%d", &DeviceIndex);
        if (DeviceIndex > i - 1 || DeviceIndex < 0)
        {
            printf("Device Number Error\n");
            continue;
        }
        else
            break;
    }

        for (Device = NetwokDevice, i=0; i<DeviceIndex; i++)
        {
                Device = Device->next;
        }

        DWORD dwHostIP;

        pcap_addr* adds = Device->addresses;

        while (adds)
        {

                if (adds->addr/* && ((sockaddr_in *)(adds->addr))->sin_family == AF_INET*/)
                {

                        dwHostIP = ((sockaddr_in *)(adds->addr))->sin_addr.S_un.S_addr;

                        printf("IP: %x\n", dwHostIP);
                        if (dwHostIP!=0)
                        {
                                struct in_addr   stInAddr;

                                unsigned int iTemp = dwHostIP;

                                stInAddr.s_addr=iTemp;
                                char *pIp=inet_ntoa(stInAddr);

                                printf("host ip %s\n", pIp);  //此处打出来的地址都是0
                        }               
                }

                adds = adds->next;
        }
2015-3-6 10:31
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
PPPOE协议,下面还一层mac层协议,你处理了么?
2015-3-6 11:10
0
雪    币: 1327
活跃值: (370)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
14
处理了,  协议层次 :   以太 - PPOE - IP - TCP
2015-3-7 11:16
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
PPPOE 里还有三个协议呢,都搞通了么?
2015-3-7 13:36
0
游客
登录 | 注册 方可回帖
返回
//