DNP3理解小白书-3-使用scapy更新pcap的注意事项

本文详细介绍了使用Scapy工具进行pcap包构造的方法,包括长度字段的调整、TCP序列号设置、DNP链路层CRC计算等内容,并通过具体示例展示了CRC计算的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用scapy构更改pcap造包需要更改一些数据:

1、长度字段 减去crc的长度(定义比较变态)

   user_data 长度是 上面的总长度 - 5 (data_layer_header_ctrl,data_layer_header_da ,data_layer_header_sa
对应length字段之后的所有数据,且去除crc 都不算在里面)

2、TCP sequece ,number

3、DNP 链路层的data block的CRC(超过16,需要增加多个CRC字段)

4、DNP链路层头部的CRC

 

CRC(CEC是DNP专有算法crc-16/dnp,在python的crccheck里已经合入了)的一个例子:

如下红色的地方用于计算CRC,黑色的是CRC的值

056414c404000300c717c0c0013c02063c03063c04063c01068a51

056417c0040003008f08c0c0013c01063c02063c03063c04063c2f620506bfd6 (这个报文的第五个对象不合法)

056417c0040003008f08c0c0013c01063c02063c03063c040600df1a00064a3b

 

 

经典的电力系统通讯规约 //内部函数 void InitDNP3(BYTE ChanNo); void DNP3FrameProcess(void); void DNP3TimeControl(void); //解桢函数 BYTE DNP3CRCVerify( int BitLength,BYTE *DNP3ReceiveP ); void DNP3UnlockFrame(void); void DNP3DataLnkCon(void); //链路层控制 void Ft3Check(void); //解含有UserData的Ft3帧, 把UserData存入应用缓冲区 void DltoApp(void); //将DL层校验过的数据存入APP缓冲区 void AppRead(void); //读 void AppWrite(void); //写 void TimeWrite(void); //校时 void IINWrite(void); //写IIN标志位 void UnsolMessage(void); //产生主动上报的信息 void ClassMessage(void); //树类上报标志 void AppTimeMeasure(void); //通道延时测量 void ClassDefination(void); //类数据重定义 void AppFreez(void); //执行冻结 void AppControl(void); void UnsolAble(void); void UnsolDisable(void); void DnpClockToTime(struct CLOCK *lTimer,BYTE * Timebuf); //转换为DNP时间 void DnpTimeToClock(BYTE * Timebuf,struct CLOCK *lTimer); void AppYkSelect(void); //遥控选择 void AppYkOperate(void); //遥控执行 void DirectOperYk(void); //直接遥控执行 void GYKSelect(BYTE LNode,BYTE LAction); void GYKOperate(BYTE byNodeNum,BYTE lFun,BYTE lAct); void NewToOld(void); WORD GetOldId(BYTE i); //组桢函数 void DNP3Framing(void); void DNP3CRCGenerator( int BitLength, int StartBitPos, BYTE *TransData ); void AppFrame(void); //应用层组桢函数 void TransFrame(BYTE Lcase); //传输层组桢函数 void DlFrame(void); //链路层组桢函数 void Ft3FrameUserDate(BYTE LS); //组一帧FT3帧 void Ft3FrameCon(void); //组链路层命令桢 void AppSendUnsol(void); //如有突发信息上送,优先上送 void AppSendConfirm(void); //如有CONFIRM信息则上送 void AppRespone(void); //应用层响应帧 void DNP3AddIndication(void); //添加内部信息字IIN void FrameOneObject(BYTE AppFrameType,unsigned short iArray); void FrameOneInfo(unsigned short iDataStart,unsigned short iDataStop); unsigned short GetTotalDataN(BYTE bObjNum);//获取数据个数 void GetTimeDate(void); //获取当前时间 void DNP3GetYx(unsigned short i,BYTE); //静态遥信 void GetYxChange(WORD i); //变化遥信包括SOE void DNP3GetYc(unsigned short i); //静态遥测 void GetYcChange(WORD i); //变化遥测 void GetCounter(WORD i); //计数 void GetFrozenCounter(WORD i); //冻结计数 void DNP3GetAo(BYTE i); //AO数据 WORD GetAo(BYTE i); void AppControlRespone(void); void TimeRespone(void); //响应延时时间 void YkSelectRespone(void); void YkOperateRespone(void); void OperateAoRe(void);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值