scapy.contrib.isotp

ISOTPSocket.

class scapy.contrib.isotp.ISOTP(*args, **kargs)

Bases: scapy.packet.Packet

aliastypes
answers(other)
default_fields
static defragment(can_frames, use_extended_addressing=None)
direction
dst
exdst
explicit
exsrc
fields
fields_desc
显示类似RFC的架构
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              DATA             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                            Fig. ISOTP                            
ISOTP字段

data

StrField

b''

fieldtype
fragment()
name
original
overload_fields
overloaded_fields
packetfields
payload
post_transforms
raw_packet_cache
raw_packet_cache_fields
sent_time
sniffed_on
src
time
underlayer
validate_fields()
wirelen
class scapy.contrib.isotp.ISOTPHeader(*args, **kargs)

Bases: scapy.layers.can.CAN

aliastypes
extract_padding(p)
fields_desc
显示类似RFC的架构
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|FLAGS|                        IDENTIFIER                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     LENGTH    |                    RESERVED                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|               |
+-+-+-+-+-+-+-+-+

                         Fig. ISOTPHeader                         
ISOTPHeader字段

flags

FlagsField (3位)

<Flag 0 ()>

identifier

XBitField (29位)

0

length

ByteField

None

reserved

ThreeBytesField

0

guess_payload_class(payload)

ISOTP在帧的第一个半字节中编码帧类型.

post_build(pkt, pay)

这会将ByteField的"长度"设置为正确的值.

class scapy.contrib.isotp.ISOTPHeaderEA(*args, **kargs)

Bases: scapy.contrib.isotp.ISOTPHeader

aliastypes
fields_desc
显示类似RFC的架构
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|FLAGS|                        IDENTIFIER                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     LENGTH    |                    RESERVED                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|               |EXTENDED ADDRES|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                        Fig. ISOTPHeaderEA                        
ISOTPHeaderEA字段

flags

FlagsField (3位)

<Flag 0 ()>

identifier

XBitField (29位)

0

length

ByteField

None

reserved

ThreeBytesField

0

extended_address

XByteField

0

post_build(p, pay)

这会将ByteField的"长度"设置为正确的值. 需要'chb(len(pay)+ 1)',因为字段'extended_address'被计为CAN层上的有效负载

class scapy.contrib.isotp.ISOTPMessageBuilder(use_ext_addr=None, did=None, basecls=None)

Bases: object

ISOTP.defragment()和ISOTPSession都使用的从CAN帧中构建ISOTP消息的实用工具类.

此类尝试将某些CAN帧解释为ISOTP帧,同时具有和不具有扩展寻址. 例如,如果使用扩展地址07,则所有帧也将被解释为ISOTP单帧消息.

CAN帧通过feed()方法馈送到ISOTPMessageBuilder对象,并且可以使用pop()方法提取生成的ISOTP帧.

class Bucket(total_len, first_piece, ts=None)

Bases: object

push(piece)
property count

返回从提供的can框架构建的就绪ISOTP消息的数量

feed(can)

尝试将传入的CAN帧馈入状态机

pop(identifier=None, ext_addr=None)

返回构建的ISOTP消息

Parameters
  • 标识符 –如果不是None,则仅返回带有此目的地的isotp消息

  • ext_addr –如果标识符不为None,则仅返回具有此扩展地址的isotp消息作为目的地

Returns

ISOTP数据包,如果没有准备好消息,则为"无"

class scapy.contrib.isotp.ISOTPNativeSocket(iface=None, sid=0, did=0, extended_addr=None, extended_rx_addr=None, listen_only=False, padding=False, transmit_time=100, basecls=<class 'scapy.contrib.isotp.ISOTP'>)

Bases: scapy.supersocket.SuperSocket

auxdata_available = True
can_isotp_fc_options_fmt = '@3B'
can_isotp_ll_options_fmt = '@3B'
can_isotp_options_fmt = '@2I4B'
desc = 'read/write packets at a given CAN interface using CAN_ISOTP socket '
recv(x=65535)
recv_raw(x=65535)

接收一个数据包,然后返回一个包含(cls,pkt_data,时间)的元组

sockaddr_can_fmt = '@H3I'
scapy.contrib.isotp.ISOTPScan(sock, scan_range=range(0, 2048), extended_addressing=False, extended_scan_range=range(0, 256), noise_listen_time=2, sniff_time=0.1, output_format=None, can_interface=None, extended_can_id=False, verbose=False)

扫描总线上的ISOTP套接字并返回发现

Parameters
  • sock –与受扫描总线通信的CANSocket对象

  • scan_range –要扫描的CAN标识符的十六进制范围. 默认值为0x0-0x7ff

  • extended_addressing –使用ISOTP扩展寻址进行扫描

  • extended_scan_range – ISOTP扩展寻址值的范围

  • noise_listen_time –侦听总线上默认通信的秒数

  • sniff_time –扫描在发送第一帧后等待isotp流控制响应的时间

  • output_format –定义返回结果的格式(文本,代码或套接字). 提供一个字符串,例如" text". 默认为"套接字".

  • can_interface –用于创建返回的代码/套接字的接口

  • extended_can_id –使用扩展的CAN框架

  • 详细 -在扫描过程中显示信息

在定义的范围内扫描ISOTP套接字,并以指定格式返回找到的套接字. 格式可以是:

  • text: human readable output

  • 代码:用于复制和粘贴的python代码

  • 套接字:如果未指定输出格式,则将创建ISOTPSockets并以列表形式返回

