# coding=utf-8 #import socket #udp=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #udp.connect((‘localhost‘,2425)) #udp.send(‘1:100:aaaaa:zhang:32:hello every body‘) #udp.send(‘1_lbt4_10#32899#002481627512#0#0#0:1289671407:flyingzl:flyingz l:288:一日不见,如三月兮‘) #coding=utf-8 import dpkt import sendpkt from socket import inet_aton from time import strftime import socket import types import uuid #本地网关MAC地址,可以通过如下方式获取: #C:\Users\Administrator>arp -a #接口: 192.168.0.100 --- 0xb # Internet 地址 物理地址 类型 # 192.168.0.1 00-03-47-ca-e4-5c 动态 MASK_MAC=‘4c-5e-0c-b1-50-29‘ def get_local_mac(): ‘‘‘ 获得本机Mac地址 ‘‘‘ mac=uuid.uuid1().hex[-12:] return ‘-‘.join([mac[(i-1)*2:2*i] for i in range(1,7)]) def send_msg(kwargs): ‘‘‘ 发送消息,kwargs参数为一个dict对象 ‘‘‘ if type(kwargs) is not types.DictType: return #本机ip地址 local_ip=kwargs.get(‘src‘,socket.gethostbyname(socket.gethostname())) #转码后的源ip地址 src_ip=inet_aton(local_ip) #转码后的目的ip地址 dst_ip=inet_aton(kwargs.get(‘dst‘)) #本机mac地址 local_mac=kwargs.get(‘src_mac‘,get_local_mac()) #转码后的源mac地址 src_mac=pack_mac(local_mac) #判断remote_ip和local_ip是否在同一个网段 #转码后的目的mac地址 dst_mac=pack_mac(kwargs.get(‘dst_mac‘))if trans(local_ip)==trans(kwargs.get(‘dst‘)) else pack_mac(MASK_MAC) host=kwargs.get(‘host‘,socket.gethostname()) user=kwargs.get(‘user‘,‘User‘) msg=kwargs.get(‘msg‘,‘Hello‘) #找到第一个网络端口,根据自己的情况修改 #安装了VirtualBox、VMWare或者有无线网卡的同学得自己修改下 device=sendpkt.findalldevs()[0] #飞鸽监听本地的UDP 2425端口 udp=dpkt.udp.UDP(dport=2425,sport=2425) #向飞鸽发送消息命令字 #6291458表示下线 #6291457表示上线 #288表示发送信息 #如果是飞秋,65664这个状态会在对方上显示为两个太阳 msg="1_lbt4_10#65664#%s#0#0#0:%s:%s:%s:288:%s" %(local_mac.replace(‘-‘,‘‘),int(strftime(‘%m%d%H%M%S‘))+100000000,user,host,msg) msg=msg.encode("utf-8") udp.data+=msg udp.ulen=len(udp) ip=dpkt.ip.IP(src=src_ip,dst=dst_ip,data=udp,p=dpkt.ip.IP_PROTO_UDP) #重新计算ip的长度,不然消息发送不出去 ip.len=len(ip) ether=dpkt.ethernet.Ethernet( dst=dst_mac, src=src_mac, type=0x0800, data=ip ) sendpkt.sendpacket(str(ether),device) def trans(ip,mask=‘255.255.255.0‘): ‘‘‘ 判断两个ip地址是否在同一个网段 ‘‘‘ str=[] ip=ip.split(".") mask=mask.split(".") for index,item in enumerate(ip): str.append(int(item)&int(mask[index])) return str def pack_mac(mac,pattern=‘-‘): ‘‘‘ 网卡地址转为以太网Mac地址 例如将"08-00-27-ba-f7-e5"转为"\x08\x00‘\xba\xf7\xe5" ‘‘‘ mac=mac.split(pattern.lower()) return "".join([chr(int(‘0x‘+x,16)) for x in mac]) if __name__=="__main__": s={ ‘src‘:‘192.168.155.1‘, ‘dst‘:‘192.168.155.1‘, ‘src_mac‘:‘ff-ff-ff-ff-ff-ff‘, #这个地址最好别写错,可以从飞鸽上看到好友的Mac地址 ‘dst_mac‘:‘ff-ff-ff-ff-ff-ff‘, ‘host‘:‘哈哈‘, ‘user‘:‘呵呵‘, ‘msg‘:‘加班呀?‘ } send_msg(s)
时间: 2024-10-08 01:22:48