用Golang自己构造ICMP数据包

ICMP是用来对网络状况进行反馈的协议,可以用来侦测网络状态或检测网路错误。

限于当前Golang在网络编程方面的代码稀缺,资料甚少,所以分享一个用Golang来构造ICMP数据包并发送ping程序的echo消息的实例。

RFC792定义的echo数据包结构:

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |     Code      |          Checksum             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Identifier          |        Sequence Number        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Data ...
   +-+-+-+-+-

代码:

[java] view plain copy

  1. package main
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "fmt"
  6. "net"
  7. )
  8. type ICMP struct {
  9. Type        uint8
  10. Code        uint8
  11. Checksum    uint16
  12. Identifier  uint16
  13. SequenceNum uint16
  14. }
  15. func CheckSum(data []byte) uint16 {
  16. var (
  17. sum    uint32
  18. length int = len(data)
  19. index  int
  20. )
  21. for length > 1 {
  22. sum += uint32(data[index])<<8 + uint32(data[index+1])
  23. index += 2
  24. length -= 2
  25. }
  26. if length > 0 {
  27. sum += uint32(data[index])
  28. }
  29. sum += (sum >> 16)
  30. return uint16(^sum)
  31. }
  32. func main() {
  33. var (
  34. icmp  ICMP
  35. laddr net.IPAddr = net.IPAddr{IP: net.ParseIP("192.168.137.111")}  //***IP地址改成你自己的网段***
  36. raddr net.IPAddr = net.IPAddr{IP: net.ParseIP("192.168.137.1")}
  37. )
  38. //如果你要使用网络层的其他协议还可以设置成 ip:ospf、ip:arp 等
  39. conn, err := net.DialIP("ip4:icmp", &laddr, &raddr)
  40. if err != nil {
  41. fmt.Println(err.Error())
  42. return
  43. }
  44. defer conn.Close()
  45. //开始填充数据包
  46. icmp.Type = 8 //8->echo message  0->reply message
  47. icmp.Code = 0
  48. icmp.Checksum = 0
  49. icmp.Identifier = 0
  50. icmp.SequenceNum = 0
  51. var (
  52. buffer bytes.Buffer
  53. )
  54. //先在buffer中写入icmp数据报求去校验和
  55. binary.Write(&buffer, binary.BigEndian, icmp)
  56. icmp.Checksum = CheckSum(buffer.Bytes())
  57. //然后清空buffer并把求完校验和的icmp数据报写入其中准备发送
  58. buffer.Reset()
  59. binary.Write(&buffer, binary.BigEndian, icmp)
  60. if _, err := conn.Write(buffer.Bytes()); err != nil {
  61. fmt.Println(err.Error())
  62. return
  63. }
  64. fmt.Printf("send icmp packet success!")
  65. }

执行后可以用wireshark抓下包看看,可以看到远方网关传来了reply响应:

看看我们构造的ICMP是否正确:

如果转载请注明出处:http://blog.csdn.NET/gophers/article/details/21481447

时间: 2024-08-08 22:03:48

用Golang自己构造ICMP数据包的相关文章

libcap-捕获icmp数据包

geticmp1的功能是,捕获icmp数据包,并打印出数据包的内容,不过是直接打印的,不够人性化.geticmp2就更优化一些,把数据包的内容按照icmp,ip的格式打印出来,可以看到报文的内容. 编译方法:gcc -o geticmp? geticmp?.c -lpcap 源代码: geticmp1.c #include <pcap.h> #include <time.h> #include <stdlib.h> #include <stdio.h> #d

多线程发送icmp数据包(Python版)

做icmp攻击时,先用Python写了发送数据包的函数. 发送数据包用的是scapy模块,需要先安装:apt-get install python-scapy ''' date:2014/12/3 author:yss function:send packets from host to server with multithreading ''' import threading from time import sleep,ctime from scapy.all import * num=

ETHERNET数据包格式( IP &amp; UDP &amp; ICMP &amp; ARP )

