编程读取chap挑战值并生产应答包
实验要求
1、熟悉Chap协议流程,编程生成Chap应答
2、根据PPTP数据包,生产Chap应答,比较验证。
实验步骤
一、读取pcap数据包
1、先了解pcap数据包的格式及结构
Pcap数据包的前24字节是文件的包头,其中包含了数据包个数,数据包总长度,时间戳等信息,这24字节信息对我们没有太大用处,因此我们将其略过不读。使用fseek函数直接跳过该文件头即可。
接下来是每个数据包的pcap头,其中有该数据包的长度,时间戳等信息,一共8个字节,其中数据包的长度对我们用处最大,因此我们需要将其读取并存储起来。下为pcap包头结构体
typedef struct pcap_pktheader
{
int tv_sec;
int tv_usec;
u_int8_t caplen[4];
u_int8_t len[4];
}pcap_pktheader;
2、读取数据包内容
然后接下来就是数据包的内容,包含数据帧头,IP帧头,GRE协议帧头,PPP协议,以及PPP传输内容,由于我们要生成response响应数据包,因此这些数据内容我们均要读取并保存,因此我们使用如下结构体:
数据帧头结构体:
typedef struct FrameHeader_t
{
u_int8_t DstMac[6];
u_int8_t SrcMac[6];
u_int16_t FrameType;
}FrameHeader_t;
IP数据报头结构体:
typedef struct IPHeader_t
{
u_int8_t Ver_HLen;
u_int8_t Tos;
u_int8_t TotalLen[2];
u_int16_t ID;
u_int16_t flags_and_offset;
u_int8_t TTL;
u_int8_t Protocol;
u_int16_t Checksum;
u_int8_t SrcIP[4];
u_int8_t DstIP[4];
}IPHeader_t;
GRE协议头结构体:
typedef struct GRE_header
{
u_int16_t Flags_and_ver;
u_int16_t Pro_type;
u_int8_t Payload_len[2];
u_int16_t Call_ID;
u_int32_t Seq_num;
u_int32_t Ack_num;
}GRE_header;
PPP协议结构体:
typedef struct PPP_pro
{
u_int16_t Pro;
}PPP_pro;
PPP数据包头结构体:
typedef struct PPP_header
{
u_int8_t code;
u_int8_t identifier;
u_int8_t len[2];
}PPP_header;
3、读取PPP数据包内容
根据PPP数据包的格式我们知道,包头后第一个字节为value_size,它代表着挑战值的长度,接着是value_size个字节的挑战值,然后是name,因此我们使用如下代码将挑战值读取出来:
读取value_size
u_int8_t value_size;
fread(&value_size,sizeof(u_int8_t),1,fp);
读取挑战值value
u_int8_t * value;
value=(u_int8_t*)malloc(sizeof(u_int8_t)*value_size);
fread(value,value_size,1,fp);
接着是name,name的长度为包头中的包长度-value_size-包头长度-1(value_size)
u_int8_t * name;
u_int16_t namelen;
namelen=PPPheader->len[0]*256+PPPheader->len[1]-value_size-sizeof(PPP_header)-1;
name=(u_int8_t*)malloc(sizeof(u_int8_t)*namelen);
fread(name,namelen,1,fp);
fclose(fp);
二、对得到的挑战值进行加密
1、首先输入该PPP传输时的用户名及密码
该数据包为(user_name: qq , user_passwd: qq)
要输入抓包时客户端登陆的用户名及密码
char user_name[15]

最低0.47元/天 解锁文章
1020

被折叠的 条评论
为什么被折叠?



