VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 2607|回复: 6

[求助] 用winpcap做了简陋的抓包程序,为什么会抓不完整?

[复制链接]
61_avatar_middle
在线会员 发表于 2015-10-10 13:27:48 | 显示全部楼层 |阅读模式
抓的包和HTTP Analyzer抓到的包对比发现后面的没有抓到。
贴上代码:
DWORD  WINAPI GetHttpThreadFun(LPVOID pThreadStruct)
{
lpthread p=(lpthread)pThreadStruct;
char cnt=0;
CString  BaoWen="";
pcap_t *adhandle;  
char i=0;
char errbuf[PCAP_ERRBUF_SIZE];
/* 打开选择的网卡 */  
    if ( (adhandle= pcap_open(WanKaName,           // 设备名  
                            65536,              // 指定要捕捉的数据包的部分  
                                // 65536 保证所有在链路层上的包都能够被抓到  
      PCAP_OPENFLAG_PROMISCUOUS,            // 混杂模式  
                             1000,          // 读数据的超时时间  
                             NULL,          // 远程机器的授权  
                            errbuf              // 错误缓冲区  
                              ) ) == NULL)  
    {  
        return 0;  
    }  
    struct pcap_pkthdr *pheader; // packet header
    const u_char * pkt_data; // packet data
    int res;
    while((res = pcap_next_ex(adhandle, &pheader, &pkt_data)) >= 0)
{
        if(res == 0)
            continue; // read time out//
        ether_header * eheader = (ether_header*)pkt_data; // transform packet data to ethernet header //
        if(eheader->ether_type == htons(ETHERTYPE_IP))
{ //ip packet only
            ip_header * ih = (ip_header*)(pkt_data+14); // get ip header //
            if(ih->proto == htons(TCP_PROTOCAL))
{ // tcp packet only //
                    int ip_len = ntohs(ih->tlen); // get ip length, it contains header and body //
                    int find_http = false;
                    char* ip_pkt_data = (char*)ih;
                    int n = 0;
                    char buffer[BUFFER_MAX_LENGTH];
                    int bufsize = 0;
                    for(; n<ip_len; n++)
                    {
                        // http get or post request //
                        if(!find_http && ((n+3<ip_len && strncmp(ip_pkt_data+n,"GET",strlen("GET")) ==0 )
                       || (n+4<ip_len && strncmp(ip_pkt_data+n,"POST",strlen("POST")) == 0)) )
                                find_http = true;
                        // http response //
                        if(!find_http && n+8<ip_len && strncmp(ip_pkt_data+n,"HTTP/1.1",strlen("HTTP/1.1"))==0)
                               find_http = true;
                        // if http is found //
                        if(find_http)
                        {
                            buffer[bufsize] = ip_pkt_data[n]; // copy http data to buffer //
                            bufsize ++;
                        }
                    }
                    // print http content //
                    if(find_http)
{
                        buffer[bufsize] = '\0';                     
CString sHttp;
sHttp=buffer;
                        CStdioFile  File;
CString cs="",s;                       
                        if((-1!=sHttp.Find(_T("SSAuth:")))&&(-1!=sHttp.Find(_T("HDDINFO:"))))
{
File.Open("http.txt",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite);//如果文件事先不存在的话,就需要CFile::modeCreate,否则就不需要。
File.SeekToEnd();
cs+=sHttp;
cs+="\n";
File.WriteString(cs);
// MessageBox(cs);
File.Close();
// MessageBoxTimeout(this->GetSafeHwnd(), sHttp, _T("http报文"),  MB_ICONINFORMATION, GetSystemDefaultLangID(), 3000);
//MessageBox(sHttp);
// int ret = MessageBoxTimeoutA(p->hwnd, sHttp, _T("http报文"), MB_OKCANCEL, 0, 2*1000);
// pcap_freealldevs(alldevs);
// return;
((CPdgDownDlg*)(p->pDlg))->GetDlgItem(IDC_EDIT1)->SetWindowText(sHttp);
// GetDlgItem(IDC_EDIT1)
}
                    }
            }
        }
    }
return 0;
}





上一篇:MFC 窗口初始化
下一篇:为什么等于8?
61_avatar_middle
ico_lz  楼主| 发表于 2015-10-10 13:30:19 | 显示全部楼层
用winpcap做了简陋的抓包程序,为什么会抓不完整?
61_avatar_middle
ico_lz  楼主| 发表于 2015-10-10 13:36:52 | 显示全部楼层
跟踪调试到
int ip_len = ntohs(ih->tlen); // get ip length, it contains header and body //
发现 ip_len 只有1492,然后再获取了一下 sHttp的字节长度 1452,就是说抓包到的长度可能就比实际报文长度短了。网上百度了下,能找到的基本上都是类似的代码。
如果报文长度不长的,倒是可以抓取的很好。
求助。用winpcap做了简陋的抓包程序,为什么会抓不完整?
51_avatar_middle
online_admins 发表于 2015-10-10 14:02:20 | 显示全部楼层
这两篇文章讲解的不错,如果楼主能好好看看相信可以解决你的问题:
http://www.cnblogs.com/blacksword/archive/2012/03/22/2411624.html
http://blog.csdn.net/taylor05/article/details/6254546
61_avatar_middle
ico_lz  楼主| 发表于 2015-10-10 14:16:13 | 显示全部楼层
Syc 发表于 2015-10-10 14:02
这两篇文章讲解的不错,如果楼主能好好看看相信可以解决你的问题:
http://www.cnblogs.com/blacksword/ar ...

感谢老大回复!
我就是copy这两个帖子的代码,对比下就会发现是一样的代码。用winpcap做了简陋的抓包程序,为什么会抓不完整?
就是抓不完整,把我愁的用winpcap做了简陋的抓包程序,为什么会抓不完整?
78_avatar_middle
online_supermod 发表于 2015-10-10 21:00:56 | 显示全部楼层
GZZXB 发表于 2015-10-10 14:16
感谢老大回复!
我就是copy这两个帖子的代码,对比下就会发现是一样的代码。
就是抓不完整, ...

后面不是包内容,是要根据抓到的数据解析出来
61_avatar_middle
ico_lz  楼主| 发表于 2015-10-12 09:47:52 | 显示全部楼层
jpacg 发表于 2015-10-10 21:00
后面不是包内容,是要根据抓到的数据解析出来

SSCT的内容也没有抓完整的说用winpcap做了简陋的抓包程序,为什么会抓不完整?
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-8-21 22:55

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表