| 19 | return int((v << 8) | (v >> 8)) |
| 20 | } |
| 21 | func cappacp() { |
| 22 | |
| 23 | flagHEX := flag.Bool("x", false, "only print hex dump") |
| 24 | filenmae := flag.String("f", "./cap.pcap", "pcap file save path") |
| 25 | |
| 26 | flag.Parse() |
| 27 | |
| 28 | // 打开raw socket |
| 29 | fd, err := syscall.Socket(syscall.AF_PACKET, syscall.SOCK_RAW, Htons(syscall.ETH_P_ALL)) |
| 30 | |
| 31 | if err != nil { |
| 32 | fmt.Println(err) |
| 33 | return |
| 34 | } |
| 35 | defer syscall.Close(fd) |
| 36 | buf := make([]byte, 65536) |
| 37 | if _, err := os.Stat(*filenmae); !os.IsNotExist(err) { |
| 38 | if err := os.Remove(*filenmae); err != nil { |
| 39 | fmt.Println(err) |
| 40 | } |
| 41 | } |
| 42 | |
| 43 | f, err := os.OpenFile(*filenmae, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0666) |
| 44 | if err != nil { |
| 45 | fmt.Println(err) |
| 46 | return |
| 47 | } |
| 48 | w := pcapgo.NewWriter(f) |
| 49 | w.WriteFileHeader(1024, layers.LinkTypeEthernet) |
| 50 | defer f.Close() |
| 51 | |
| 52 | for { |
| 53 | n, _, err := syscall.Recvfrom(fd, buf, 0) |
| 54 | if err != nil { |
| 55 | fmt.Println("Recvfrom error", err) |
| 56 | return |
| 57 | } |
| 58 | |
| 59 | if *flagHEX { |
| 60 | fmt.Println(hex.Dump(buf[:n])) |
| 61 | } else { |
| 62 | packet := buf[:n] |
| 63 | var c gopacket.CaptureInfo |
| 64 | c.InterfaceIndex = 0 |
| 65 | c.Length = n |
| 66 | c.CaptureLength = n |
| 67 | c.Timestamp = time.Now() |
| 68 | err = w.WritePacket(c, packet) |
| 69 | if err != nil { |
| 70 | fmt.Println("WritePacket ERROR", err) |
| 71 | } |
| 72 | } |
| 73 | |
| 74 | } |
| 75 | |
| 76 | } |