imgk/divert-go

CalcChecksums function crashes

Closed this issue · 6 comments

dosgo commented

image

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

The divert_cgo test was successful! divert_embedded compilation failed!
image

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.