【再发一贴】关于winpcap分析http获得访问的url问题

hzy694358 2010-05-21 04:26:54
这是原帖

比如我我在浏览器地址栏输入http://community.csdn.net/,回车,
那么我将捕获到很多的请求数据
第一个请求:
GET / HTTP/1.1
Host: community.csdn.net

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: ASP.NET_SessionId=tj
中间省略N-2个请求
第N个请求:
GET /gmlog.php?bannerid=4733&clientid=1434&zf=&zoneid=344&source=&block=0&capping=0&cb=931fdf7e153e45964d20f6e670d32ba4 HTTP/1.1
Host: z.csdn.net

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://community.csdn.net/HomePage.aspx
Cookie: cnt_uid_www=b690fae4ab203447d48b0a1第三个请求:
……

这样的话,我将得到很多的请求,可是我该如何分析才能只得到http://community.csdn.net/这个url呢,
而过滤掉其他的。
还有通过点击链接过去的url也一样。
如何实现呢?

很长时间了,都不知道要如何判断才好?
...全文
398 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
狸氏包子 2011-07-13
  • 打赏
  • 举报
回复
兰州能把您的代码发给小弟吗? zzt862341709@163.com 小弟刚搞这个,收到的数据好多重复,不知道怎么回事。
ITjunjun_mysky 2010-12-03
  • 打赏
  • 举报
回复
你好 LZ在吗 我也是这个问题 不知道现在有没有解决?想请教一下
hzy694358 2010-05-25
  • 打赏
  • 举报
回复
再顶……
hzy694358 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 visualeleven 的回复:]
你返回的内容里不含url信息吗???
[/Quote]
其实那个请求头中就有我要的url了
但是有很多的请求,我不知到要如何去掉我不想要的url
我题目说了,我浏览器输入http://community.csdn.net/,回车
会有很多的请求发出,而每一个请求都有响应的返回字串,
如果是用返回字串的话,依然会存在这个问题,

就是不知道如何根据http协议来分析得到我响应的url,
比如,我在浏览器里输入的http://community.csdn.net/
发出的请求中有一个是:
GET / HTTP/1.1
Host: community.csdn.net
……
我可以根据GET / HTTP/1.1之间没有请求参数来得到http://community.csdn.net/
但是如果是从http://community.csdn.net/页面链接出去,则得到的都会有请求参数:
GET /a/Counter.aspx?area=133&u=http%3A//topic.csdn.net/u/20100520/17/63FFA5C0-CB8A-415C-8ACD-0616ECABEE22.html HTTP/1.1Host: counter.csdn.net
……
这个我就不知道如何分析了
Eleven 2010-05-24
  • 打赏
  • 举报
回复
你返回的内容里不含url信息吗???
hzy694358 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 leitianjun 的回复:]
//获取到字符串
int CFarmHelperDAL::GetContent(CString& content )

//交由openFarm来分析
BOOL CDataUnPack::OpenFarm(CString& str,COpenFarm &TempOpenFarm)

//在读取返回的COpenFarm &TempOpenFarm 每个容器……
[/Quote]
我看你的代码,你这个就是用的wininet来获得返回的内容
然后根据返回的内容分析得到你想要的东西
可是这种方法怎么得到我想要的url 呢,我实在没发现

厄,应该是我没说清楚吧,或者你可以再看一下我的题目
hzy694358 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 tr0j4n 的回复:]
你肯定没好好看WinCap的BFP文档。

针对某个URL很简单,过滤表达式用Host:URL 就可以只得到这个URL的东西了
[/Quote]
厄,应该是我没说清楚吧,
我不是要针对某个url,而是通过捕获得的数据包,来分析我访问了哪些url
hzy694358 2010-05-24
  • 打赏
  • 举报
回复
顶,……
hzy694358 2010-05-22
  • 打赏
  • 举报
回复
天没天理,
人没人性啊,

谁能帮个忙啊
  • 打赏
  • 举报
回复

//获取到字符串
int CFarmHelperDAL::GetContent(CString& content )

//交由openFarm来分析
BOOL CDataUnPack::OpenFarm(CString& str,COpenFarm &TempOpenFarm)

//在读取返回的COpenFarm &TempOpenFarm 每个容器中的结构体得到相对应的要素信息。

在进行相关的操作,这不就是一个基本完整的一个流程吗?
我就不明白楼主,还有哪点不明白了。。。
MoXiaoRab 2010-05-22
  • 打赏
  • 举报
回复
你肯定没好好看WinCap的BFP文档。

针对某个URL很简单,过滤表达式用Host:URL 就可以只得到这个URL的东西了
  • 打赏
  • 举报
回复
楼主,什么叫天没天理,什么叫人没人性!!


CHttpFile* m_pFile; //看m_pFile的Read

