diff --git a/pkg/udpproxy/session.go b/pkg/udpproxy/session.go index f537205..b802742 100644 --- a/pkg/udpproxy/session.go +++ b/pkg/udpproxy/session.go @@ -29,6 +29,7 @@ func newSession(caddr *net.UDPAddr, raddr *net.UDPAddr, proxyConn *net.UDPConn) proxyConn: proxyConn, caddr: caddr, updateTime: time.Now(), + validator: newValidator(), } go session.listen() diff --git a/pkg/udpproxy/validator.go b/pkg/udpproxy/validator.go index b993edd..7de788e 100644 --- a/pkg/udpproxy/validator.go +++ b/pkg/udpproxy/validator.go @@ -1,14 +1,35 @@ package udpproxy +import "bytes" + type validator struct { + rconRequestHeader []byte + getstatusRequestHeader []byte + getinfoRequestHeader []byte + rconResponseHeader []byte + getstatusResponseHeader []byte + getinfoResponseHeader []byte + badRconIdentifier []byte +} + +func newValidator() validator { + return validator{ + rconRequestHeader: []byte("\xff\xff\xff\xffrcon"), + getstatusRequestHeader: []byte("\xff\xff\xff\xffgetstatus"), + getinfoRequestHeader: []byte("\xff\xff\xff\xffgetinfo"), + rconResponseHeader: []byte("\xff\xff\xff\xffprint\n"), + getstatusResponseHeader: []byte("\xff\xff\xff\xffstatusResponse\n"), + getinfoResponseHeader: []byte("\xff\xff\xff\xffinfoResponse\n"), + badRconIdentifier: []byte("Bad rcon"), + } } func (v *validator) isRconRequestPacket(buf []byte) bool { - return string(buf[:8]) == "\xff\xff\xff\xffrcon" + return bytes.Equal(buf[:len(v.rconRequestHeader)], v.rconRequestHeader) } func (v *validator) isQueryRequestPacket(buf []byte) bool { - return string(buf[:13]) == "\xff\xff\xff\xffgetstatus" || string(buf[:11]) == "\xff\xff\xff\xffgetinfo" + return bytes.Equal(buf[:len(v.getstatusRequestHeader)], v.getstatusRequestHeader) || bytes.Equal(buf[:len(v.getinfoRequestHeader)], v.getinfoRequestHeader) } func (v *validator) isValidRequestPacket(buf []byte) bool { @@ -16,11 +37,11 @@ func (v *validator) isValidRequestPacket(buf []byte) bool { } func (v *validator) isRconResponsePacket(buf []byte) bool { - return string(buf[:9]) == "\xff\xff\xff\xffprint" + return bytes.Equal(buf[:len(v.rconResponseHeader)], v.rconResponseHeader) } func (v *validator) isQueryResponsePacket(buf []byte) bool { - return string(buf[:18]) == "\xff\xff\xff\xffstatusResponse" || string(buf[:16]) == "\xff\xff\xff\xffinfoResponse" + return bytes.Equal(buf[:len(v.getstatusResponseHeader)], v.getstatusResponseHeader) || bytes.Equal(buf[:len(v.getinfoResponseHeader)], v.getinfoResponseHeader) } func (v *validator) isValidResponsePacket(buf []byte) bool { @@ -28,5 +49,5 @@ func (v *validator) isValidResponsePacket(buf []byte) bool { } func (v *validator) isBadRconResponse(buf []byte) bool { - return string(buf[10:18]) == "Bad rcon" + return bytes.Equal(buf[len(v.rconResponseHeader):len(v.rconResponseHeader)+len(v.badRconIdentifier)], v.badRconIdentifier) }