- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 Scapy 正确剖析 PPPoE 发现数据包。以下是 Scapy 显示示例 PADI 数据包的方式:
>>> p = Ether("\xff\xff\xff\xff\xff\xff\x08\x00'\xf3<5\x88c\x11\t\x00\x00\x00\x0c\x01\x01\x00\x00\x01\x03\x00\x04\xe0\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
>>> p.show()
###[ Ethernet ]###
dst= ff:ff:ff:ff:ff:ff
src= 08:00:27:f3:3c:35
type= 0x8863
###[ PPP over Ethernet Discovery ]###
version= 1L
type= 1L
code= PADI
sessionid= 0x0
len= 12
###[ Raw ]###
load= '\x01\x01\x00\x00\x01\x03\x00\x04\xe0\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
我想解析原始负载。此有效负载只是一个 PPPoE 标签列表。每个标签由两个字节代码字段、两个字节长度字段和一个值(当然是前一个字段给定的长度)组成。
这是我代表这一切的尝试:
from scapy.all import *
class PPPoETag(Packet):
name = "PPPoE Tag"
fields_desc = [ ShortEnumField('tag_type', None,
{0x0000: 'End-Of-List',
0x0101: 'Service-Name',
0x0102: 'AC-Name',
0x0103: 'Host-Uniq',
0x0104: 'AC-Cookie',
0x0105: 'Vendor-Specific',
0x0110: 'Relay-Session-Id',
0x0201: 'Service-Name-Error',
0x0202: 'AC-System-Error',
0x0203: 'Generic-Error'}),
FieldLenField('tag_len', None, length_of='tag_value', fmt='H'),
StrLenField('tag_value', '', length_from=lambda pkt:pkt.tag_len)]
def extract_padding(self, s):
return '', s
class PPPoED_Tags(Packet):
name = "PPPoE Tag List"
fields_desc = [ PacketListField('tag_list', None, PPPoETag) ]
bind_layers(PPPoED, PPPoED_Tags, type=1)
不太确定这是否是正确和最好的方法。有什么改进建议吗?
最佳答案
我会这样做,就像 Scapy 的 Dot11Elt 实现一样(加上它正确理解 End-Of-List
标记后的字节作为填充):
class PPPoE_Tag(Packet):
name = "PPPoE Tag"
fields_desc = [ ShortEnumField('tag_type', None,
{0x0000: 'End-Of-List',
0x0101: 'Service-Name',
0x0102: 'AC-Name',
0x0103: 'Host-Uniq',
0x0104: 'AC-Cookie',
0x0105: 'Vendor-Specific',
0x0110: 'Relay-Session-Id',
0x0201: 'Service-Name-Error',
0x0202: 'AC-System-Error',
0x0203: 'Generic-Error'}),
FieldLenField('tag_len', None, length_of='tag_value', fmt='H'),
StrLenField('tag_value', '', length_from=lambda pkt:pkt.tag_len)]
bind_layers(PPPoED, PPPoE_Tag, type=1)
bind_layers(PPPoE_Tag, Padding, tag_type=0)
bind_layers(PPPoE_Tag, PPPoE_Tag)
关于python - 使用 Scapy 解析 PPPoE 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8723377/
我在电脑上有 PPPOE 连接。那台电脑有两个 LAN 卡,我在上面激活了 ICS。问题是,连接会随着时间的推移而退化(不知道为什么),重拨可能会很好,每小时一次。我正在考虑编写一个 AutoIT 脚
我已经成功安装了 roar-penguin pppoe-server 并尝试使用它但没有成功,我不明白的是,当我输入 /etc/ppp/pppoe-server-options debug logfi
我在我的应用程序中使用 pcapdotnet 的 DLL,但是因为这个项目目前不支持 PPPOE,所以我想自己添加功能。我的问题是我对数据包结构和PPPOE数据包结构没有很好的理解。我不知道开始的最佳
我的一个软件需要在 Windows 上更改系统代理。更改 用于路由器后面的 LAN 连接 的 HTTP 代理很容易,但我找不到任何关于如何更改用于拨号或直接 DSL(即 PPPoE)连接的代理的信息。
我正在尝试使用 Scapy 正确剖析 PPPoE 发现数据包。以下是 Scapy 显示示例 PADI 数据包的方式: >>> p = Ether("\xff\xff\xff\xff\xff\xff\x
我正在使用 rp-pppoe 3.10。我已经配置了 PPPoE 服务器和客户端。建立 session 时,如何找出服务器分配给客户端的PPPoE session ID?它是否在/etc/ppp 文件
由于我是 Android 的新手,我不知道如何使用 wifi 连接将 Android(HTC Desire 上的 2.1)与 PPPoE 连接。 所以请任何人知道解决方案,然后请帮助我。 最佳答案 如
问候, 由于各种原因,我的互联网连接如下所示: [DSL Modem in Bridge Mode] (eth0)[Linux system](eth1) [Wireless Router] (L
我是一名优秀的程序员,十分优秀!