我在Python中使用原始套接字创建了一个简单的数据包嗅探器。
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
while True:
print s.recvfrom(1600)
它显示的互联网流量。但是,当我关闭主网络接口并使用scapy通过lo
接口(源和目标127.0.0.1)发送syn数据包时,没有任何打印。
基本上我使用scapy创建并发送10个syn包,其源和目的地是127.0.0.1,这在wireshark中可见。但不是在这个嗅探器。我以为可能存在长度问题。所以我将缓冲区大小设置为syn数据包的大小,即74(s.recvfrom(74)
),但仍然没有。只要我再次启动主网络接口,它就会显示所有TCP流量。
我需要关闭网络界面,这样我就不会收到除我自己创建的流量之外的任何其他流量。
我在哪里出错了?
答案 0 :(得分:1)
在Linux上:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<rotate
android:fromDegrees="-45"
android:pivotX="100%"
android:pivotY="0%"
android:toDegrees="0">
<shape android:shape="rectangle">
<solid android:color="@color/colorAccent" />
</shape>
</rotate>
</item>
</layer-list>
需要打开soc = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3))
soc.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 2**30)
soc.bind(("eth0",0x0003))
而不是RAW
。
编辑评论:
TCP
“080045”表示:
a = soc.recvform(65565)[0]
h = binascii.hexlify(a)
if h[24:30] == "080045" and h[46:48] == "06":
# h[24:30] == "080045" Means IP (Type field of Ethernet Header
# combined with IP Version and IP header length)
# h[46:48] == "06" Means TCP (Ip Protocol field of IP Header)
#do something with TCP packet
= IP
0800
= IP版本(IPv4)
4
=标头长度(每个4字节5个字)