首页
社区
课程
招聘
[求助]winpcap的发包问题,跪求跪求
发表于: 2012-6-28 16:27 11589

[求助]winpcap的发包问题,跪求跪求

2012-6-28 16:27
11589
已经用winpcap进行自己组包,完成了三次握手的过程,在客户端netstat看不到连接,但在服务器上已经可以看到有建立好的连接,但是接着发送get请求时,服务器却没有任何的回复,貌似服务器的应用层没有收到这个请求。

发送的序列号也都完全照着协议来弄的
客户端发送: 454030560(seq) 0(ack)标志位SYN
服务器回复: 3442828845(seq) 454030561(ack)
客户端发送: 454030561(seq) 3442828846(ack)标志位ACK  

客户端发送: 454030561(seq) 3442828846(ack) 标志位PSH+ACK//此包为get请求,但是服务器没有响应,不知道为什么?

另外:
1、所发的就是正常的get请求,格式也完全就是正常的http的协议,该有的字段都有了,末尾也有结束符。
2、架了一个web服务器,也带了源码可调试的。但是三次握手成功之后,客户端的get请求到不了服务端的应用层,但是数据包能被服务端的wireshark抓到。

不清楚问题怎么解决了,有经验的请指点。谢谢啦。

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

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 127
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
应该是包结构问题~ wincap是协议驱动,能抓到包很正常。
不过到不了应用层的话,你包的IP头的checksum  lenght或者TCP的 seq , flags , fragment  之类不对的话,不能被处理,自然提交不到应用层。不过wireshark有包验证的功能~ 如果包是错误的,很有提示的

顺便你用WEP之类的工具在ring3监视下,如果能抓到HTTP包,那么说明IP,TCP结构没问题。。。那么就一定是HTTP的构造问题了

再不行你就只能贴src了,无码无真相

PS: 你说你是女的,爷才不相信诶~
2012-6-28 17:01
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢回复。
wireshark抓到的包没有错误提示,仔细分析了,在拼包上好像不存在问题。回头贴码出来吧。

