()
| 29 | ) |
| 30 | |
| 31 | func cappacp() { |
| 32 | //var flagHEX bool |
| 33 | IPADDR := flag.String("a", "127.0.0.1", "NIC IP Addr") |
| 34 | filenmae := flag.String("f", "./cap.pcap", "pcap file save path") |
| 35 | flagHEX := flag.Bool("x", false, "only print hex dump") |
| 36 | |
| 37 | flag.Parse() |
| 38 | |
| 39 | fmt.Printf("Start packet capture! NIC addr: %s pcap save path: %s\n", *IPADDR, *filenmae) |
| 40 | |
| 41 | fd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_RAW, syscall.IPPROTO_IP) //创建一个 RAW SOCKET |
| 42 | if err != nil { |
| 43 | fmt.Println("Socket ERROR", err) |
| 44 | return |
| 45 | } |
| 46 | defer syscall.Close(fd) |
| 47 | ip := net.ParseIP(*IPADDR) |
| 48 | |
| 49 | var ipv4 [4]byte |
| 50 | copy(ipv4[:], ip.To4()) |
| 51 | addr := syscall.SockaddrInet4{ |
| 52 | Port: 0, |
| 53 | Addr: ipv4, |
| 54 | } |
| 55 | |
| 56 | err = syscall.Bind(fd, &addr) |
| 57 | if err != nil { |
| 58 | fmt.Println(err) |
| 59 | return |
| 60 | } |
| 61 | |
| 62 | flags := uint32(RCVALL_IPLEVEL) |
| 63 | size := uint32(unsafe.Sizeof(flags)) |
| 64 | unused := uint32(0) |
| 65 | err = syscall.WSAIoctl(fd, SIO_RCVALL, (*byte)(unsafe.Pointer(&flags)), size, nil, 0, &unused, nil, 0) //设置 SIO_RCVALL |
| 66 | if err != nil { |
| 67 | fmt.Println("WSAIoctl ERROR", err) |
| 68 | return |
| 69 | } |
| 70 | if _, err := os.Stat(*filenmae); !os.IsNotExist(err) { |
| 71 | if err := os.Remove(*filenmae); err != nil { |
| 72 | fmt.Println(err) |
| 73 | } |
| 74 | } |
| 75 | f, err := os.OpenFile(*filenmae, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0666) |
| 76 | if err != nil { |
| 77 | fmt.Println(err) |
| 78 | return |
| 79 | } |
| 80 | w := pcapgo.NewWriter(f) |
| 81 | err = w.WriteFileHeader(1024, layers.LinkTypeEthernet) |
| 82 | if err != nil { |
| 83 | fmt.Println(err) |
| 84 | return |
| 85 | } |
| 86 | defer f.Close() |
| 87 | buf := make([]byte, 65536) |
| 88 | for { |
nothing calls this directly
no outgoing calls
no test coverage detected