int CFarmHelperDAL::GetContent(CString& content )
{
UINT nReadSize = 0;
UINT nSize = 0;
PCHAR temp = m_buffer;
while( 0< (nReadSize = m_pFile->Read(temp,1024)))
{
*(temp+nReadSize) = '\0';
nSize+=nReadSize;
if( (BUFFER_SIZE -1024 )<= nSize)
break;
temp +=1024;
}
int len_wchart = MultiByteToWideChar(CP_UTF8, 0, m_buffer, -1, NULL, 0);
WCHAR* wlpbuf = new WCHAR[len_wchart];
MultiByteToWideChar(CP_UTF8, 0, m_buffer, -1, wlpbuf, len_wchart);
*m_buffer = '\0';
content = wlpbuf;
return nSize;
}


如果在说没天理,估计是真没天理了。
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hzy694358 的回复:]
leitianjun

你看清我的题目了没有啊,

怎么答的都是不着边的啊
[/Quote]

这样的话,我将得到很多的请求,可是我该如何分析才能只得到http://community.csdn.net/这个url呢,
而过滤掉其他的。

返回的信息存储到一个CString对象内 然后在遍历分析。示例代码如下:

BOOL CDataUnPack::OpenFarm(CString& str,COpenFarm &TempOpenFarm)
{
//打开农场
//{"log":[],"user":{"headPicBig":null,"homePage":"http://user.qzone.qq.com/1111111111","money":522,"uExp":529,"uId":11111111,"uLevel":1,"uName":null}}

vector<CString> getall; //容器存储数量无上限
CString getItem; //存放每个逗号间的字符串
CString strtmp,Teststr;
int stat=1;
BOOL ret=FALSE;

while(!str.IsEmpty()) //遍历字符串,先按逗号分开,存放到容器中
{
int pos = str.Find(','); //从第一个逗号开始查找,并返回逗号的位置
if (pos!=-1)
{
getItem = str.Left(pos); //获得逗号左边的字符串
if(!getItem.IsEmpty()) //如果逗号间没有字符串,则不做任何处理
{
getall.push_back(getItem); //否则,将该字符串存放到容器中去
}
str = str.Right(str.GetLength()-pos-1);
}else if (!str.IsEmpty())
{
int postest=str.Find(L"}}");
getItem = str.Left(postest); //获得逗号左边的字符串
getall.push_back(getItem);
str="";

}else
{
break;
}
}


for(vector<int>::size_type iter=0;iter!=getall.size();++iter)
{

strtmp=getall[iter]; //获得第iter个字符串
if (stat==1)
{
int log = strtmp.Find(L"\"log\":"); //在该字符串中查找log字符
if(log != -1) //如果存在‘]’字符
{
TempOpenFarm.log = strtmp.Right(strtmp.GetLength()-strlen("\"log\":")-1); //获取右边的字符串(不包括'\"exp:\"')

}
stat++;
}
if (stat==2)
{
int headpic=strtmp.Find(L"\"user\":{\"headPicBig\":");
int homePage=strtmp.Find(L"\"homePage\":");
int money=strtmp.Find(L"\"money\":"); //金钱
int uExp=strtmp.Find(L"\"uExp\":");
int uid=strtmp.Find(L"\"uId\":");
int ulevel=strtmp.Find(L"\"uLevel\":");
int uName=strtmp.Find(L"\"uName\":");

if (headpic!=-1)
{
TempOpenFarm.userinfo.headPicBig = strtmp.Right(strtmp.GetLength()-strlen("\"user\":{\"headPicBig\":")); //获取右边的字符串

}
if (homePage!=-1)
{
TempOpenFarm.userinfo.homePage = strtmp.Right(strtmp.GetLength()-strlen("\"homePage\":")); //获取右边的字符串

}
if (money!=-1)
{
TempOpenFarm.userinfo.money=strtmp.Right(strtmp.GetLength()-strlen("\"money\":"));
}
if (uExp!=-1)
{
TempOpenFarm.userinfo.uExp=strtmp.Right(strtmp.GetLength()-strlen("\"uExp\":"));
}
if (uid!=-1)
{
TempOpenFarm.userinfo.uId=strtmp.Right(strtmp.GetLength()-strlen("\"uId\":"));
}
if (ulevel!=-1)
{
TempOpenFarm.userinfo.uLevel=strtmp.Right(strtmp.GetLength()-strlen("\"uLevel\":"));
}
if (uName!=-1)
{
TempOpenFarm.userinfo.uLevel=strtmp.Right(strtmp.GetLength()-strlen("\"uName\":"));
}

}


}
if (stat==2)
{
ret=TRUE;
}else
{
ret=FALSE;
}
return ret;
}



还有通过点击链接过去的url也一样。
如何实现呢?


获取验证号示例如下:

