CalcChecksums function crashes
Closed this issue · 6 comments
dosgo commented
dosgo commented
func main() { var filter = "outbound and !loopback and !impostor and udp.DstPort=53 and udp.SrcPort!=7770" winDivert, err := divert.Open(filter, divert.LayerNetwork, divert.PriorityDefault, divert.FlagDefault) if err != nil { log.Printf(" divert.Open err : %v", err) return } rawbuf := make([]byte, 1500) var bufByte1 []byte = make([]byte, 1500) var tempBuf []byte = make([]byte, 1500) rAddr := &net.UDPAddr{IP: net.ParseIP("114.114.114.114"), Port: 53} dnsConn, _ := net.DialUDP("udp", &net.UDPAddr{Port: 7770}, rAddr) defer dnsConn.Close() addr := divert.Address{} for { bufLen, err := winDivert.Recv(tempBuf, &addr) if err != nil || bufLen == 0 { fmt.Printf("Recv err:%+v\r\n", err) continue } ipv6 := uint(tempBuf[0])>>4 == 6 var ipheadlen int if ipv6 { ipheadlen = 40 } else { ipheadlen = int(tempBuf[0]&0xF) * 4 } udpheadlen := 8 request := tempBuf[ipheadlen+udpheadlen : bufLen] dnsConn.Write(request) n, err := dnsConn.Read(bufByte1) if err == nil { if n == 1500 { fmt.Printf("n:n\r\n") } var response = bufByte1[:n] udpsize := len(response) + 8 var packetsize int if ipv6 { copy(rawbuf, []byte{96, 12, 19, 68, 0, 98, 17, 128}) packetsize = 40 + udpsize binary.BigEndian.PutUint16(rawbuf[4:], uint16(udpsize)) copy(rawbuf[8:], tempBuf[24:40]) copy(rawbuf[24:], tempBuf[8:24]) copy(rawbuf[ipheadlen:], tempBuf[ipheadlen+2:ipheadlen+4]) copy(rawbuf[ipheadlen+2:], tempBuf[ipheadlen:ipheadlen+2]) } else { copy(rawbuf, []byte{69, 0, 1, 32, 141, 152, 64, 0, 64, 17, 150, 46}) packetsize = 20 + udpsize binary.BigEndian.PutUint16(rawbuf[2:], uint16(packetsize)) copy(rawbuf[12:], tempBuf[16:20]) copy(rawbuf[16:], tempBuf[12:16]) copy(rawbuf[20:], tempBuf[ipheadlen+2:ipheadlen+4]) copy(rawbuf[22:], tempBuf[ipheadlen:ipheadlen+2]) ipheadlen = 20 } binary.BigEndian.PutUint16(rawbuf[ipheadlen+4:], uint16(udpsize)) copy(rawbuf[ipheadlen+8:], response) packet := rawbuf[:packetsize] var flag uint64 = 1 divert.CalcChecksums(packet, &addr, flag) _, err = winDivert.Send(packet, &addr) if err != nil { fmt.Printf("Send err:%+v\r\n", err) return } } } }
dosgo commented
Thanks! dll test passed! The checksum can be generated normally!
dosgo commented
imgk commented
use go 1.18
dosgo commented
Ok! That's the beta version, so there shouldn't be any other issues.
dosgo commented
Ok! That's the beta version, so there shouldn't be any other issues.