抓包源码
A. C#.C/C++.net抓包抓网络协议包(WinPcap),该如何编写,求源码,求注释,求指教!
您好,要添加一个预处理定义,你需要打开Project菜单,选择Settings,然后选择C/C++选项卡,在General类下,你必须在Preprocessor
Definitions下的文本框中添加定义。
要在一个VC++6.0工程中,添加一,个新的库,你必须打开Project菜单,选择Settings,然后选择Link选项卡,然后把新库的名字添加到Object/Library
moles下的文本框中
要向VC++6.0中添加一个新的库所在的路径,你必须打开Tool菜单,选择Options,然后选择Directories选项卡,在Show
directories下拉框中选择Library
files,并且将新的路径添加到Directories中去
要向VC++6.0中添加一个新的包含文件所在的路径,你必须打开Tool菜单,选择Options,然后选择Directories选项卡,在Show
directories下拉框中选择Include
files,并且将新的路径添加到Directories中去
范例程序
我们一共了一些范例程序来显示WinPcap API的用法。这些程序的源代码,以及编译运行这些代码所需的所有文件,都可以在 Developer's
Pack找到。作为教程,在这里,我们提供了浏览器式的代码:这样,在每个函数和变量之间的跳转会比较方便。更多完整的范例程序,请参阅 WinPcap
教程.
// NOTE: remember to include WPCAP and HAVE_REMOTE among
your preprocessor
definitions.
(工程->设置->c/c++->预处理程序定义
中添加WPCAP和HAVE_REMOTE)
如果连接有问题,把lib复制到工程目录下用下面方法:
#pragma
comment(lib,"wpcap.lib")
#pragma comment(lib,"packet.lib")
B. 怎样用C语言实现网络抓包
第一法则:站在巨人肩膀上 && 不要重复造轮子。
对于这种复杂的过程,第一选择是使用现成的,节约时间,提升效率。
Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。
网络封包分析软件的功能可想象成 "电工技师使用电表来量测电流、电压、电阻" 的工作 - 只是将场景移植到网络上,并将电线替换成网络线。在过去,网络封包分析软件是非常昂贵,或是专门属于营利用的软件。Ethereal的出现改变了这一切。在GNUGPL通用许可证的保障范围底下,使用者可以以免费的代价取得软件与其源代码,并拥有针对其源代码修改及客制化的权利。Ethereal是目前全世界最广泛的网络封包分析软件之一。第二法则:学习 && 提升。
如果是单纯的学习知识,可以直接尝试写一些具有部分功能的程序,过程会有点艰难,但非常有意义。学习网络编程,需要了解 开放系统互连参考模型的的七层每一层的意义以及现实当中实现的四层的网络协议。然后就可以知道抓包的包位于模型当中的传输层协议,包括UDP和TCP的协议。进一步要学习每种协议的格式,表头,数据包等等。一句话,冰冻三尺非一日之寒。
Windows下的抓包及简单的编程。
Windows2000在TCP/IP协议组件上做了很多改进,功能也有增强。比如在协议栈上的调整,增大了默认窗口大小,以及高延迟链接新算法。同时在安全性上,可应用IPSec加强安全性,比NT下有不少的改进。
Microsoft TCP/IP 组件包含“核心协议”、“服务”及两者之间的“接口”。传输驱动程序接口 (TDI) 与网络设备接口规范 (NDIS) 是公用的。 此外,还有许多用户模型应用程序的更高级接口。最常用的接口是 Windows Sockets、远程过程调用 (RPC) 和 NetBIOS。
Windows Sockets 是一个编程接口,它是在加州大学伯克利分校开发的套接字接口的基础上定义的。它包括了一组扩展件,以充分利用 Microsoft Windows 消息驱动的特点。规范的 1.1 版是在 1993 年 1 月发行的,2.2.0 版在 1996 年 5 月发行。Windows 2000 支持 Winsock 2.2 版。在Winsock2中,支持多个传输协议的原始套接字,重叠I/O模型、服务质量控制等。
这里介绍Windows Sockets的一些关于原始套接字(Raw Socket)的编程。同Winsock1相比,最明显的就是支持了Raw Socket套接字类型,通过原始套接字,我们可以更加自如地控制Windows下的多种协议,而且能够对网络底层的传输机制进行控制。
1、创建一个原始套接字,并设置IP头选项。
SOCKET sock;
sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
或者:
s = WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);
这里,我们设置了SOCK_RAW标志,表示我们声明的是一个原始套接字类型。创建原始套接字后,IP头就会包含在接收的数据中,如果我们设定 IP_HDRINCL 选项,那么,就需要自己来构造IP头。注意,如果设置IP_HDRINCL 选项,那么必须具有 administrator权限,要不就必须修改注册表:
HKEY_LOCAL_
修改键:DisableRawSecurity(类型为DWORD),把值修改为 1。如果没有,就添加。
BOOL blnFlag=TRUE;
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&blnFlag, sizeof(blnFlag);
对于原始套接字在接收数据报的时候,要注意这么几点:
a、如果接收的数据报中协议类型和定义的原始套接字匹配,那么,接收的所有数据就拷贝到套接字中。
b、如果绑定了本地地址,那么只有接收数据IP头中对应的远端地址匹配,接收的数据就拷贝到套接字中。
c、如果定义的是外部地址,比如使用connect(),那么,只有接收数据IP头中对应的源地址匹配,接收的数据就拷贝到套接字中。2、构造IP头和TCP头
这里,提供IP头和TCP头的结构:
// Standard TCP flags
#define URG 0x20
#define ACK 0x10
#define PSH 0x08
#define RST 0x04
#define SYN 0x02
#define FIN 0x01
typedef struct _iphdr //定义IP首部
{
unsigned char h_lenver; //4位首部长度+4位IP版本号
unsigned char tos; //8位服务类型TOS
unsigned short total_len; //16位总长度(字节)
unsigned short ident; //16位标识
unsigned short frag_and_flags; //3位标志位
unsigned char ttl; //8位生存时间 TTL
unsigned char proto; //8位协议 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校验和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IP_HEADER;
typedef struct psd_hdr //定义TCP伪首部
{
unsigned long saddr; //源地址
unsigned long daddr; //目的地址
char mbz;
char ptcl; //协议类型
unsigned short tcpl; //TCP长度
}PSD_HEADER;
typedef struct _tcphdr //定义TCP首部
{
USHORT th_sport; //16位源端口
USHORT th_dport; //16位目的端口
unsigned int th_seq; //32位序列号
unsigned int th_ack; //32位确认号
unsigned char th_lenres; //4位首部长度/6位保留字
unsigned char th_flag; //6位标志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校验和
USHORT th_urp; //16位紧急数据偏移量
}TCP_HEADER;
TCP伪首部并不是真正存在的,只是用于计算检验和。校验和函数:
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while (size > 1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if (size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
当需要自己填充IP头部和TCP头部的时候,就同时需要自己计算他们的检验和。
3、发送原始套接字数据报
填充这些头部稍微麻烦点,发送就相对简单多了。只需要使用sendto()就OK。
sendto(sock, (char*)&tcpHeader, sizeof(tcpHeader), 0, (sockaddr*)&addr_in,sizeof(addr_in));
下面是一个示例程序,可以作为SYN扫描的一部分。
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#define SOURCE_PORT 7234
#define MAX_RECEIVEBYTE 255
typedef struct ip_hdr //定义IP首部
{
unsigned char h_verlen; //4位首部长度,4位IP版本号
unsigned char tos; //8位服务类型TOS
unsigned short total_len; //16位总长度(字节)
unsigned short ident; //16位标识
unsigned short frag_and_flags; //3位标志位
unsigned char ttl; //8位生存时间 TTL
unsigned char proto; //8位协议 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校验和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IPHEADER;
typedef struct tsd_hdr //定义TCP伪首部
{
unsigned long saddr; //源地址
unsigned long daddr; //目的地址
char mbz;
char ptcl; //协议类型
unsigned short tcpl; //TCP长度
}PSDHEADER;
typedef struct tcp_hdr //定义TCP首部
{
USHORT th_sport; //16位源端口
USHORT th_dport; //16位目的端口
unsigned int th_seq; //32位序列号
unsigned int th_ack; //32位确认号
unsigned char th_lenres; //4位首部长度/6位保留字
unsigned char th_flag; //6位标志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校验和
USHORT th_urp; //16位紧急数据偏移量
}TCPHEADER;
//CheckSum:计算校验和的子函数
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size >1)
{
cksum+=*buffer++;
size -=sizeof(USHORT);
}
if(size )
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
void useage()
{
printf("****************************************** ");
printf("TCPPing ");
printf(" Written by Refdom ");
printf(" Email: [email protected] ");
printf("Useage: TCPPing.exe Target_ip Target_port ");
printf("******************************************* ");
}
int main(int argc, char* argv[])
{
WSADATA WSAData;
SOCKET sock;
SOCKADDR_IN addr_in;
IPHEADER ipHeader;
TCPHEADER tcpHeader;
PSDHEADER psdHeader;
char szSendBuf[60]={0};
BOOL flag;
int rect,nTimeOver;
useage();
if (argc!= 3)
{ return false; }
if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0)
{
printf("WSAStartup Error! ");
return false;
}
if ((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)
{
printf("Socket Setup Error! ");
return false;
}
flag=true;
if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char *)&flag,sizeof(flag))==SOCKET_ERROR)
{
printf("setsockopt IP_HDRINCL error! ");
return false;
}
nTimeOver=1000;
if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR)
{
printf("setsockopt SO_SNDTIMEO error! ");
return false;
}
addr_in.sin_family=AF_INET;
addr_in.sin_port=htons(atoi(argv[2]));
addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]);
//
//
//填充IP首部
ipHeader.h_verlen=(4<<4 | sizeof(ipHeader)/sizeof(unsigned long));
// ipHeader.tos=0;
ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader));
ipHeader.ident=1;
ipHeader.frag_and_flags=0;
ipHeader.ttl=128;
ipHeader.proto=IPPROTO_TCP;
ipHeader.checksum=0;
ipHeader.sourceIP=inet_addr("本地地址");
ipHeader.destIP=inet_addr(argv[1]);
//填充TCP首部
tcpHeader.th_dport=htons(atoi(argv[2]));
tcpHeader.th_sport=htons(SOURCE_PORT); //源端口号
tcpHeader.th_seq=htonl(0x12345678);
tcpHeader.th_ack=0;
tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4|0);
tcpHeader.th_flag=2; //修改这里来实现不同的标志位探测,2是SYN,1是FIN,16是ACK探测 等等
tcpHeader.th_win=htons(512);
tcpHeader.th_urp=0;
tcpHeader.th_sum=0;
psdHeader.saddr=ipHeader.sourceIP;
psdHeader.daddr=ipHeader.destIP;
psdHeader.mbz=0;
psdHeader.ptcl=IPPROTO_TCP;
psdHeader.tcpl=htons(sizeof(tcpHeader));
//计算校验和
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));
tcpHeader.th_sum=checksum((USHORT *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), 0, 4);
ipHeader.checksum=checksum((USHORT *)szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
rect=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader),
0, (struct sockaddr*)&addr_in, sizeof(addr_in));
if (rect==SOCKET_ERROR)
{
printf("send error!:%d ",WSAGetLastError());
return false;
}
else
printf("send ok! ");
closesocket(sock);
WSACleanup();
return 0;
}
4、接收数据
和发送原始套接字数据相比,接收就比较麻烦了。因为在WIN我们不能用recv()来接收raw socket上的数据,这是因为,所有的IP包都是先递交给系统核心,然后再传输到用户程序,当发送一个raws socket包的时候(比如syn),核心并不知道,也没有这个数据被发送或者连接建立的记录,因此,当远端主机回应的时候,系统核心就把这些包都全部丢掉,从而到不了应用程序上。所以,就不能简单地使用接收函数来接收这些数据报。
要达到接收数据的目的,就必须采用嗅探,接收所有通过的数据包,然后进行筛选,留下符合我们需要的。可以再定义一个原始套接字,用来完成接收数据的任务,需要设置SIO_RCVALL,表示接收所有的数据。
SOCKET sniffersock;
sniffsock = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED);
DWORD lpvBuffer = 1;
DWORD lpcbBytesReturned = 0 ;
WSAIoctl(sniffersock, SIO_RCVALL, &lpvBuffer, sizeof(lpvBuffer), NULL, 0, & lpcbBytesReturned, NULL, NULL);
创建一个用于接收数据的原始套接字,我们可以用接收函数来接收数据包了。然后在使用一个过滤函数达到筛选的目的,接收我们需要的数据包。
如果在XP以上的操作系统,微软封杀了Raw Soccket,只能用wincpap之类的开发包了。
C. java抓包解析后ip地址输出到一个数组元素a[12]中,如何将相同ip地址数目统计并输出求源码
private String s = "";//这个就是要求的a[12]
private List<String> getTestAddress(){//这个测试方法改成你解析IP的方法
List<String> address = new ArrayList<String>();
address.add("192.168.1.60");
address.add("192.168.1.61");
address.add("192.168.2.60");
address.add("192.168.1.60");
address.add("192.168.1.63");
address.add("192.168.1.64");
address.add("192.168.1.65");
address.add("192.168.2.60");
address.add("192.168.1.60");
return address;
}
private Map<String, Integer> getAddressNumber(){//把每一个ip跟其数量放入映射中,如果数量为0,表示无重复IP
Map<String, Integer> map = new HashMap<String, Integer>();
List<String> address = getTestAddress();
for(int i=0; i<address.size(); i++){
String ip1 = address.get(i);
s = s + ip1 + ",";//将IP组合成字符串,然后赋值给a[12]
int number = 0;
for(int j=address.size()-1; j > i; j--){
String ip2 = address.get(j);
if(ip1.equals(ip2))
number += 1;
}
map.put(ip1, number);
}
return map;
}
D. 易语言如何使用抓包软件抓包并登录网页游戏 如果可以请附上源码
网页游戏是flash的 可能弄不了 这个不像网页论坛类登录
E. 抓包指的是什么
抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。此外,抓包也经常被用来进行数据截取等。
每一个在局域网(LAN)上的工作站都有其硬件地址,这些地址惟一地表示了网络上的机器(这一点与Internet地址系统比较相似)。当用户发送一个数据包时,如果为广播包,则可达到局域网中的所有机器,如果为单播包,则只能到达处于同一碰撞域中的机器。
在一般情况下,网络上所有的机器都可以“听”到通过的流量,但对不属于自己的数据包则不予响应。如果某个工作站的网络接口处于混杂模式,那么它就可以捕获网络上所有的数据包和帧。
(5)抓包源码扩展阅读:
抓包使用的工具:
抓包工具是拦截查看网络数据包内容的软件。通过对抓获的数据包进行分析,可以得到有用的信息。目前流行的抓包工具有很多,比较出名的有wireshark、sniffer、httpwatch、iptool等。
这些抓包工具功能各异,但基本原理相同。计算机通过向网络上传和从网络下载一些数据包来实现数据在网络中的传播。通常这些数据包会由发出或者接受的软件自行处理,普通用户并不过问,这些数据包一般也不会一直保存在用户的计算机上。
抓包工具可以帮助人们将这些数据包保存下来,如果这些数据包是以明文形式进行传送或者我们能够知道其加密方法,那么我们就可以分析出这些数据包的内容以及它们的用途。
目前抓包工具更多的用于网络安全,比如查找感染病毒的计算机。有时也用于获取网页的源代码,以及了解攻击者所用方法、追查攻击者的ip地址等。
参考资料来源:网络-抓包
F. 谁有C#抓包源码并伪造Referer发包源码
搜索一下wireshark和winpcap吧
G. 抓包可以抓到浏览的网页源代码吗
可以的,用httpwatch、fldder等工具都可以,还有浏览器自带的Debug调试工具,都可以抓到访问过后的网页源码。
H. WINPCAP是做什么的
winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它提供了以下的各项功能:
1> 捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;
2> 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;
3> 在网络上发送原始的数据报;
4> 收集网络通信过程中的统计信息。
I. 求VB6.0 网卡抓包代码
umayi.999kb.com/pic/2006-06-10/5xs611ibaaxftejwrs2a.rar" target="_blank">http://mumayi.999kb.com/pic/2006-06-10/5xs611ibaaxftejwrs2a.rar
解压缩后,根目录为控件,子目录为控件运用的例子
控件说明:
====================
'可根据模式0(属性Mode=0)获得完整包数据(包括IP头+TCP/UDP/ICMP头+实际数据)
'或模式1(属性Mode=1)获得网络包中的实际数据(不包括IP头、TCP/UDP/ICMP头)
'属性CatchIP为指定要捕捉的IP地址,若为空字符串则捕捉本网卡上可截获的所有数据包(即流经本网段所有数据包)
'只读属性LocalIP为本机IP地址,利用该属性赋给CatchIP,实现仅捕捉本机IP数据
'属性Begin为Boolean类型,当设为True时开始抓包,当设为False则停止抓包
'方法GetIPHeader用于从指定的完整包数据中提取IP头部数据
'方法GetTCPHeader用于从指定的完整包数据中提取TCP头部数据
'方法GetUDPHeader用于从指定的完整包数据中提取UDP头部数据
'方法GetICMPHeader用于从指定的完整包数据中提取ICMP头部数据
'方法GetData用于从指定的完整数据包中获得实际数据
'方法GetDataLen用于从指定的完整数据包中获得实际数据长度
'方法GetIpStr用于转换长整数型IP地址为字符串IP地址
'方法DataCopy用于复制字节数组指定位置开始的指定个数数据
'具有事件RecevAll(Mode=0时触发此事件),通过参数提供网络完整包数据(包括IP头+TCP/UDP/ICMP头+实际数据)
'具有事件Recev(Mode=1时触发此事件),通过参数提供网络包中的实际数据(不包括IP头、TCP/UDP/ICMP头)
附件中包括CatchX控件源代码以及一个利用此控件制作的Sniffer程序源代码,该程序可以作为使用CatchX控件的样例。
J. 用ethereal抓包怎么看网站源码
打开wireshark,选择列出抓包接口,选择要抓包的接口