我需要一个网站,影响网站速度吗,购物网站补货提醒软件怎么做,广东微信网站推广哪家专业1.代码及代码讲解。
代码编写工具#xff1a;VsCode
#xff08;1#xff09;socket嗅探器
首先第一个脚本是最简单的原始socket嗅探器#xff0c;它只会读一个数据包#xff0c;然后直接退出#xff1a;
import socket
import os#host to listen on
HOST
#这里输入…1.代码及代码讲解。
代码编写工具VsCode
1socket嗅探器
首先第一个脚本是最简单的原始socket嗅探器它只会读一个数据包然后直接退出
import socket
import os#host to listen on
HOST
#这里输入自己的IP地址def main():#create raw socket, bin to public interfaceif os.name nt:socket_protocol socket.IPPROTO_IPelse:socket_protocol socket.IPPROTO_ICMPsniffer socket.socket(socket.AF_INET,socket.SOCK_RAW.socket_protocol)sniffer.bind((HOST,0))#include the IP header in the capturesniffer.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)if os.name nt:sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)#read one packetprint(sniffer.recvfrom(65565))if os.name nt:sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_OFF)
if __name__ __main__:main()注意这里Windows和Linux的区别是前者允许我们嗅探任何协议的所有流入数据而后者强制我们指定一个协议来嗅探这里指定的是ICMP。
上面这只是一个非常简单的嗅探器那我们将对它的功能进行进一步的拓展。
2ip解码器
import ipaddress
import os
import socket
import struct
import sys#定义了一个Python结构把数据包的前20个字节映射到IP头对象中。展示目前的通信协议和通信双方的IP地址
class IP:def __init__(self, buffNone):header struct.unpack(BHHHBBH4s4s, buff)self.ver header[0] 4self.ihl header[0] 0xFself.tos header[1]self.len header[2]self.id header[3]self.offset header[4]self.ttl header[5]self.protocol header[6]self.sum header[7]self.src header[8]self.dst header[9]# human readable IP addresses#使用新打造的IP头结构将抓包逻辑改成持续抓包和解析self.src_address ipaddress.ip_address(self.src)self.dst_address ipaddress.ip_address(self.dst)# map protocol constants to their namesself.protocol_map {1: ICMP, 6: TCP, 17: UDP}try:self.protocol self.protocol_map[self.protocol_num]except Exception as e:print(%s No protocol for %s % (e, self.protocol_num))self.protocol str(self.protocol_num)def sniff(host):# should look familiar from previous exampleif os.name nt:socket_protocol socket.IPPROTO_IPelse:socket_protocol socket.IPPROTO_ICMPsniffer socket.socket(socket.AF_INET,socket.SOCK_RAW,socket_protocol)sniffer.bind((host,0))sniffer.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)if os.name nt:sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)try:while True:# read a packet#将前20字节转换成IP头对象raw_buffere sniffer.recvfrom(65535)[0]# create an IP header from the first 20 bytesip_header IP(raw_buffere[0:20])# print the detected protocol and hosts#打印抓取信息print(Protocol: %s %s - %s % (ip_header.protocol, ip_header.src_address, ip_header.dst_address))except KeyboardInterrupt:# if were on Windows, turn off promiscuous modeif os.name nt:sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_OFF)sys.exit()if __name__ __main:if len(sys.argv) 2:host sys.argv[1]else:host sniffer(host)在理解这一部分的内容之前我们首先要了解一个python库。struct库struct库提供了一些格式字符用来定义二进制数据的结构。这个库在解码密码学方面经常会用到。
注在struct库里不存在对应于nybble格式即4个二进制位组成的数据块也叫作nibble的格式字符。
self.ver header[0] 4
对于IP头的第一个字节我们只想取高位nybble整个字节里的第一个nybble作为ver的值。取某字节高位nybble的常规方法是将其向右位移4位相当于在该字节的开头填4个0把其尾部的4位挤出去。这样我们就得到了原字节的第一个nybble。
self.ihl header[0] 0xF我们想把低位nybble或者说原字节的最后4个二进制位填进hdrlen里取某个字节低位nybble的常规方法是将其与数字
0xF00001111进行按位与运算。它利用了0 AND 1 0的特性0代表假1代表真。想要AND表达式为真表达式两边都必须为真。所以这个操作相当于删除前4个二进制位因为任何数AND 0都得0它保持了最后4个二进制位不变因为任何数AND 1还是原数字。
3解码ICMP
import ipaddress
import os
import socket
import struct
import sys#定义了一个Python结构把数据包的前20个字节映射到IP头对象中。展示目前的通信协议和通信双方的IP地址
class IP:def __init__(self, buffNone):header struct.unpack(BHHHBBH4s4s, buff)self.ver header[0] 4self.ihl header[0] 0xFself.tos header[1]self.len header[2]self.id header[3]self.offset header[4]self.ttl header[5]self.protocol header[6]self.sum header[7]self.src header[8]self.dst header[9]# human readable IP addresses#使用新打造的IP头结构将抓包逻辑改成持续抓包和解析self.src_address ipaddress.ip_address(self.src)self.dst_address ipaddress.ip_address(self.dst)# map protocol constants to their namesself.protocol_map {1: ICMP, 6: TCP, 17: UDP}try:self.protocol self.protocol_map[self.protocol_num]except Exception as e:print(%s No protocol for %s % (e, self.protocol_num))self.protocol str(self.protocol_num)class ICMP:def __init__(self, buff):header struct.unpack(BBHHH, buff)self.type header[0]self.code header[1]self.sum header[2]self.id header[3]self.seq header[4]def sniff(host):# should look familiar from previous exampleif os.name nt:socket_protocol socket.IPPROTO_IPelse:socket_protocol socket.IPPROTO_ICMPsniffer socket.socket(socket.AF_INET,socket.SOCK_RAW,socket_protocol)sniffer.bind((host,0))sniffer.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)if os.name nt:sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)try:while True:# read a packet#将前20字节转换成IP头对象raw_buffere sniffer.recvfrom(65535)[0]# create an IP header from the first 20 bytesip_header IP(raw_buffere[0:20])# if its ICMP, we want itif ip_header.protocol ICMP:print(Protocol: %s %s - %s % (ip_header.protocol,ip_header.src_address, ip_header.dst_address))print(fVersion: {ip_header.ver})print(fHeader Length; {ip_header.ihl} TTL: {ip_header.ttl})# calculate where our ICMP packet startsoffset ip_header.ihl * 4buf raw_buffere[offset:offset 8]# create our ICMP structureicmp_header ICMP(buf)print(ICMP - Yype: %s Code: %s\n % (icmp_header.type, icmp_header.code))except KeyboardInterrupt:if os.name nt:sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)sys.exit() if __name__ __main:if len(sys.argv) 2:host sys.argv[1]else:host 10.74.212.22sniff(host)这段代码在之前的IP结构下方又创建了一个ICMP结构。在负责接收数据包的主循环中我们会判断接收到的数据包是否为ICMP数据包然后计算出ICMP数据在原始数据包中的偏移最后将数据按照ICMP结构进行解析。
4scanner.py
那前面我们已经完成了大部分工作只剩下了一个任务——群发UDP数据包并解析结果
import ipaddress
import os
import socket
import struct
import sys
import threading
import time#subnet to target
SUBNET 192.168.0.1/24
# magic string well check ICMP responses for
#添加的这点代码应该很好理解。我们定义了一个简单的字符串作为“签名”用于确认收到的ICMP响应是否是由我们发送的UDP包所触发的MESSAGE PYTHONRULES!#定义了一个Python结构把数据包的前20个字节映射到IP头对象中。展示目前的通信协议和通信双方的IP地址
class IP:def __init__(self, buffNone):header struct.unpack(BHHHBBH4s4s, buff)self.ver header[0] 4self.ihl header[0] 0xFself.tos header[1]self.len header[2]self.id header[3]self.offset header[4]self.ttl header[5]self.protocol header[6]self.sum header[7]self.src header[8]self.dst header[9]# human readable IP addresses#使用新打造的IP头结构将抓包逻辑改成持续抓包和解析self.src_address ipaddress.ip_address(self.src)self.dst_address ipaddress.ip_address(self.dst)# map protocol constants to their namesself.protocol_map {1: ICMP, 6: TCP, 17: UDP}try:self.protocol self.protocol_map[self.protocol_num]except Exception as e:print(%s No protocol for %s % (e, self.protocol_num))self.protocol str(self.protocol_num)class ICMP:def __init__(self, buff):header struct.unpack(BBHHH, buff)self.type header[0]self.code header[1]self.sum header[2]self.id header[3]self.seq header[4]def udp_sender():with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sender:for ip in ipaddress.ip_network(SUBNET).hosts():sender.sendto(bytes(MESSAGE, utf8), (str(ip), 65212))class Scanner:def __init__(self, host):self.host hostif os.name nt:socket_protocol socket.IPPROTO_IPelse:socket_protocol socket.IPPROTO_ICMPself.socket socket.socket(socket.AF_INET,socket.SOCK_RAW, socket_protocol)self.socket.bind((host, 0))self.socket.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)if os.name nt:self.socket.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)def sniff(self):hosts_up set([f{str(self.host)} *])try:while True:# read a packetraw_buffer self.socket.recvfrom(65535)[0]# create an IP header from the first 20 bytesip_header IP(raw_buffer[0:20])# if its ICMP, we went itif ip_header.protocol ICMP:offset ip_header.ihl1 * 4buf raw_buffer[offset:offset 8]icmp_header ICMP(buf)if icmp_header.code 3 and icmp_header.type 3:if ipaddress.ip_address(ip_header.src_address) in ipaddress.IPv4Network(SUBNET):# make sure it has our magic messageif raw_buffer[len(raw_buffer) - len(MESSAGE):] bytes(MESSAGE, utf8):tgt str(ip_header.src_address)if tgt !self.host and tgt not in hosts_up:hosts_up.add(str(ip_header.src_address))print(fHost Up: {tgt})except KeyboardInterrupt:if os.name nt:self.socket.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)print(\nUser interrupted)if hosts_up:print(f\n\nSummary: Hosts up on {SUBNET})for host in sorted(hosts_up):print(f{host})print()sys.exit()if __name__ __main:if len(sys.argv) 2:host sys.argv[1]else:host s Scanner(host)time.sleep(5)t threading.Thread(targetudp_sender)t.start()s.sniff()其中我们引入ipaddress库这样就能对整个子网进行主机发现扫描。
sniff函数会嗅探网络上的数据步骤跟之前的例子差不多唯一的区别就是这次它会把在线的主机记录下来。接收到预期的ICMP消息时我们首先检查这个响应是不是来自我们正在扫描的子网然后检查ICMP消息里有没有我们自定义的签名。如果所有检查都通过了就把发送这条ICMP消息的主机IP地址打印出来。如果使用CtrlC组合键中断扫描过程的话程序就会关闭网卡混杂模式如果是Windows平台并且把迄今为止扫描出来的主机都打印到屏幕上。
那到这里我们的流量嗅探工具已经算编写完成了希望大家有所收获。 【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图】 一、Python编程入门到精通
二、接口自动化项目实战 三、Web自动化项目实战
四、App自动化项目实战 五、一线大厂简历
六、测试开发DevOps体系 七、常用自动化测试工具
八、JMeter性能测试 九、总结尾部小惊喜
生命不息奋斗不止。每一份努力都不会被辜负只要坚持不懈终究会有回报。珍惜时间追求梦想。不忘初心砥砺前行。你的未来由你掌握
生命短暂时间宝贵我们无法预知未来会发生什么但我们可以掌握当下。珍惜每一天努力奋斗让自己变得更加强大和优秀。坚定信念执着追求成功终将属于你
只有不断地挑战自己才能不断地超越自己。坚持追求梦想勇敢前行你就会发现奋斗的过程是如此美好而值得。相信自己你一定可以做到
最后感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走 这些资料对于【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴上万个测试工程师们走过最艰难的路程希望也能帮助到你