ETHERNET数据包格式( IP & UDP & ICMP & ARP ) ETHERNET数据包格式 一.ETHERNET 数据包的协议类型 TYPE 的值为 0x0800:IP协议,即:ETHERTYPE_IP,    该值在 /usr/include/net/ethernet.h中有定义.ETHERNET 数据包的格式又细分    为如下几种情况: (1) IP 报头中的协议号码为 IPPROTO_TCP,其值为 6 .ETHERNET 数据包的格式如下: |<---

利用Wireshark截取数据包,并对数据包进行解析

利用Wireshark截取ICMP数据包,并对数据包进行解析 wireshark安装文件下载地址:http://yunpan.cn/QiHGK5sPtWRyN (提取码:0bbc) 安装步骤: 解压文件之后,在\wireshark-win32-1.4.9中文版\文件夹中找到安装文件,双击即可安装. 安装完成之后,双击wireshark图标即可启动,界面如下: 抓包步骤: 1.点击开始按钮列出可以抓包的接口: 2.点击选项可以配置抓包参数: 3.配置完成点击开始,即可开始抓包: 4.点击停止完成抓

TCP/IP协议数据包文件PCAP分析器

一.设计原理 1.PCAP文件构成 参考http://blog.csdn.net/gulu_gulu_jp/article/details/50494909 PCAP文件由一个PCAP文件头和多个PCAP数据包组成,PCAP数据又由数据包头和数据包内容组成.数据包内容才是我们将要进行分析还原的TCP/IP协议数据.PCAP总体结构如图 11所示: 图 11 PCAP文件总体结构 以TCP协议为例,详细解析PCAP文件格式.PCAP前24个字节为文件头,包含了文件信息,其结构如图 11所示.接着1

Windows下底层数据包发送实战

1.简介 所谓“底层数据包”指的是在“运行”于数据链路层的数据包,简单的说就是“以太网帧”,而我们常用的Socket只能发送“运行”在传输层的TCP.UDP等包,这些传输层数据包已经能满足绝大部分需求,但是有些时候还是需要发送底层数据包的(例如SYN扫描),那么如何发送呢? 本文记录了我试图实现的过程中遇到的一些问题以及解决办法,需要注明:①本文只考虑Windows上的实现  ②本文主要目的是实现发送部分  ③本文假定读者理解网络分层结构和一些基本的网络编程方法  ④本文只是在讨论常规技术,切勿

交互式数据包处理程序 Scapy 入门指南

概述 Scapy 是一个强大的交互式数据包处理程序(使用python编写).它能够伪造或者解码大量的网络协议数据包,能够发送.捕捉.匹配请求和回复包等等.它可以很容易地处理一些典型操作,比如端口扫描,tracerouting,探测,单元测试,攻击或网络发现(可替代hping,NMAP,arpspoof,ARP-SK,arping,tcpdump,tethereal,P0F等).最重要的他还有很多更优秀的特性--发送无效数据帧.注入修改的802.11数据帧.在WEP上解码加密通道(VOIP).AR

scapy构造打印ARP数据包

ARP格式: 用于以太网的ARP请求/应答分组格式 各字段含义: 帧类型:表示数据部分用什么协议封装(0800表示IP,0806表示ARP,8035表示RARP). 硬件类型:表示硬件地址的类型(其中,值为1表示以太网地址,其他还可能表示令牌环地址). 硬件地址长度:指出该报文中硬件地址的长度(ARP报文中,它的值为6). 协议地址长度:指出该报文中协议地址的长度(ARP报文中,它的值为4). op:操作字段,共有4种类型(1:ARP请求,2:ARP应答,3:RARP请求,4:RARP应答).

构造数据包进行批量用户注册

长知识: 现大部分服务端.客户端都默认是将数据进行UTF-8编码,但是当客户端向服务端发送的数据包中含有中文时,一定在headers中说明charset,否则服务器端知道要用什么编码方式解码.而英文.数字等一般服务器端默认用UTF-8解码. #coding:UTF-8 import urllib2 import urllib import cookielib import json import sys import shutil import xlrd import chardet impor