基于Winpcap的Windows网络抓包与还原心得

    新的一年工作的第一天想对过去两个月的学习做一个总结,这段时间对自我的认识和工作的心态发生了变化。对工作更加认真了,也意识到自己的责任。言归正传,下面的程序是基于winpcap的网络抓包与还原心得,望一同学习交流。

注:个人感觉很大一部分的时间是花在了思路上,因此主要是个人完成程序的思路。下面全凭记忆,主要是程序完成的过程。

涉及到的内容:

1)WinPcap库

2)MFC(花的时间较多,但感觉没有学到什么)

3)HTTP与FTP本地下载与还原

4)fox代理邮箱的上传还原


Gui界面部分需要采用MFC控件,然后主线程用于GUI,后台线程用winpcap库捕获数据包并实时显示在界面上。然后重点就是还原。

一)HTTP的截取,首先熟悉HTTP的请求和响应的报文格式,然后对捕获到的报文进行分析。由于在网络中截取报文时无法区分是网页自动加载还是手动点击下载,因此对http的请求不进行分析,只是分析响应的http应答。在http应答中找到含有200 OK字段的报文,并且记录这个报文所在的tcp连接(包括seq号等)然后对这个报文的content-length进行分析,然后根据content-length的数值截取这个TCP连接的内容(多个tcp报文),直到传输完成。   

下面是用wireshark捕获的报文分析:

基于Winpcap的Windows网络抓包与还原心得_第1张图片

   HTTP的还原,HTTP传输的是二进制的内容,保存后根据这个连接的content-type保存即可,最终内容的编码方式由内容的文件类型来决定,一般文件类型都含有多种编码方式选择。

二)FTP的截取,首先了解FTP命令。这里涉及到上传和下载两个方向;主动和被动两种工作方式;二进制形式和文本形式两种传输模式。 在对捕获的报文分析时,报文中上传的关键字是STOR,下载是RETR;主动是PORT,被动是PASV;TYPE I是二进制,TYPE A是文本格式。另外一个问题是主动模式FTP server采用20端口进行数据连接,被动模式FTPserver使用协商的端口连接(其中命令连接的建立方式都是一样的)。

下面是wireshark捕获的上传报文分析:

  

   FTP的还原,在对FTP内容进行保存时,不同内容格式采用不同保存方式: 

			if(data->ftp_type == 'I')
			fp_fdata = fopen(&(data_path_f[0]),"ab+");
			else if (data->ftp_type == 'A')
			fp_fdata = fopen(&(data_path_f[0]),"a+");

三)fox代理邮件的上传还原(下载涉及到ssl加密,没有完成)

分析MIME multipart的三个层次:

基于Winpcap的Windows网络抓包与还原心得_第2张图片

每一个层次都有可能采用base64与quoted-printable编码,关于采用哪一种在报文字段中的Content-Transfer-Encoding中能够找到。用解码程序对内容进行base64或quoted-printable解码即可。特别地,在针对base64进行解码时,因为MIME原则上每76字符就会有一个回车和换行\r\n,因此需要对网上一般的base64解码程序进行改进,改进后如下:

BYTE Decode_GetByte(char c)
{
	if(c == '+')
		return 62;
	else if(c == '/')
		return 63;
	else if(c <= '9')
		return (BYTE)(c - '0' + 52);
	else if(c == '=')
		return 64;
	else if(c <= 'Z')
		return (BYTE)(c - 'A');
	else if(c <= 'z')
		return (BYTE)(c - 'a' + 26);
	return 64;
}

//解码
size_t Base64_Decode(char *pDest, const char *pSrc, size_t srclen)
{
	BYTE inPut[4];
	size_t i, index = 0;
	int times = 0;
	for(i = 0; i < srclen; i += 4)
	{
		if( (0 == (i - 2*times)%76) && i != 0)   //每76个字符就有一个换行和回车, 去掉。
		{
			times++;
			i += 2;
		}
			//byte[0]
		inPut[0] = Decode_GetByte(pSrc[i]);
		inPut[1] = Decode_GetByte(pSrc[i + 1]);
		pDest[index++] = (inPut[0] << 2) + (inPut[1] >> 4);

		//byte[1]
		if(pSrc[i + 2] != '=')
		{
			inPut[2] = Decode_GetByte(pSrc[i + 2]);
			pDest[index++] = ((inPut[1] & 0x0f) << 4) + (inPut[2] >> 2);
		}

		//byte[2]
		if(pSrc[i + 3] != '=')
		{
			inPut[3] = Decode_GetByte(pSrc[i + 3]);
			pDest[index++] = ((inPut[2] & 0x03) << 6) + (inPut[3]);
		}            
	}

	//null-terminator
	pDest[index] = 0;
	return index;
}

除了代理邮箱,还可以还原明文邮箱,不同企业邮箱差距较大。263邮箱的传输用的是url编码并且能够还原。


除了以上几种协议,还有其他协议可以进一步完成,希望与大家一起学习交流。


   



你可能感兴趣的:(Windows)