class scapy.contrib.isotp.ISOTPSession(*args, **kwargs)

Bases: scapy.sessions.DefaultSession

对ISOTP数据包进行碎片整理.

用法:>>>嗅探(会话= ISOTPSession)

on_packet_received(pkt)
scapy.contrib.isotp.ISOTPSocket

scapy.contrib.isotp.ISOTPSoftSocket别名

class scapy.contrib.isotp.ISOTPSocketImplementation(can_socket, src_id, dst_id, padding=False, extended_addr=None, extended_rx_addr=None, rx_block_size=0, rx_separation_time_min=0, listen_only=False)

Bases: scapy.automaton.SelectableObject

ISOTP"状态机"的实施.

大多数ISOTP逻辑均来自https://github.com/hartkopp/can-isotp/blob/master/net/can/isotp.c

此类与ISOTPSoftSocket分开,以确保后台线程无法保存对ISOTPSoftSocket的引用,从而允许GC对其进行收集.

begin_send(x)

开始发送ISOTP消息. 此方法不会阻止.

can_send(load)
check_recv()

SelectableObject的实现

close()
on_can_recv(p)
on_recv(cf)

每次接收到CAN帧时必须调用的功能,以使状态机前进.

recv(timeout=None)

接收ISOTP帧,如果缓冲区中没有可用的ISOTP帧,则最多持续"超时"秒.

send(p)

发送ISOTP帧并阻塞,直到发送消息或发生错误为止.

class scapy.contrib.isotp.ISOTPSoftSocket(can_socket=None, sid=0, did=0, extended_addr=None, extended_rx_addr=None, rx_block_size=0, rx_separation_time_min=0, padding=False, listen_only=False, basecls=<class 'scapy.contrib.isotp.ISOTP'>)

Bases: scapy.supersocket.SuperSocket

出于以下原因,此类是围绕ISOTPSocketImplementation的包装器.

ISOTPSoftSocket旨在与can-isotp内核模块提供的Linux ISOTP套接字完全兼容,同时可在任何操作系统上使用. 因此,即使在调用recv()方法之前,此套接字也需要能够以FC帧响应传入的FF帧. 需要一个线程在后台接收CAN帧,并且由于不能保证较低层的CAN实现具有正常运行的POSIX select(),因此每个ISOTP套接字都需要其自己的CAN接收器线程. 当GC销毁ISOTPSoftSocket时,SuperSocket会自动调用close()方法. 但是,请注意,如果任何线程持有对ISOTPSoftSocket对象的引用,GC不会收集该引用.

ISOTP协议的实现以及必要的线程存储在ISOTPSocketImplementation类中,因此:

  • 没有从ISOTPSocketImplementation到ISOTPSoftSocket的引用

  • ISOTPSoftSocket通常可以被垃圾回收

  • 销毁后,将调用ISOTPSoftSocket.close()

  • ISOTPSoftSocket.close()将调用ISOTPSocketImplementation.close()

  • 垃圾回收器可以停止RX后台线程

begin_send(p)

开始传输消息p. 发送第一帧后,此方法返回. 如果需要多个帧来发送消息,则此套接字将无法发送其他消息,除非该帧的传输成功或失败.

close()
nonblocking_socket = True
recv(x=65535)
recv_raw(x=65535)

接收完整的ISOTP消息,阻塞直到收到消息或达到指定的超时为止. 如果self.timeout为0,则此函数不会阻塞并返回接收缓冲区中的第一帧;如果没有,则返回None.

static select(sockets, remain=None)

在sendrecv()例程期间调用此函数以等待套接字准备好接收

class scapy.contrib.isotp.ISOTP_CF(*args, **kargs)

Bases: scapy.packet.Packet

aliastypes
fields_desc
显示类似RFC的架构
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  TYPE | INDEX |      DATA     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                          Fig. ISOTP_CF                           
ISOTP_CF字段

type

BitEnumField (4位)

2

index

BitField (4位)

0

data

StrField

b''

class scapy.contrib.isotp.ISOTP_FC(*args, **kargs)

Bases: scapy.packet.Packet

aliastypes
fields_desc
显示类似RFC的架构
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  TYPE |FC FLAG|   BLOCK SIZE  |SEPARATION TIME|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                          Fig. ISOTP_FC                           
ISOTP_FC字段

type

BitEnumField (4位)

3

fc_flag

BitEnumField (4位)

0

block_size

ByteField

0

separation_time

ByteField

0

class scapy.contrib.isotp.ISOTP_FF(*args, **kargs)

Bases: scapy.packet.Packet

aliastypes
fields_desc
显示类似RFC的架构
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  TYPE |      MESSAGE SIZE     |     EXTENDED MESSAGE SIZE     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                               |      DATA     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                          Fig. ISOTP_FF                           
ISOTP_FF字段

type

BitEnumField (4位)

1

message_size

BitField (12位)

0

extended_message_size

BitField (条件)(32位)

0

data

StrField

b''

class scapy.contrib.isotp.ISOTP_SF(*args, **kargs)

Bases: scapy.packet.Packet

aliastypes
fields_desc
显示类似RFC的架构
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  TYPE |MESSAGE|              DATA             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                          Fig. ISOTP_SF                           
ISOTP_SF字段

type

BitEnumField (4位)

0

message_size

BitFieldLenField (4位)

None

data

StrLenField

b''