ps:标题俺也改了,男女平等,不该用这个来博得同情和关注,谢谢提醒。
2012-6-28 17:12
0
雪    币: 165
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
因为握手回来的包被windows的协议栈接收了,它认为这个是非法的,直接处理掉了。
2012-6-28 21:29
0
雪    币: 165
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
winpcap只能抓包,不能drop包,你想达到需求,要做个ndis hook或者用passthru来做,把对端返回的包自己处理掉,不让下发到windows的tcp/ip
2012-6-28 21:30
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
因为webserver端不是我的,我没法去动。
而客户端是winpcap来发和收,似乎应该没有问题的,只是不知道为什么发送的get请求会被server端的给屏蔽掉?起初发的握手请求server端也给了回复了,并且连接也建立好了,在他的协议栈中是存在这个连接的,接下来的get请求为什么会被丢掉呢?奇怪!
请大侠指点。
2012-6-29 08:16
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
顶起一下,稍后将主要源码发上来,请大侠们找找问题啊
2012-7-9 15:30
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这是发送SYN请求的函数
//////////////////////////////////////////////////////////////////////////
DWORD WINAPI SendPacketThread(LPVOID lpParam)
{
        PSDTCP_HEADER psd_header;
        IP_HEADER ip_header;
        TCP_HEADER tcp_header;
        ETHERNETHEADER etherHeader;
       

        //发送SYN包
        ZeroMemory(&ip_header,sizeof(IP_HEADER));
        ZeroMemory(&tcp_header,sizeof(TCP_HEADER));
        ZeroMemory(ðerHeader,sizeof(ETHERNETHEADER));
        ZeroMemory(&psd_header,sizeof(PSDTCP_HEADER));
       

        //ip header
        ip_header.h_verlen=(4<<4 | sizeof(ip_header)/sizeof(unsigned long));//高四位IP版本号,低四位首部长度
        ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)+strlen(g_BehindString));//16位总长度(字节)        
        ip_header.ident=0x14BB;//16位标识
        ip_header.frag_and_flags=0x0040;//3位标志位
        ip_header.ttl=128;//8位生存时间TTL
        ip_header.proto=IPPROTO_TCP;//8位协议(TCP,UDP…)
        ip_header.checksum=0;//16位IP首部校验和
        ip_header.sourceIP=inet_addr(g_szIPSelf);//32位源IP地址
        ip_header.destIP=inet_addr(g_szIPDst);//32位目的IP地址
       
        //填充TCP首部
        tcp_header.th_sport=htons(1950);//源端口号
        tcp_header.th_dport=htons(80);//目的端口号
        tcp_header.th_seq=htonl(SEQ);//SYN序列号
        tcp_header.th_ack=0;//ACK序列号置为0
        tcp_header.th_lenres=((sizeof(TCP_HEADER)+strlen(g_BehindString))/4<<4|0); //TCP长度和保留位
        tcp_header.th_flag=2;//SYN 标志
        tcp_header.th_win=htons(65535);  //窗口大小
        tcp_header.th_urp=0;  //偏移
        tcp_header.th_sum=0;  //校验和
       

        //填充TCP伪首部(用于计算校验和,并不真正发送)
        psd_header.saddr=ip_header.sourceIP;  
        psd_header.daddr=ip_header.destIP; //目的地址
        psd_header.mbz=0;
        psd_header.ptcl=IPPROTO_TCP; //协议类型
        psd_header.tcpl=htons(sizeof(tcp_header)); //TCP首部长度
       
        //ethernet header       
        etherHeader.eh_dst[0]=g_MacOfGateway[0];
        etherHeader.eh_dst[1]=g_MacOfGateway[1];
        etherHeader.eh_dst[2]=g_MacOfGateway[2];
        etherHeader.eh_dst[3]=g_MacOfGateway[3];
        etherHeader.eh_dst[4]=g_MacOfGateway[4];
        etherHeader.eh_dst[5]=g_MacOfGateway[5];
       
        etherHeader.eh_src[0]=g_MacOfNative[0];
        etherHeader.eh_src[1]=g_MacOfNative[1];
        etherHeader.eh_src[2]=g_MacOfNative[2];
        etherHeader.eh_src[3]=g_MacOfNative[3];
        etherHeader.eh_src[4]=g_MacOfNative[4];
        etherHeader.eh_src[5]=g_MacOfNative[5];
        etherHeader.eh_Type=0x0008;       

        char SendBuf[1600];
        int datasize;               
                       

        //----------------Send SYN Packet----------------               
        //计算TCP校验和
        memset(SendBuf,0,1600);
        memcpy(SendBuf,&psd_header,sizeof(psd_header));  
        memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header));
        memcpy(SendBuf+sizeof(psd_header)+sizeof(tcp_header),g_BehindString,strlen(g_BehindString));
        tcp_header.th_sum=checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header)+strlen(g_BehindString));
        tcp_header.th_sum = htons(ntohs(tcp_header.th_sum)-(USHORT)strlen(g_BehindString));

        //计算IP校验和
        memset(SendBuf,0,1600);
        memcpy(SendBuf,&ip_header,sizeof(ip_header));
        memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
        memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4);
        ip_header.checksum=checksum((USHORT *)SendBuf,sizeof(ip_header));

               
        //填充发送缓冲区               
        memset(SendBuf,0,1600);
        memcpy(SendBuf,ðerHeader,sizeof(ETHERNETHEADER));
        memcpy(SendBuf+sizeof(ETHERNETHEADER),&ip_header,sizeof(ip_header));
        memcpy(SendBuf+sizeof(ETHERNETHEADER)+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
        memcpy(SendBuf+sizeof(ETHERNETHEADER)+sizeof(ip_header)+sizeof(tcp_header),g_BehindString,strlen(g_BehindString));
        datasize=sizeof(ip_header)+sizeof(tcp_header)+sizeof(ETHERNETHEADER)+strlen(g_BehindString);
        pcap_sendpacket(g_adhandle,(const unsigned char *)SendBuf,datasize);

        printf("Send SYN\n");
}