BOOL CQqFarmHelperLogin::GetVerifyImage()
{
CString strUrl = L"";
IStream *pIStream;//创建一个IStream接口指针,用来保存图片流
HRESULT hr;
CRect rcButton;
CButton* button = ((CButton*)GetDlgItem(IDC_BTN_NEXT));
CClientDC dc(this);

strUrl.Format(L"http://ptlogin2.qq.com/getimage?aid=15000102&%0.16f", CCommon::GetRandom16());
try{
CFile* pFile;
pFile = m_FarmHelperDAL.OpenURL(strUrl);
m_strVerifysession = m_FarmHelperDAL.GetCookie(L"verifysession");
DWORD dwSize = (DWORD)pFile->GetLength();
::CoInitialize(NULL); // 初始化COM

HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, dwSize );
LPVOID lpBuf = ::GlobalLock( hMem );
pFile->Read(lpBuf,dwSize);
::GlobalUnlock( hMem );

// 由HGLOBAL得到IStream,参数TRUE 表示释放IStream的同时,释放内存
hr = ::CreateStreamOnHGlobal(hMem,TRUE,&pIStream );
ASSERT(SUCCEEDED(hr));

hr = ::OleLoadPicture(pIStream, dwSize, TRUE, IID_IPicture,(LPVOID *)&m_pIPicture);
if(!m_pIPicture){
throw 0;
}
// 宽高 MM_HIMETRIC模式,单位是0.01毫米
m_pIPicture->get_Width( &m_orgSize.cx ); // 宽
m_pIPicture->get_Height( &m_orgSize.cy ); // 高
CSize size(m_orgSize.cx,m_orgSize.cy);
dc.HIMETRICtoDP(&size); // 转换MM_HIMETRIC模式单位为MM_TEXT像素单位

button->SetWindowText(L"看不清,换一张");
button->GetWindowRect(rcButton);
CRect crLocation(rcButton);
button->GetParent()->ScreenToClient(crLocation);
m_realRect.left = crLocation.left;
m_realRect.top = crLocation.top - size.cy - 5;
m_realRect.right = size.cx + crLocation.left;
m_realRect.bottom = size.cy + m_realRect.top;
}catch(int)
{
button->SetWindowText(L"获取验证码失败");
}
if(pIStream) // 释放IStream指针,同时释放hMem
pIStream->Release();
::CoUninitialize();
return 0;
}






声明:以上代码,只供学习之用。

hzy694358 2010-05-21
  • 打赏
  • 举报
回复
leitianjun

你看清我的题目了没有啊,

怎么答的都是不着边的啊
  • 打赏
  • 举报
回复

//由于其它情况,代码不能全部共享!!
int CFarmHelperDAL::Request(int nVerb, CHttpFile** pFile, CString& strURL, CStringArray& strHeaders)
{
CString strServer, strObject, strHeader;
unsigned short nPort;
DWORD dwServiceType;
if(!AfxParseURL(strURL, dwServiceType, strServer, strObject, nPort)){
return FALSE;
}
// 连接服务器
CHttpConnection *pServer = m_Session.GetHttpConnection(strServer, nPort);
if(pServer == NULL)
return FALSE;
// POST请求
*pFile = pServer->OpenRequest(nVerb, strObject, NULL, 1, NULL, NULL, INTERNET_FLAG_EXISTING_CONNECT);
if(*pFile == NULL)
return FALSE;
// 填HTTP写头
int count = strHeaders.GetCount();
for(int i =0 ;i<count;i++)
{
CString s = strHeaders.GetAt(i);
if( !s.IsEmpty() )
(*pFile) -> AddRequestHeaders(s);
}
m_strURL = strURL;
return TRUE;
}
// OpenRUL
CStdioFile* CFarmHelperDAL::OpenURL(CString& strURL)
{
m_strURL = strURL;
return m_Session.OpenURL(strURL);
}
// 发送GET
int CFarmHelperDAL::HttpGET(CHttpFile** pFile, CString& strURL, CStringArray& strHeaders)
{
if( !Request(CHttpConnection::HTTP_VERB_GET, pFile, strURL, strHeaders))
return FALSE;
// 提交请求
BOOL result = (*pFile)->SendRequest();
DWORD dwRet;
// 查询返回码,返回200表是成功
(*pFile)->QueryInfoStatusCode(dwRet);
if (dwRet != HTTP_STATUS_OK){
return FALSE;
}
return TRUE;
}

hzy694358 2010-05-21
  • 打赏
  • 举报
回复
你这个是抓包工具啊,
我要的是编码实现,你给我这个有什么用啊
抓包工具我自己有smartsniffer
hzy694358 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 leitianjun 的回复:]
搜HttpWatchPro-v6.014
[/Quote]
这个是什么东东,
  • 打赏
  • 举报
回复
搜HttpWatchPro-v6.014

相当的好用,每次都管你的发送请求就行了。

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