urp源码
1. 怎样用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之类的开发包了。
加密方法太多了,你首先要搞清楚是用什么加密的,base64还是什么,要是md5的根本没法解密
3. 发包长度大于1518的发包工具
三款常用IP发包工具介绍
SENDIP 可在各种UNIX 或linux 版本中运行,本人使用的是SLACKWARE 8.0 和
REDHAT 9.0 两个版本。
可在网站http://www.earth.li/projectpurple/progs/sendip.html 中下载最新的源代码或RPM
包,目前版本为2.5,源码包大小只有54K。
2.1.1. 安装过程
SENDIP 的安装过程非常简单,首先从前面介绍的网站中下载最新的源代码包,目前为
sendip-2.5.tar.gz。
在LINUX 系统中执行:
#tar –xzvf sendip-2.5.tar.gz
#cd sendip-2.5
#make
#make install
在系统的/usr/local/bin 目录下会产生一个SENDIP 命令文件,同时,在/usr/local/lib 目录
下建立一个sendip 目录,并在其下放置ipv4.so、ipv6.so、tcp.so 等与协议相关的模块文件。
通过在命令行下运行这个文件,我们可以产生各种各样我们需要的IP 包,还可以通过运行
脚本自动发送大量的IP 包。
AntPower 版权所有&; 2003 技术文章
http://www.antpower.org 第3 页共14 页
2.1.2. 发包方法
SENDIP 可以发送NTP, BGP, RIP, RIPng, TCP, UDP, ICMP、IPv4 和IPv6 等各种格式的
数据包,SENDIP 本身是以模块的方式发送各种协议的数据包,用-p 参数指定协议类型,要
发送每种协议的数据包, 必须对该协议的数据包格式有一定的了解。通常发送
TCP/UDP/ICMP 数据包时,都必须以IP 包进行封装,然后才可以发出去。本节我们将以TCP
数据包为例进行讲述。
下面介绍一下SENDIP 的命令行格式,以下为直接执行SENDIP 时的输出:
Usage: sendip [-v] [-d data] [-h] [-f datafile] [-p mole] [mole options] hostname
-d data add this data as a string to the end of the packet
Data can be:
rN to generate N random(ish) data bytes;
0x or 0X followed by hex digits;
0 followed by octal digits;
any other stream of bytes(以指定字节的随机数据填充包中的数据段)
-f datafile read packet data from file(以指定数据文件中的内容填充包中的数据段)
-h print this message(输出帮助信息)
-p mole load the specified mole (see below)(指定协议类型)
-v be verbose(运行时输出详细运行信息,如不指定,运行时不输出信息)
(协议类型是以模块的方式指定的,用-p 参数指定)
Moles are loaded in the order the -p option appears. The headers from
each mole are put immediately inside the headers from the previos model in
the final packet. For example, to embed bgp inside tcp inside ipv4, do
sendip -p ipv4 -p tcp -p bgp ....
Moles available at compile time:
ipv4 ipv6 icmp tcp udp bgp rip ntp(支持的协议类型)
通常执行格式如下:
#sendip –v –d r64 –p ipv4 –iv 4 –ih 5 –il 128 –is 10.0.0.1 –id 30.0.0.1 –p tcp –ts 1379 –td 23 –tt 8 30.0.0.1
-v:运行时输出详细运行信息,如不指定,运行时不输出信息
–d r64:用64 字节的随机数值填充IP 包中的数据段
–p ipv4:指定协议类型为IP 协议(IP 协议有自己的相应参数,以i 开头)
–iv 4:协议版本为4,即IPV4
–ih 5:指定IP 头的长度为5×4=20 字节
–il 128:指定IP 包的总长度为128 字节
–is 10.0.0.1:指定IP 包的源地址
–id 30.0.0.1:指定IP 包的目的地址
AntPower 版权所有&; 2003 技术文章
http://www.antpower.org 第4 页共14 页
–p tcp:指定IP 包中封装的包的协议类型(TCP 协议有自己的相应参数,以t 开头)
–ts 1379:指定TCP 包的源端口1379
–td 23:指定TCP 包的目的端口为23
-tt 8:指定TCP 包的偏移量即TCP 头的长度,没有TCP 选项时为5,即20 字
节,有TCP 选项时需要增加。
30.0.0.1:指定发包的目的主机
以上部分为利用SENDIP 发送一个简单的TCP 数据包的方法,下面结合IP 和TCP 数据
包的格式详细介绍IP 和TCP 协议的各种参数。
具体各种协议的数据包格式可参考TCP/IP 协议中对各种协议数据包格式的介绍,下面
我们只介绍IP 数据包的格式和TCP 数据包的格式:
IP 数据包的格式:
根据IP 数据包的格式,SENDIP 有如下命令行参数可以指定对应的IP 数据包中参数的
值。
Field name
Size
(bits)
SendIP
option
Description
Version 4 -iv Always 4(对应“4 位版本”,通常值为4,表示IPV4)
Header length 4 -ih
IP header length, measured in 32bit words, 5 if there are
no options(对应“4 位首部长度”,表示以32 位即4
字节为单位的IP 首部长度,如果没有IP 参数的话,
通常为5,表示首部长度为20 字节,如有IP 参数的
话,需要调整该值)
Type of
Service/Differentiated
Services
8 -iy
服务类型(TOS)字段由8 位组成,其中包括3 位的
优先权字段(现已被忽略)、4 位的TOS 子字段和1
位未用位但必须置0,4 位TOS 子字段分别代表最小
时延、最大吞吐量、最高可靠性和最小费用。4 位只
能置其中1 位,使用时只要将设置相应位后运算出十
进制值即可。如要设置最大吞吐量位(00001000),只
需添加参数iy 8 即可。
Total Length 16 -il Total length of IP packet including header and data,
AntPower 版权所有&; 2003 技术文章
http://www.antpower.org 第5 页共14 页
measured in octets(指定IP 包的总长度,包括IP 头部
分和数据部分,以8 位字节为单位,最长为65535)
Identification 16 -ii
Used to help reassembled fragmented packets(指定IP
包的标识号,用来帮助重新组装分段的IP 包)
-ifr 1 bit: reserved, should be 0
-ifd 1 bit: don't fragment(可指定-ifd x,下可为0、1 或r) Flags 3
-ifm 1 bit: more fragmets(可指定-ifm x,下可为0、1 或r)
Fragment offset 13 -if
Where in the reconstructed datagram this fragment
belongs, measured in 64bit words starting from 0(以8
字节长度为单位,指定段偏移量)
Time to Live 8 -it
Number of routers the packet can pass through before
being discarded(值的范围从0 到255,指定TTL,表
示该包可通过的路由器的数目,用于防止包在循环路
径上无休止地传递)
Protocol 8 -ip
Protocol associated with the data. See iana for an
uptodate list of assigned numbers(用于定义IP 包内部
封装的上层协议的协议号,如TCP 为6,可在IANA
的网站上
http://www.iana.org/assignments/protocol-numbers
获得最新的协议号表)
Header checksum 16 -ic
Checksum of the IP header data (with checksum set to
zero)(可指定IP 首部校验和的值,通常由SENDIP 自
动生成,不指定该参数,除非要发出带有错误校验和
的包)
Source Address 32 -is Duhh...(源地址,以点分十进制方式表示)
Destination Address 32 -id Cabbage(目的地址,以点分十进制方式表示)
Options Variable -io...
No options are required. Any number can be added. See
below for details(定义各种IP 选项,如果定义了IP
选项,则前面的IP 头的长度值要包括IP 选项的长度,
不带IP 选项时,该值为20,带IP 选项时,可设定该
值,如果要故意制造不匹配的包,可不符合规范。)
如果有IP 选项,还可指定IP 选项的值,SENDIP 支持的IP 选项如下表所示。
Name
SendIP
option
RFC Copy Class Number
Type
(see
above)
Length
(0 not
present)
Description
EOL -ioeol 791 0 0 0 0 0
Used as padding if needed
(使用该选项后,会自动在IP 头
中未用到的位补0)
NOP -ionop 791 0 0 1 1 0
Do nothing. Often used as padding
so the next option starts on a 32 bit
AntPower 版权所有&; 2003 技术文章
http://www.antpower.org 第6 页共14 页
boundary
RR -iorr 791 0 0 7 7 variable
Used to record the route of a
packet.(记录包走过的每个路由
器, 通常用法是: -iorr
0f:ff.ff.ff.ff:10.0.0.234 –ioeol,其中
iorr 表示记录路由,此时系统会自
动将IP 选项号置为07,0f 表示指
针,即记录的最后一个IP 地址的
指针,系统会自动运算该IP 选项
的长度)
TS -iots 791 0 2 4 68 variable
Used to record the time at which a
packet was processed by an
intermediate system
LSR -iolsr 791 1 0 3 131 vairable
Loose Source Route - let the
source specify the route for a
packet.
SID -iosid 791 1 0 8 136 4
Rarely used, carries the SATNET
stream identifier.
SSR -iossr 791 1 0 9 137 variable
Strict Source Route - same as LSR,
but extra hops are not allowed.
SEC
791,
1108
1 0 2 130 variable Security, rarely used
E-SEC 1108 1 0 5 133 variable Extended Security, rarely used
通常在SENDIP 中指定IP 选项时,格式比较特别,下面我们以RR 记录路由选项为例
介绍一下,如果要发送一个记录三个IP 的数据包,需要考虑如下,一是指定IP 头的长度要
包括IP 选项的长度,而是要指定RR 记录路由选项的指针位置和IP 地址(本来是由系统自
动记录IP 和更新指针位置,但现在必须手工指定),那么记录三个IP 包后,指针的位置应
是3+4×3+1=16,造好后,数据包的格式应该如下:
IP 头07 15 16 10.0.0.234(IP1) 20.0.0.234(IP2) 30.0.0.234(IP3) 00(ioeol) tcp
20B RR len ptr 4bytes 4bytes 4bytes Ptr
具体命令行如下:
#sendip –d r64 –p ipv4 –iv 4 –ih 10 –il 128 –is 10.0.0.1 –id 30.0.0.1 –iorr 10:10.0.0.234:20.0.0.234:30.0.0.234
–ioeol –p tcp –ts 1379 –td 23 –tt 8 30.0.0.1
-ih 10 表示IP 头的长度为10×4 为40 个字节,去除标准的20 个字节长度,为IP
选项预留为20 个字节
-iorr 10:10.0.0.234:20.0.0.234:30.0.0.234 中第一个10 表示用16 进制表示的指针的
位置,后面为用冒号分隔的三个用点分十进制表示的IP 地址
-ioeol 表示用00 结束IP 选项,并用随机数填充后面未用的IP 头位置
以上部分只是以RR 记录路由IP 选项为例,介绍了sendip 中指定IP 选项的方法,当然
也可以根据自己的要求发送IP 选项不符合常规的数据包。其他的IP 选项与此雷同,但发送
AntPower 版权所有&; 2003 技术文章
http://www.antpower.org 第7 页共14 页
前需要详细了解IP 选项的格式,才可正确发送。
TCP 数据包的格式:
根据TCP 数据包的格式,SENDIP 有如下命令行参数可以指定对应的TCP 数据包中参
数的值。
Field name
Size
(bits)
SendIP
option
Description
Source port 16 -ts
Source port number for the connection
(以十进制的方式指定TCP 原端口)
Destination port 16 -td
Destination port number
(以十进制的方式指定TCP 目的端口)
Sequence number 32 -tn
Number of the first data octet in this packet. If SYN bit is
set, this is the number of the first data octet of the stream
too.(指定TCP 序列号,如果不指定则随机产生)
Acknowledgment
number
32 -ta
If ACK bit is set, the next sequence number the sender is
expecting to receive.
Data offset 4 -tt
Length of TCP header in 32 bit words(指定TCP 头的长
度,单位是以32bits 也就是4 字节为单位)
Reserved 4 -tr
Should be 0. Note, rfc793 defines this as a 6 bit field, but
the last 2 are used by rfc2481 for ECN as below.
Flags: ECN 1 -tfe
Flags: CWR 1 -tfc
ECN extension flags, see rfc2481. (指定TCP 标志位,
如果要打开哪一位,就在命令行参数中指定相应位的
值,如要设置SYN 状态,只需在命令行加入-tfs 1 即可
)
Flags: URG 1 -tfu Urgent pointer is significant(同上)
Flags: ACK 1 -tfa Acknowledgment field is significant(同上)
Flags: PSH 1 -tfp Push function(同上)
Flags: RST 1 -tfr Reset the connection(同上)
Flags: SYN 1 -tfs Synchronize sequence numbers(同上)
AntPower 版权所有&; 2003 技术文章
http://www.antpower.org 第8 页共14 页
Flags: FIN 1 -tff No more data from sender(同上)
Window 16 -tw
Number of octet starting from the one in the
Acknowledgement field that the sender is willing to
accept
Checksum 16 -tc
Checksum of the TCP header (with checksum set to 0),
data, and a psuedo-header including the source and
destination IP addresses, IP protocol field and a 16 bit
length of the TCP header and data.
Urgent pointer 16 -tu
If URG bit is set, tHe offset of the last octet of urgent data
in this packet.
Options Variable -to...
No options are required. Any number can be added. See
below for details.
如果有TCP 选项,还可指定TCP 选项的值,SENDIP 支持的TCP 选项如下表所示。
Name
SendIP
option
RFC Type
Length (0
not
present)
Description
EOL -toeol 793 0 0
Used as padding if needed(用00 填充,表示TCP
选项结束,把TCP 头后面的位置用随机数填充)
NOP -tonop 793 1 0
Do nothing. Often used as padding so the next
option starts on a 32 bit boundary
MSS -tomss 793 2 4
Specify the maximum recieve segment size of the
sender as a 16 bit number. Only valid when SYN is
also set
WSOPT -towscale 1323 3 3
The window size should be leftshifted by the value
of the option (an 8 bit number). Only valid when
SYN is also set.
SACKOK -tosackok 2018 4 2
Selective Acknowledgement is permitted on this
connection
SACK -tosack 2018 5 variable
Selective Acknowledgement of non-contiguous
blocks of data. The data in the option is a series of
(left edge)-(right edge) pairs giving, respectively,
the first sequence number the has been recieved and
the first that hasn't.
TSOPT -tots 1323 8 10
Timestamp. The first 4 bytes (TSval) are the time
that the packet was sent, the remaining 4 (TSecr)
echo the TSval of a packet that was recieved. TSecr
is only valid when the ACK bit is set.
从上表所示,可以看出,TCP 选项可能只有一个单字节参数,如-toeol 和-tonop,也可
能由一个Type 号和一个length 长度以及该length 长度指定的字节数的数据组成的参数,使
用时sendip 会自动运算length 的长度,所以,不能随意设定TCP 选项的长度,但需要设定
TCP 选项的值。
AntPower 版权所有&; 2003 技术文章
http://www.antpower.org 第9 页共14 页
在设定TCP 选项时,同样要考虑到TCP 头的长度要包括TCP 选项的长度。
TCP 选项数据包的格式大致如下:
Kind=3 Len=3 数据:移位数
TCP 选项号TCP 选项长度TCP 选项数据占一个字节,总长度为三个字节
具体命令行格式可参照如下格式:
#sendip –d r64 –p ipv4 –iv 4 –ih 10 –il 128 –is 10.0.0.1 –id 30.0.0.1 –iorr 10:10.0.0.234:20.0.0.234:30.0.0.234
–ioeol –p tcp –ts 1379 –td 23 –tt 8 –tfa 0 –tfs 1 –towscale 0 –toeol 30.0.0.1
-towscale 0 :指设置TCP 选项3,长度为自动3,TCP 选项的值即移位数为0
-toeol :表示TCP 选项结束,后面用随机数填满TCP 头
因为用SENDIP 设定TCP 选项时,不能设定长度,所以,如果要设定长度不正确的包,
还要借助其他工具,如SNIFFER,用SNIFFER 抓到SENDIP 发送的包后,再将对应的TCP
选项的长度改为不规则的值即可。
根据前面介绍的内容,我们已经基本可以掌握用SENDIP 发送各种协议数据包的方法,
当然我们还可以利用他发送各种不符合标准的数据包,如校验和错误、长度不正确、状态位
不正确等各种我们需要的数据包,在使用时,建议与SNIFFER 搭配使用,以验证SENDIP
发出的包是否正确,进行有针对性的测试。
2.2. NESSUS 工具
NESSUS 是一个非常庞大的工具,它可以提供功能完善的安全扫描服务,还可以提供全
面的发包功能,用以构造各种格式的网络通信包。本篇只关注NESSUS 的发包功能。
NESSUS 由两个部分组成,一部分是服务器,通常运行在POSIX 系统如LINUX/UNIX
系统中,负责扫描和攻击,并收集数据,另一部分是客户端,可以运行在LINUX/UNIX 系
统或WINDOWS 系统中,负责接收和显示数据。
如果只是用来发包,则只需要服务端即可。
NESSUS 有专门的维护网站,可以随时到http://www.nessus.org 网站下载最新的源代码,
并获得全面的帮助。目前,NESSUS 最新的版本为2.0.8a。
2.2.1. NESSUS 安装方法
安装NESSUS 前要知道NESSUS 可能需要的支撑软件包,一个是GTK,通常POSIX
系统下的NESSUS 客户端需要GTK,如果你的系统安装了GTK,则必须确保安装了
gtk-config 程序,可到ftp://ftp.gimp.org/pub/gtk/v1.2 网站下载最新的GTK 程序,如果只在
LINUX/UNIX 系统下安装服务端,则可以不需要GTK 包;另一个是OPENSSL 包,如果希
望客户端和服务端的通信采用SSL 方式,则需要OPENSSL 包,可到http://www.openssl.org/
下载最新的OPENSSL 包,OPENSSL 包是可选的。
NESSUS 有三种安装方法:第一种是利用LINUX 下的LYNX 工具直接从网上安装,这
种方法很容易,但安全性低,在此不予详细介绍,可到NESSUS 网站上获取相关信息。第
二种方法是使用NESSUS 提供的nessus-installer.sh 工具,直接安装,这种方法简单且安全性
比较高。第三种方法是获取源码包,然后分别编译再进行安装。下面分别介绍第二种和第三
种方法。
AntPower 版权所有&; 2003 技术文章
http://www.antpower.org 第10 页共14 页
2.2.1.1. 采用nessus-installer.sh 方式安装
从NESSUS 网站下载最新的nessus-installer.sh 文件到本地LINUX 目录,然后执行
#sh nessus-installer.sh
系统会自动安装NESSUS 到你的系统中,中间会需要你提供相关的提示信息,一直按
回车即可。
2.2.1.2. 采用源码包方式安装
如果采用源码包方式进行安装,需要下载四个软件包,并按顺序进行安装。四个软件包
分别如下:
nessus-libraries
libnasl
nessus-core
nessus-plugins
安装时必须按顺序安装这四个软件包。
安装前,我们必须获得上面所说的四个软件包,目前版本为2.0.8a:
nessus-libraries-x.x.tar.gz
libnasl-x.x.tar.gz
nessus-core.x.x.tar.gz
nessus-plugins.x.x.tar.gz
然后开始进行安装。
1. 安装nessus-libraries
#tar –xzvf nessus-libraries-x.x.tar.gz
#cd nessus-libraries-x.x
#./configure
#make
#make install
2. 安装libnasl-x.x.tar.gz (执行与上面相同的操作)
3. 安装nessus-core.x.x.tar.gz(执行与上面相同的操作)
4. 安装nessus-plugins.x.x.tar.gz (执行与上面相同的操作)
5. 如果使用的是LINUX 系统,必须确保/usr/local/lib 路径在/etc/ld.so.conf 文件中,如
果是SOLARIS 系统, 必须执行export LD_LIBRARY_PATH=
$LD_LIBRARY_PATH :/usr/local/lib 命令。
6. 执行ldconfig 命令
7. 如果不想或不能使用GTK 的客户端,可强制使用命令行方式,这时,在执行第三
步编译nessus-core 时,可以使用如下命令:
#tar –xzvf nessus-libraries-x.x.tar.gz
#cd nessus-libraries-x.x
#./configure --disable-gtk
#make
#make install
AntPower 版权所有&; 2003 技术文章
http://www.antpower.org 第11 页共14 页
执行以上命令后,NESSUS 就已经安装在您的系统中了。
2.2.2. NESSUS 的发包方法
NESSUS 通常采用脚本方式控制发出的包,下面我们以发送圣诞老人攻击包为例,来介
绍如何利用NESSUS 发送数据包。
圣诞老人包是通过发送TCP Flag 中同时有SYN 和FIN 标志的数据包,穿透防火墙,
来达到攻击的目的。
为使用NESSUS 发送攻击包,首先要定义一个脚本,在LINUX 下,执行vi sendp 命令,
输入如下内容:
srcaddr=this_host(); 注:自动获取当前主机的IP 地址
ip = forge_ip_packet( ip_v : 4, 注:IP 协议版本为IPV4
ip_hl : 5, 注:IP 头的长度为5×4=20 字节
ip_tos : 0,
ip_len : 40, 注:在这里输入实际的长度40,因为IP 头和TCP 头都为20
ip_id : 0xABA,
ip_p : IPPROTO_TCP, 注:内部数据包协议为TCP
ip_ttl : 255,
ip_off : 0,
ip_src : srcaddr); 注:可在此直接输入IP
port = get_host_open_port(); 注:自动获取当前主机上的可用端口
if(!port)port = 139; 注:如果没有可用端口,就自动使用139 端口
tcpip = forge_tcp_packet( ip : ip, 注:表示IP 层协议采用前面定义的IP 协议包
th_sport : port, 注:可在这里直接输入端口
th_dport : port, 注:可在这里直接输入端口
th_flags : TH_SYN|TH_FIN, 注:设置TCP 状态的SYN 和FIN 标志位
th_seq : 0xF1C,
th_ack : 0,
th_x2 : 0,
th_off : 5, 注:TCP 头的长度位5×4=20 字节
th_win : 512,
th_urp : 0);
result = send_packet(tcpip,pcap_active:FALSE);
编辑完上面的脚本后,保存退出,运行如下命令:
#nasl –t 目的IP 地址测试脚本
如:
#nasl –t 10.0.0.227 sendp
AntPower 版权所有&; 2003 技术文章
http://www.antpower.org 第12 页共14 页
通过Sniffer 抓包,就会发现有相应的圣诞老人包。
在我的使用过程中,发现NESSUS 好像不支持发送带有IP 或TCP 选项的包。
具体发包的参数可参考http://www.nessus.org/doc/nasl.html
2.3. SNIFFER 工具
用SNIFFER 发包时,有两种方式,一种是直接利用Packet Generator 工具,从0 开始用
16 进制的方式造一个数据包,这种方法难度较高,因为要自己算出校验和,除非需要重现
在网络上抓到的一个16 进制格式的数据包,另外一种方式是利用已经抓到的数据包修改一
下,再发送出去,具体实现方法分别如下。
2.3.1. 利用Packet Generator 直接造包
在SNIFFER 中,选择Tools|Packet Generator 菜单,系统弹出窗口如下:
按图中的红色框中的按钮,系统会弹出一个构造包内容的对话框,如下所示:
AntPower 版权所有&; 2003 技术文章
http://www.antpower.org 第13 页共14 页
在上图中可输入包的内容,还可规定发包的个数和包的长度。
2.3.2. 利用已抓的包发包
利用已抓的包进行修改,可以避免大量的运算和输入,只需要更改自己需要更改的地方,
然后发出去即可。
如上图所示,按包的大致要求,用其他工具造好包后,用SNIFFER 抓包,或者直接将
网络上的可疑包抓过来,然后,用鼠标邮件单击该包,弹出如上图所示的快捷菜单,从中选
择Send Current Frame 菜单,系统就会弹出如下图所示的发包窗口:
AntPower 版权所有&; 2003 技术文章
http://www.antpower.org 第14 页共14 页
按要求更改包的内容,即可发送。需要注意的是如果更改了IP 地址或其他头中的内容,
则需要更新校验和,对MAC 或选项的更改不需要更改校验和。
3. 总结
通过对比前面的三种发包工具,我们发现每种工具都有自己的优点和缺点,SENDIP 比
较短小而且功能较齐全,比较适合在日常测试中使用,SNIFFER 发包工具最自由,可以发
出任何可能的数据包,NESSUS 工具功能比较全面,但在发包方面不如SENDIP,所以,建
议如果是测试需要的话,应该采用SENDIP 和SNIFFER 相结合的方式,如果同时还要使用
扫描等其他功能,可以采用NESSUS 工具。
4. pcap文件可读性差
Pcap文件详解
一、简介
pcap文件是常用的数据报存储格式,可以理解为就是一种文件格式,只不过里面的数据是按照特定格式存储的,所以我们想要解析里面的数据,也必须按照一定的格式。
普通的记事本打开pcap文件显示的是乱码,用安装了HEX-Editor插件的Notepad++打开,能够以16进制数据的格式显示,或者使用sublime打开以十六进制的格式显示。用wireshark这种抓包工具就可以正常打开这种文件,愉快地查看里面的网络数据报了,同时wireshark也可以生成这种格式的文件。
还有一些其他网络分析工具。
二、文件格式
Pcap header
Packet1 header
Packet1 Data
Packet2 header
Packet2 Data
如上图所示,pcap文件的总体结构就是文件头-数据包头1-数据包1-数据包头2-数据包2的形式
1.Pcap Header
文件头,每一个pcap文件只有一个文件头,总共占24(B)字节,以下是总共7个字段的含义。(一个字节可以由2个十六进制表示)
Magic(4B):标记文件开始,并用来识别文件和字节顺序。值可以为0xa1b2c3d4或者0xd4c3b2a1,如果是0xa1b2c3d4表示是大端模式,按照原来的顺序一个字节一个字节的读,如果是0xd4c3b2a1表示小端模式,下面的字节都要交换顺序。现在的电脑大部分是小端模式。
ps:网络字节序一般是大端存储,主机x86字节序一般是小端存储,比如我们经过网络发送0x12345678这个整形,在80X86平台中,它是以小端法存放的,在发送前需要使用系统提供的htonl将其转换成大端法存放
Major(2B):当前文件的主要版本号,一般为0x0200
Minor(2B):当前文件的次要版本号,一般为0x0400
ThisZone(4B):当地的标准事件,如果用的是GMT则全零,一般全零
SigFigs(4B):时间戳的精度,一般为全零
SnapLen(4B):最大的存储长度,该值设置所抓获的数据包的最大长度,如果所有数据包都要抓获,将该值设置为65535(0xFFFF); 例如:想获取数据包的前64字节,可将该值设置为64
LinkType(4B):链路类型
2.Packet Header
数据包头可以有多个,每个数据包头后面都跟着真正的数据包。数据包头则依次为:时间戳(秒)、时间戳(微妙)、抓包长度和实际长度,依次各占4个字节。以下是Packet Header的4个字段含义
Timestamp(4B):时间戳高位,精确到seconds,这是Unix时间戳。捕获数据包的时间一般是根据这个值
Timestamp(4B):时间戳低位,能够精确到microseconds
Caplen(4B):当前数据区的长度,即抓取到的数据帧长度,由此可以得到下一个数据帧的位置。
Len(4B):离线数据长度,网路中实际数据帧的长度,一般不大于Caplen,多数情况下和Caplen值一样
3.Packet Data
Packet是链路层的数据帧,长度就是Packet Header中定义的Caplen值,所以每个Packet Header后面都跟着Caplen长度的Packet Data。也就是说pcap文件并没有规定捕获的数据帧之间有什么间隔字符串。Packet数据帧部分的格式就是标准的网络协议格式了。
例子:
红色部分是Pcap Header,蓝色部分是Packet Header,后边是Packet Date
Pcap Header的Magic:d4 c3 b2 a1,表示是小端模式,后面的字节从后往前读 a1b2c3d4 小端模式
Pcap Header的Major:02 00,计算机读的应该是00 02。最大存储长度SnapLen:ff ff 00 00 ,同理计算机读的应该是00 00 ff ff,所以是2的16次方减一,是65535个字节。LinkType:01 00 00 00 ,实际是00 00 00 01,是以太网类型。
蓝色部分的Packet Header我就不一一说了,重点关注Caplen:3c 00 00 00,计算机读的是00 00 00 3c,转换成十进制就是60,所以后面的60个字节都是一个数据帧。之后就又是一个Pcap Header,如此循环。
三、以太网帧(Ethernet)、IP包、TCP、UDP的长度范围
1、以太网帧
MAC地址则是48位的(6个字节),通常表示为12个16进制数,每2个16进制数之间用冒号隔开,如08:00:20:0A:8C:6D就是一个MAC地址。
以太网地址头部:目的地址(6字节)、源地址(6字节)、以太网类型(2字节)
目前以太网帧有5种,交换机之间BPDU(桥协议数据单元)数据包使用的是IEEE802.3/LLC帧,其格式如下:
字段 长度(字节) 目的
前导码(Preamble) 7 0x55,一串1、0间隔,用于信号同步
帧开始符(SFD) 1 1字节0xD5(10101011),表示一帧开始
目的MAC地址 6 指明帧的接受者
源MAC地址 6 指明帧的发送者
长度(Length)/类型(Type) 2 0~1500保留为长度域值,1536~65535保留为类型域值(0x0600~0xFFFF)
数据和填充(Data and Pad) 46~1500 高层的数据,通常为3层协议数据单元。对于TCP/IP是IP数据包(注:如果帧长小于64字节,则要求“填充”,以使这个帧的长度达到64字节)
帧校验序列(FCS) 4 使用CRC计算从目的MAC到数据域这部分内容而得到的校验和
以太网MAC帧格式
在Linux中,以太网帧头部的结构体如下:
/ 10Mb/s ethernet header /
struct ether_header
{
u_int8_t ether_dhost[ETH_ALEN]; / destination eth addr /
u_int8_t ether_shost[ETH_ALEN]; / source ether addr /
u_int16_t ether_type; / packet type ID field /
} __attribute__ ((__packed__));
其中的ETH_ALEN为6,因为地址为6个字节,共48位——这个地址就是常说的物理地址,或MAC地址。它的第3个成员ether_type是以太帧类型,有如下这些:
/ Ethernet protocol ID's /
#define ETHERTYPE_PUP 0x0200 / Xerox PUP /
#define ETHERTYPE_SPRITE 0x0500 / Sprite /
#define ETHERTYPE_IP 0x0800 / IP /
#define ETHERTYPE_ARP 0x0806 / Address resolution /
#define ETHERTYPE_REVARP 0x8035 / Reverse ARP /
#define ETHERTYPE_AT 0x809B / AppleTalk protocol /
#define ETHERTYPE_AARP 0x80F3 / AppleTalk ARP /
#define ETHERTYPE_VLAN 0x8100 / IEEE 802.1Q VLAN tagging /
#define ETHERTYPE_IPX 0x8137 / IPX /
#define ETHERTYPE_IPV6 0x86dd / IP protocol version 6 /
#define ETHERTYPE_LOOPBACK 0x9000 / used to test interfaces /
注:如果帧长小于64字节,则要求“填充”,以使这个帧的长度达到64字节
但是我们观察到这个以太网帧只有60字节,why?
据RFC894的说明,以太网封装IP数据包的最大长度是1500字节(所以,数据链路层的最大传输单元(Maximum Transmission Unit,MTU)是1500字节),也就是说以太网最大帧长应该是以太网首部加上1500,再加上7字节的前导同步码和1字节的帧开始定界符,具体就是:7字节前导同步吗+1字节帧开始定界符+6字节的目的MAC+6字节的源MAC+2字节的帧类型+1500+4字节的FCS。
按照上述,最大帧应该是1526字节,但是实际上我们抓包得到的最大帧是1514字节,为什么不是1526字节呢?原因是当数据帧到达网卡时,在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和错,就丢弃此帧。如果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交“设备驱动程序”做进一步处理。这时我们的抓包软件才能抓到数据,因此,抓包软件抓到的是去掉前导同步码、帧开始分界符、FCS之外的数据,只留下了目的地址,源地址,类型字段,其最大值是6+6+2+1500=1514。
以太网规定,以太网帧数据域部分最小为46字节,也就是以太网帧最小是6+6+2+46+4=64。除去4个字节的FCS,因此,抓包时就是60字节。当数据字段的长度小于46字节时,MAC子层就会在数据字段的后面填充以满足数据帧长不小于64字节。由于填充数据是由MAC子层负责,也就是设备驱动程序。不同的抓包程序和设备驱动程序所处的优先层次可能不同,抓包程序的优先级可能比设备驱动程序更高,也就是说,我们的抓包程序可能在设备驱动程序还没有填充不到64字节帧的时候,已经捕获了数据。因此不同的抓包工具抓到的数据帧的大小可能不同。(比如,wireshark抓到的可能没有填充数据段,而sniffer抓到的就有填充数据段)
2、IP数据包
IP头大小最小为20字节。所以,网络层的MTU=数据链路层的MTU1500-20=1480字节。
由于IP协议提供为上层协议分割和重组报文的功能,在IP头中,用2个字节来描述报文的长度,2个字节所能表达的最大数字就是65535。所以,IP数据包的最大长度就是64K字节(65535)。
3、TCP(传输层)
TCP头部选项是一个可变长的信息,这部分最多包含40字节,因为TCP头部最长60字节,(其中还包含前面20字节的固定部分)。
依靠IP协议提供的报文分割和重组机制,TCP包头中就没有“包长度”字段,而完全依靠IP层去处理分帧。这就是为什么TCP常常被称作一种“流协议”的原因,开发者在使用TCP服务的时候,不必去关心数据包的大小,只需讲SOCKET看作一条数据流的入口,往里面放数据就是了,TCP协议本身会进行拥塞/流量控制。
选项和填充,n4字节,常见的可选字段是最长报文大小 MSS(Maximum Segment Size) 。每个连接方通常都在通信的第一个报文段(为建立连接而设置 SYN 标志的那个段)中指明这个选项,它指明本端所能接收的最大长度的报文段。选项长度不一定是 32 位字的整数倍,所以要加填充位,使得报头长度成为整字数
MTU和MSS值的关系:MTU=MSS+IP Header+TCPHeader
通信双方最终的MSS值=较小MTU-IP Header-TCP Header
4、UDP(传输层)
UDP包的首部要占用8字节,因为UDP提供无连接服务,它的数据包包头,是固定长度的8字节,不存在可选字段,可以减少很多传输开销,所以它无需使用首部字段长,因为它的首部就是固定的。
UDP则与TCP不同,UDP包头内有总长度字段,同样为两个字节,因此UDP数据包的总长度被限制为65535,这样恰好可以放进一个IP包内,使得 UDP/IP协议栈的实现非常简单和高效。
所以UDP包的最大值是:IP数据包的最大长度65535-IP头的大小20-UDP头的大小=65507字节。最小值是0。
这个值也就是你在调用getsockopt()时指定SO_MAX_MSG_SIZE所得到返回值,任何使用SOCK_DGRAM属性的socket,一次send的 数据都不能超过这个值,否则必然得到一个错误。
————————————————
版权声明:转载
参考链接:
https://blog.csdn.net/buside/article/details/92802959?utm_medium=distribute.pc_relevant.none-task-blog--1.control&dist_request_id=1328655.9369.16158574515802585&depth_1-utm_source=distribute.pc_relevant.none-task-blog--1.control
https://blog.csdn.net/ytx2014214081/article/details/80112277
https://www.cnblogs.com/caoguoping100/p/3658792.html
https://www.cnblogs.com/sinferwu/articles/7615276.html
原文链接:https://blog.csdn.net/qq_33344148/article/details/114929274?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166962502316800184133845%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166962502316800184133845&biz_id=0&utm_me
文章知识点与官方知识档案匹配
算法技能树首页概览
35079 人正在系统学习中
打开CSDN APP,看更多技术内容
C++ 解析pcap文件_c++ pcap_fulianzhou的博客
#ifndef _PCAP_PARSER_H_ #define _PCAP_PARSER_H_ #include <stdint.h> #pragma pack(1) //pacp文件头结构体 struct pcap_file_header { uint32_t magic; /* 0xa1b2c3d4 */ uint16_t version_major; /* magjor Versi...
继续访问
Proxysql--灵活强大的MySQL代理层_kaifly的博客_proxysql
~]# date; service iptables restart; tcpmp -i em2 host 192.168.1.34 and port 3306 and host not 192.168.1.10 -w /tmp/sysbench-proxysql-network-issue.pacp 发现,sysbench“一直”在重传由于iptables新规则而无法返回的几个请...
继续访问
网络安全系列-二十五: PCAP文件格式详解及读取PCAP文件源码示例
在Linux里,pcap是一种通用的数据流格式,是用于保存捕获的网络数据的一种非常基本的格式。 很多开源的项目都使用这种数据格式,如wireshark、tcpmp、scapy、snort 本文针对pcap的文件格式进行详解,并提供读取pcap文件的源代码示例
继续访问
使用wireshark分析tcpmp出来的pcap文件
个人认为tcpmp+wireshark是很精确的,之前在网上查阅移动端流量测试,大多讲tcpmp这部分很精细,但是没有讲到详细使用wireshark分析tcpmp到的.pcap文件,这里做一个详细的讲解,仅供大家参考。 本人wireshark版本是V 2.2.1。tcpmp到的.pcap文件可以直接双击打开(默认打开方式为wireshark,或者你在wireshark中选择打开文件也可以),抓取到的数据包很多,我们需要过滤一些想要的数据,那么在如图所示的输入框中输入表达式过滤即可: Wire
继续访问
2020-2021项目遇到的部分问题 编程语言C++ 编程软件QT_Qingshan_z的博...
4.需要点击安装Win10Pacp文件夹中的对应内容。 更改编译器后,程序中文字符报错显示,包含换行符等字符显示错误 改两个地方: 改编码为UTF-8:编辑—Select Encoding—UTF-8—按编码保存 工具—选项—文本—行为—UTF-8—如果是UTF-8添加...
继续访问
BGP路由器协议排错教程:与平台相关的数据包捕获工具_AMZ学术的博客-CSDN...
注释 分析 EPC 捕获信息最简单的方式是把这些信息导出到远端服务器,并使用Wireshark 读取导出的.pacp 文件 2.5.3 Ethanalyzer Ethanalyzer 是 NX-OS 中的 TShark 实现。TShark 是终端版本的 Wireshark。它可以在所有 Nexus 平台上捕获带...
继续访问
linux 下 tcpmp 详解 前篇(libpcap库源码分析)
一 概述 用简单的话来定义tcpmp,就是:mp the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 至于tcpmp参数如何使用,这不是本章讨论的重点。 liunx系统抓包工具,毫无疑问就是tcpmp。而windows的抓包工具,wireshark也是一款主流的抓包工具。wireshark 使用了winpcap库。tcpmp...
继续访问
pcap抓包库部分函数说明
学习通过侦听网卡获取报文的程序,遇到部分pacp抓包库中的函数,在查阅资料后,作以下整理说明: 1. pcap_next_ex(): 基于非回调函数的捕获数据包,参数有三个,一个网卡描述符,两个指针,两个指针会被初始化并返回给用户,一个是pcap_pkthdr结构,一个是接收数据的缓冲区。pcap_pkthdr结构如下所示: struct pcap_pkthdr { struc
继续访问
网络安全、Web安全、渗透测试之笔经面经总结(二)_普通网友的博客-CSD...
在Unix/Linux平台上,可以直接使用Socket构造IP包,在IP头中填上虚假的IP地址,但需要root权限;在Windows平台上,不能使用Winsock,需要使用Winpacp(也可以使用Libnet)。例如在Linux系统,首先打开一个Raw Socket(原始套接字),然后自己编写IP...
继续访问
Linux_liubo525的博客
文件-新建虚拟机-典型-稍后安装操作系统-Linux+版本-虚拟机名称-默认最大磁盘大小+存储为单个文件2)安装CentOS操作系统CD/DVD-使用ISO镜像文件-选择下载好了的ISO文件-打开虚拟机(开始安装虚拟机)...
继续访问
vlan 报文抓包.pcap
vlan报文,用于文档资源,学习vlan协议的时,可以下载看一下。
Pcap 数据包捕获格式详解
Pcap 是 Packet Capture 的英文缩写,是一种行业标准的网络数据包捕获格式。如果你是网络开发人员,那么通常会使用 Wireshark、Tcpmp 或 WinDump 等网络分析器捕获 TCP/IP 数据包,而抓包后存盘的文件格式就是 .pcap 文件。 文件格式 Pcap 文件格式是一种二进制格式,支持纳秒级精度的时间戳。虽然这种格式在不同的实现中有所不同,但是所有的 pcap 文件都具有如下图所示的一般结构。 全局报头 全局报头(Global Header)包含魔数(Magic nu
继续访问
渗透测试工程师面试题大全(164道)_Kal1的博客_渗透测试...
14.拿到一个 webshell 发现网站根目录下有.htaccess 文件,我们能做什么? 能做的事情很多,用隐藏网马来举例子: 插入<FilesMatch “xxx.jpg”> SetHandler application/x-httpd-php .jpg 文件会被解析成.php 文件 15.注入漏洞只能查账...
继续访问
dm 数据引流工具_hu5350026的博客_数据引流
log :该应用程序的日志记录文件存放的目录; third :该应用程序依赖的第三方 jar 文件存放的目录; wapper :该应用程序以服务方式启动包装文件的存放目录; service_start.bat/sh :该应用程序以服务方式启动时的启动服务脚本文件; ...
继续访问
MISC:流量包取证(pcap文件修复、协议分析、数据提取)
鼠标协议:每一个数据包的数据区有四个字节,第一个字节代表按键,当取 0x00 时,代表没有按键、为 0x01 时,代表按左键,为 0x02 时,代表当前按键为右键。第二个字节可以看成是一个 signed byte 类型,其最高位为符号位,当这个值为正时,代表鼠标水平右移多少像素,为负时,代表水平左移多少像素。HTTPs = HTTP + SSL / TLS. 服务端和客户端的信息传输都会通过 TLS 进行加密,所以传输的数据都是加密后的数据。但是,如果采用主动模式,那么数据传输端口就是 20;
继续访问
c语言判断pcap文件结尾,PCAP文件扩展名 - 什么是.pcap以及如何打开? - ReviverSoft...
你在这里因为你有,有一个文件扩展名结尾的文件.pcap.文件与文件扩展名.pcap只能通过特定的应用程序推出。这有可能是.pcap文件是数据文件,而不是文件或媒体,这意味着他们并不是在所有观看。什么是一 .pcap 文件?该.pcap文件扩展名主要使用Wireshark相关;用于分析网络的程序。 .pcap文件是使用程序创建的数据文件,并且它们包含的...
继续访问
UEBA架构设计之路1_lionzl的博客
Tcpmp,tcpflow生成的pacp或流数据,以及其他数据包级和session级信息 性能下降,超时,瓶颈或可疑活动,表明网络可能受到威胁或远程攻击 Syslog 路由、交换、其他网络设备 故障、分析、安全审计 WEB访问日志 WEB服务器 WEB分析 PROXY日...
继续访问
pcap文件解析--pcap文件头与包文件头(一)
初识Pcap文件 在开始读取pcap文件之前,先让我们来看看Pcap文件的大概结构。 如上图所示在一个Pcap文件中存在1个Pcap文件头和多个数据包,其中每个数据包都有自己的头和包内容。 下面我们先看看PCAP文件头每个字段是什么意思: magic为文件识别头,pcap固定为:0xA1B2C3D4。(4个字节) magor version为主版本号(2个
继续访问
pcap文件linux怎么打开,pcap文件用什么打开
linux 应用 pcap文件怎么打开如果你是一个测试入侵侦测系统或一些网络访问控制策略的网络管理员,那么你经常需要抓取数据包并在离线状态下分析这些文件。当需要保存捕获的数据包时,我们一般会存储为 libpcap 的数据包格式 pcap,这是一种被许多开源的嗅探工具以及捕包程序请问用什么软件打开*.pcap格式的文件?CSS布局HTML小编今天和大家分享解wireshark 怎么打不开pcap文件...
继续访问
Wireshark网络分析实战——Wireshark的安装和抓包
一、Wireshark简介 本节涵盖以下内容: 安置Wireshark(主机/程序); 开始抓包; 本书的前言曾提到过网络排障以及内置于Wireshark能帮助排障的各种工具。一旦决定动用Wireshark协议分析软件,在使用之前,则有必要先确定该软件在网络中的部署(或安装)位置。除此之外,还得对该软件做一些基本的配置,至少应让其界面看起来更为友好。 用Wireshark执行基本的抓包操作,配置起来并不麻烦,但是该软件也包含了很多高级配置选项,可用来应对某些特殊情况。这样的特殊情况包括令Wireshar
继续访问
学习笔记——C++实现ARP欺骗
以下代码大体上是没有问题的,可以根据自己的一些需求进行修改! 谢谢指正错误 在课设期间,从网上学习了简单的实现ARP欺骗 ARP欺骗的原理很简单:通过不断的向目标发送ARP包,致使目标主机的ARP缓存表中正确的IP映射的是错误的MAC地址 在书上的介绍中,采用了WinPcap的开发包,这样很方便的对网卡进行操作 所以,首先需要安装winpacp,并下载开发者包https://www......
继续访问
热门推荐 pcap文件格式及文件解析
第一部分:PCAP包文件格式 一 基本格式: 文件头 数据包头数据报数据包头数据报...... 二、文件头: 文件头结构体 sturct pcap_file_header { DWORD magic; DWORD version_major; DWORD ve
继续访问
最新发布 pcap详解
pcap格式及API详解
继续访问
从pcap文件提取包长度序列
从pcap文件提取包长度序列 1. 抓包 在windows系统,使用wireshark抓取YY语音流数据,最好是单条链路单向的。数据存储为pcap文件。 2. 格式转换 在linux系统终端,使用tcpmp命令把pcap文件转成txt文件。 命令为:tcpmp -r input.pcap > output.txt 3. 提取 在windows系统,使用matlab从转
继续访问
Ethernet Packet 解析
目录 引言 引言 接上篇文章 Pcap文件格式 ,我们分析了Pcap文件的global Header 和 Pcap Packet Header现在来分析一下Pcap Data。因为global Header 定义的 network 01 为 ETHERNET, 所以这篇文章来分析一下Pcap Data为Ethernet Packet类型的数据。 Ethernet Packet 结构 参考文档 Ethernet_frame--wikipedia IEEE_802.1.
继续访问
pcap包解析
pacp包解析 在接触激光雷达的时候,不可避免的第一步就是看硬件说明书以及调试厂商发的样例数据。一般情况下,厂商在存储硬件的数据包的时候,都是通过存储pacp包实现的,所以如何读取pacp包,并从中解析出真正有用的数据就变得很重要,接下来我们一步步讲。 1.pacp包结构 一个Pcap文件包括“Pcap报头”,“数据区”两个部分,其中数据区又分成多个数据包,每个包有报头和数据两个部分,总体结构可见...
继续访问
pcap文件内容保存为csv文件
将pcap文件内容导出为csv文件
继续访问
pacp文件读取缓存
5. VB的截取封包和发送封包源码
参考资料:VB截取封包 关于VB开发外挂 尤其是API HOOK方面的分歧较多 其实vb做外挂一点也不逊色!
上过MSDN的开发者都知道 vb vc c# vj的样例是统一的 仅仅是语法表达不一样罢了!也就是说用VC写的功能 同样也能用VB写出来!
下面提供一段VB利用API截获RAW SOCKET封包的代码,请不吝赐教!
Dim soc As Long, dwRc As Long
Dim RemoteAddr As sockaddr
Dim LocalAddr As sockaddr
Dim inBuffer, outBuffer As String
Dim byteReturn As Long
Dim RetMsg As String
Dim strData As String
Dim nReceived As Long
Const MAX_PACK_LEN = 4096
Dim keepRun As Boolean
Dim asc() As Byte
Private Type TcpHeader 'typedef struct tcp_hdr //定义TCP首部
th_sport As Integer '; //16位源端口
th_dport As Integer '; //16位目的端口
th_seq As Long '; //32位序列号
th_ack As Long '; //32位确认号
th_lenres As Byte '; //4位首部长度/6位保留字
th_flag As Byte '; //6位标志位
th_win As Integer '; //16位窗口大小
th_sum As Integer '; //16位校验和
th_urp As Integer '; //16位紧急数据偏移量
End Type
........ 资料地址: http://hi..com/zyq0ting/blog/item/ab10783eca88783b70cf6ceb.html