这是当收到对方的(SYN+ACK)回复后,分析回复的包头信息后,所调用的发送ACK和Get请求的函数
void SendAck_GetPacket(USHORT sPort,USHORT dPort,UINT nSyn,UINT nAck)
{
        PSDTCP_HEADER psd_header;
        IP_HEADER ip_header;
        TCP_HEADER tcp_header;
        ETHERNETHEADER etherHeader;
        char SendBuf[1600];
        int datasize;

        //发送SYN包
        ZeroMemory(&ip_header,sizeof(IP_HEADER));
        ZeroMemory(&tcp_header,sizeof(TCP_HEADER));
        ZeroMemory(ðerHeader,sizeof(ETHERNETHEADER));
        ZeroMemory(&psd_header,sizeof(PSDTCP_HEADER));
       

        //ip header
        ip_header.h_verlen=(4<<4 | sizeof(ip_header)/sizeof(unsigned long));//高四位IP版本号,低四位首部长度
        ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER));  //16位总长度(字节)        
        ip_header.ident=0x16BB;//16位标识
        ip_header.frag_and_flags=0x0040;//3位标志位
        ip_header.ttl=128;//8位生存时间TTL
        ip_header.proto=IPPROTO_TCP;//8位协议(TCP,UDP…)
        ip_header.checksum=0;//16位IP首部校验和
        ip_header.sourceIP=inet_addr(g_szIPSelf);//32位源IP地址
        ip_header.destIP=inet_addr(g_szIPDst);//32位目的IP地址
       
       
        //填充TCP伪首部(用于计算校验和,并不真正发送)
        psd_header.saddr=ip_header.sourceIP;  
        psd_header.daddr=ip_header.destIP; //目的地址
        psd_header.mbz=0;
        psd_header.ptcl=IPPROTO_TCP; //协议类型
        psd_header.tcpl=htons(sizeof(tcp_header)); //TCP首部长度
       
        etherHeader.eh_dst[0]=g_MacOfGateway[0];
        etherHeader.eh_dst[1]=g_MacOfGateway[1];
        etherHeader.eh_dst[2]=g_MacOfGateway[2];
        etherHeader.eh_dst[3]=g_MacOfGateway[3];
        etherHeader.eh_dst[4]=g_MacOfGateway[4];
        etherHeader.eh_dst[5]=g_MacOfGateway[5];
       
        etherHeader.eh_src[0]=g_MacOfNative[0];
        etherHeader.eh_src[1]=g_MacOfNative[1];
        etherHeader.eh_src[2]=g_MacOfNative[2];
        etherHeader.eh_src[3]=g_MacOfNative[3];
        etherHeader.eh_src[4]=g_MacOfNative[4];
        etherHeader.eh_src[5]=g_MacOfNative[5];
        etherHeader.eh_Type=0x0008;       
       
       
        //更改TCP首部
        tcp_header.th_flag=0x10;//ACK
        tcp_header.th_seq=htonl(nAck); //SYN序列号
        tcp_header.th_ack=htonl(nSyn+1);//ACK
        tcp_header.th_sum=0;  //校验和
        tcp_header.th_sport=htons(dPort);
        tcp_header.th_dport=htons(REMOTE_PORT); //目的端口号
        tcp_header.th_win=htons(65535);  //窗口大小
        tcp_header.th_urp=0;  //偏移
        tcp_header.th_lenres=(sizeof(TCP_HEADER)/4<<4|0); //TCP长度和保留位
       
        //计算TCP校验和,计算校验和时需要包括TCP pseudo header
        memset(SendBuf,0,1600);
        memcpy(SendBuf,&psd_header,sizeof(psd_header));  
        memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header));
        tcp_header.th_sum=checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header));
       
        //计算IP校验和
        memset(SendBuf,0,1600);
        memcpy(SendBuf,&ip_header,sizeof(ip_header));
        memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
        memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4);
        ip_header.checksum=checksum((USHORT *)SendBuf,sizeof(ip_header));
       
        //填充发送缓冲区
        memset(SendBuf,0,1600);
        memcpy(SendBuf,ðerHeader,sizeof(ETHERNETHEADER));
        memcpy(SendBuf+sizeof(ETHERNETHEADER),&ip_header,sizeof(ip_header));
        memcpy(SendBuf+sizeof(ETHERNETHEADER)+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
        datasize=sizeof(ETHERNETHEADER)+sizeof(ip_header)+sizeof(tcp_header);
       
        pcap_sendpacket(g_adhandle,(const unsigned char *)SendBuf,datasize);

        printf("Send ACK %d\n",dPort);

       
        Sleep(200);

        //-------------------Send Http Get Packet---------------
        ///////////////////////////////////////////////////////////////////////////
        //更改IP首部
        ip_header.checksum=0; //16位IP首部校验和
        ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)+strlen(g_HttpHeader));  //16位总长度(字节)
        ip_header.ident=0x17BB;//16位标识

        //更改TCP首部
        tcp_header.th_flag=0x18;//ACK+PSH
        tcp_header.th_seq=htonl(nAck); //SYN序列号
        tcp_header.th_ack=htonl(nSyn+1);//ACK
        tcp_header.th_sum=0;  //校验和
        tcp_header.th_sport=htons(dPort);
        tcp_header.th_win=htons(65535);  //窗口大小
       
        //计算TCP校验和,计算校验和时需要包括TCP pseudo header
        memset(SendBuf,0,1600);
        memcpy(SendBuf,&psd_header,sizeof(psd_header));  
        memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header));
        tcp_header.th_sum=checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header));
       
        //计算IP校验和
        memset(SendBuf,0,1600);
        memcpy(SendBuf,&ip_header,sizeof(ip_header));
        memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
        memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4);  
        ip_header.checksum=checksum((USHORT *)SendBuf,sizeof(ip_header));
       
        //填充发送缓冲区
        memset(SendBuf,0,1600);
        memcpy(SendBuf,ðerHeader,sizeof(ETHERNETHEADER));
        memcpy(SendBuf+sizeof(ETHERNETHEADER),&ip_header,sizeof(ip_header));
        memcpy(SendBuf+sizeof(ETHERNETHEADER)+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
        memcpy(SendBuf+sizeof(ETHERNETHEADER)+sizeof(ip_header)+sizeof(tcp_header),g_HttpHeader,strlen(g_HttpHeader));
        datasize=sizeof(ETHERNETHEADER)+sizeof(ip_header)+sizeof(tcp_header)+strlen(g_HttpHeader);

        pcap_sendpacket(g_adhandle,(const unsigned char *)SendBuf,datasize);

        printf("+++++++++++++++++GET ok %d\n",dPort);
       
        return;
}

1、网卡是以混杂模式打开的
2、发送完Get请求之后,服务器就不给我响应了,这是什么原因呢?按说服务器那边已经建立好了连接,可为啥就不回复Get请求呢?为啥Get请求没有能够到达应用层呢?
请大侠指点迷津,谢谢!
2012-7-9 16:40
0
雪    币: 193
活跃值: (64)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
TCP 校验和计算错误。发送数据的时候校验和没有把数据包含上去。鲨鱼是底层驱动抓的包,当往上层反得时候,到达传输层时,发现TCP校验和错误,就会将包丢弃。前三个包没有数据段,所以前三个包的TCP头部校验和是对的。
2012-7-9 17:22
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我把发get请求包里面的计算tcp校验和改为了
//计算TCP校验和,计算校验和时需要包括TCP pseudo header
memset(SendBuf,0,1600);
memcpy(SendBuf,&psd_header,sizeof(psd_header));  
memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header));
memcpy(SendBuf+sizeof(psd_header)+sizeof(tcp_header),g_HttpHeader,strlen(g_HttpHeader));
tcp_header.th_sum=checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header)+strlen(g_HttpHeader));

可结果,服务器应用层仍然没有收到包,奇怪。
2012-7-10 11:45
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
发个wireshark抓的报文上来看看,也许能看出问题来。
2012-7-10 12:00
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不知道该怎么发这个抓包的结果,分别将4个包的内容发上来

第一个 SYN 包
0000   00 0c 29 7d 4b c7 00 0c 29 bf 51 a5 08 00 45 00
0010   00 30 bb 14 40 00 80 06 29 54 c0 a8 ca 83 c0 a8
0020   ca 8a 13 b1 00 50 28 37 68 78 00 00 00 00 70 02
0030   ff ff c8 0f 00 00 02 04 05 b4 01 01 04 02

第二个 SYN+ACK 包
0000   00 0c 29 bf 51 a5 00 0c 29 7d 4b c7 08 00 45 00
0010   00 30 3b 86 40 00 80 06 a8 e2 c0 a8 ca 8a c0 a8
0020   ca 83 00 50 13 b1 d8 77 47 05 28 37 68 79 70 12
0030   ff ff a8 81 00 00 02 04 05 b4 01 01 04 02

第三个 ACK 包
0000   00 0c 29 7d 4b c7 00 0c 29 bf 51 a5 08 00 45 00
0010   00 28 bb 16 40 00 80 06 29 5a c0 a8 ca 83 c0 a8
0020   ca 8a 13 b1 00 50 28 37 68 79 d8 77 47 06 50 10
0030   ff ff d5 45 00 00

第四个 Get请求包
0000   00 0c 29 7d 4b c7 00 0c 29 bf 51 a5 08 00 45 00
0010   01 47 bb 17 40 00 80 06 28 3a c0 a8 ca 83 c0 a8
0020   ca 8a 13 b1 00 50 28 37 68 79 d8 77 47 06 50 18
0030   ff ff 05 28 00 00 47 45 54 20 2f 20 48 54 54 50
0040   2f 31 2e 31 0d 0a 41 63 63 65 70 74 3a 20 61 70
0050   70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 6f 63
0060   6b 77 61 76 65 2d 66 6c 61 73 68 2c 20 69 6d 61
0070   67 65 2f 67 69 66 2c 20 69 6d 61 67 65 2f 78 2d
0080   78 62 69 74 6d 61 70 2c 20 69 6d 61 67 65 2f 6a
0090   70 65 67 2c 20 69 6d 61 67 65 2f 70 6a 70 65 67
00a0   2c 20 2a 2f 2a 0d 0a 41 63 63 65 70 74 2d 4c 61
00b0   6e 67 75 61 67 65 3a 20 7a 68 2d 63 6e 0d 0a 41
00c0   63 63 65 70 74 2d 45 6e 63 6f 64 69 6e 67 3a 20
00d0   67 7a 69 70 2c 20 64 65 66 6c 61 74 65 0d 0a 55
00e0   73 65 72 2d 41 67 65 6e 74 3a 20 4d 6f 7a 69 6c
00f0   6c 61 2f 34 2e 30 20 28 63 6f 6d 70 61 74 69 62
0100   6c 65 3b 20 4d 53 49 45 20 36 2e 30 3b 20 57 69
0110   6e 64 6f 77 73 20 4e 54 20 35 2e 31 3b 20 53 56
0120   31 29 0d 0a 48 6f 73 74 3a 20 31 39 32 2e 31 36
0130   38 2e 32 30 32 2e 31 33 38 0d 0a 43 6f 6e 6e 65
0140   63 74 69 6f 6e 3a 20 4b 65 65 70 2d 41 6c 69 76
0150   65 0d 0a 0d 0a

后面就没有了服务器的返回包了,请帮忙看看。
2012-7-11 15:59
0
游客
登录 | 注册 方可回帖
返回
//