From f22705be2c7189635ad1606f966296b587e25261 Mon Sep 17 00:00:00 2001 From: Brian Ma <312.dumas@163.com> Date: Thu, 1 Sep 2022 17:46:19 +0800 Subject: [PATCH 1/2] Fix wechat protocol is not working if no obfs string is configured --- pkg/conns/wechat/obfs.go | 7 +++++-- pkg/obfs/dummy.go | 21 +++++++++++++++++++++ pkg/transport/client.go | 8 ++------ pkg/transport/server.go | 8 ++------ 4 files changed, 30 insertions(+), 14 deletions(-) create mode 100644 pkg/obfs/dummy.go diff --git a/pkg/conns/wechat/obfs.go b/pkg/conns/wechat/obfs.go index 99aa4a8..d601cd1 100644 --- a/pkg/conns/wechat/obfs.go +++ b/pkg/conns/wechat/obfs.go @@ -25,10 +25,13 @@ type ObfsWeChatUDPConn struct { sn uint32 } -func NewObfsWeChatUDPConn(orig *net.UDPConn, obfs obfs.Obfuscator) *ObfsWeChatUDPConn { +func NewObfsWeChatUDPConn(orig *net.UDPConn, obfs_ obfs.Obfuscator) *ObfsWeChatUDPConn { + if obfs_ == nil { + obfs_ = obfs.NewDummyObfuscator() + } return &ObfsWeChatUDPConn{ orig: orig, - obfs: obfs, + obfs: obfs_, readBuf: make([]byte, udpBufferSize), writeBuf: make([]byte, udpBufferSize), sn: rand.Uint32() & 0xFFFF, diff --git a/pkg/obfs/dummy.go b/pkg/obfs/dummy.go new file mode 100644 index 0000000..6899f3a --- /dev/null +++ b/pkg/obfs/dummy.go @@ -0,0 +1,21 @@ +package obfs + +type DummyObfuscator struct{} + +func NewDummyObfuscator() *DummyObfuscator { + return &DummyObfuscator{} +} + +func (x *DummyObfuscator) Deobfuscate(in []byte, out []byte) int { + pLen := len(in) + if pLen <= 0 || len(out) < pLen { + // Invalid + return 0 + } + copy(out, in) + return pLen +} + +func (x *DummyObfuscator) Obfuscate(in []byte, out []byte) int { + return copy(out, in) +} diff --git a/pkg/transport/client.go b/pkg/transport/client.go index 6746ab9..4c03614 100644 --- a/pkg/transport/client.go +++ b/pkg/transport/client.go @@ -42,12 +42,8 @@ func (ct *ClientTransport) quicPacketConn(proto string, server string, obfs obfs if err != nil { return nil, err } - if obfs != nil { - oc := wechat.NewObfsWeChatUDPConn(conn, obfs) - return oc, nil - } else { - return conn, nil - } + oc := wechat.NewObfsWeChatUDPConn(conn, obfs) + return oc, nil } else if proto == "faketcp" { var conn *faketcp.TCPConn conn, err := faketcp.Dial("tcp", server) diff --git a/pkg/transport/server.go b/pkg/transport/server.go index 6c297ef..5685e81 100644 --- a/pkg/transport/server.go +++ b/pkg/transport/server.go @@ -101,12 +101,8 @@ func (st *ServerTransport) quicPacketConn(proto string, laddr string, obfs obfs. if err != nil { return nil, err } - if obfs != nil { - oc := wechat.NewObfsWeChatUDPConn(conn, obfs) - return oc, nil - } else { - return conn, nil - } + oc := wechat.NewObfsWeChatUDPConn(conn, obfs) + return oc, nil } else if proto == "faketcp" { conn, err := faketcp.Listen("tcp", laddr) if err != nil { From f476ad3f678af8b0ddd9cd8c1d692bf1964c0860 Mon Sep 17 00:00:00 2001 From: Toby Date: Fri, 9 Sep 2022 18:10:02 -0700 Subject: [PATCH 2/2] minor code changes --- pkg/conns/wechat/obfs.go | 7 ++----- pkg/obfs/dummy.go | 7 ++----- pkg/transport/client.go | 12 +++++++----- pkg/transport/server.go | 12 +++++++----- 4 files changed, 18 insertions(+), 20 deletions(-) diff --git a/pkg/conns/wechat/obfs.go b/pkg/conns/wechat/obfs.go index d601cd1..99aa4a8 100644 --- a/pkg/conns/wechat/obfs.go +++ b/pkg/conns/wechat/obfs.go @@ -25,13 +25,10 @@ type ObfsWeChatUDPConn struct { sn uint32 } -func NewObfsWeChatUDPConn(orig *net.UDPConn, obfs_ obfs.Obfuscator) *ObfsWeChatUDPConn { - if obfs_ == nil { - obfs_ = obfs.NewDummyObfuscator() - } +func NewObfsWeChatUDPConn(orig *net.UDPConn, obfs obfs.Obfuscator) *ObfsWeChatUDPConn { return &ObfsWeChatUDPConn{ orig: orig, - obfs: obfs_, + obfs: obfs, readBuf: make([]byte, udpBufferSize), writeBuf: make([]byte, udpBufferSize), sn: rand.Uint32() & 0xFFFF, diff --git a/pkg/obfs/dummy.go b/pkg/obfs/dummy.go index 6899f3a..3edff10 100644 --- a/pkg/obfs/dummy.go +++ b/pkg/obfs/dummy.go @@ -7,13 +7,10 @@ func NewDummyObfuscator() *DummyObfuscator { } func (x *DummyObfuscator) Deobfuscate(in []byte, out []byte) int { - pLen := len(in) - if pLen <= 0 || len(out) < pLen { - // Invalid + if len(out) < len(in) { return 0 } - copy(out, in) - return pLen + return copy(out, in) } func (x *DummyObfuscator) Obfuscate(in []byte, out []byte) int { diff --git a/pkg/transport/client.go b/pkg/transport/client.go index 4c03614..bfd0340 100644 --- a/pkg/transport/client.go +++ b/pkg/transport/client.go @@ -9,7 +9,7 @@ import ( "github.com/HyNetwork/hysteria/pkg/conns/faketcp" "github.com/HyNetwork/hysteria/pkg/conns/udp" "github.com/HyNetwork/hysteria/pkg/conns/wechat" - "github.com/HyNetwork/hysteria/pkg/obfs" + obfsPkg "github.com/HyNetwork/hysteria/pkg/obfs" "github.com/lucas-clemente/quic-go" ) @@ -25,7 +25,7 @@ var DefaultClientTransport = &ClientTransport{ ResolvePreference: ResolvePreferenceDefault, } -func (ct *ClientTransport) quicPacketConn(proto string, server string, obfs obfs.Obfuscator) (net.PacketConn, error) { +func (ct *ClientTransport) quicPacketConn(proto string, server string, obfs obfsPkg.Obfuscator) (net.PacketConn, error) { if len(proto) == 0 || proto == "udp" { conn, err := net.ListenUDP("udp", nil) if err != nil { @@ -42,8 +42,10 @@ func (ct *ClientTransport) quicPacketConn(proto string, server string, obfs obfs if err != nil { return nil, err } - oc := wechat.NewObfsWeChatUDPConn(conn, obfs) - return oc, nil + if obfs == nil { + obfs = obfsPkg.NewDummyObfuscator() + } + return wechat.NewObfsWeChatUDPConn(conn, obfs), nil } else if proto == "faketcp" { var conn *faketcp.TCPConn conn, err := faketcp.Dial("tcp", server) @@ -61,7 +63,7 @@ func (ct *ClientTransport) quicPacketConn(proto string, server string, obfs obfs } } -func (ct *ClientTransport) QUICDial(proto string, server string, tlsConfig *tls.Config, quicConfig *quic.Config, obfs obfs.Obfuscator) (quic.Connection, error) { +func (ct *ClientTransport) QUICDial(proto string, server string, tlsConfig *tls.Config, quicConfig *quic.Config, obfs obfsPkg.Obfuscator) (quic.Connection, error) { serverUDPAddr, err := net.ResolveUDPAddr("udp", server) if err != nil { return nil, err diff --git a/pkg/transport/server.go b/pkg/transport/server.go index 5685e81..24b3ffa 100644 --- a/pkg/transport/server.go +++ b/pkg/transport/server.go @@ -10,7 +10,7 @@ import ( "github.com/HyNetwork/hysteria/pkg/conns/faketcp" "github.com/HyNetwork/hysteria/pkg/conns/udp" "github.com/HyNetwork/hysteria/pkg/conns/wechat" - "github.com/HyNetwork/hysteria/pkg/obfs" + obfsPkg "github.com/HyNetwork/hysteria/pkg/obfs" "github.com/HyNetwork/hysteria/pkg/sockopt" "github.com/HyNetwork/hysteria/pkg/utils" "github.com/lucas-clemente/quic-go" @@ -76,7 +76,7 @@ var DefaultServerTransport = &ServerTransport{ ResolvePreference: ResolvePreferenceDefault, } -func (st *ServerTransport) quicPacketConn(proto string, laddr string, obfs obfs.Obfuscator) (net.PacketConn, error) { +func (st *ServerTransport) quicPacketConn(proto string, laddr string, obfs obfsPkg.Obfuscator) (net.PacketConn, error) { if len(proto) == 0 || proto == "udp" { laddrU, err := net.ResolveUDPAddr("udp", laddr) if err != nil { @@ -101,8 +101,10 @@ func (st *ServerTransport) quicPacketConn(proto string, laddr string, obfs obfs. if err != nil { return nil, err } - oc := wechat.NewObfsWeChatUDPConn(conn, obfs) - return oc, nil + if obfs == nil { + obfs = obfsPkg.NewDummyObfuscator() + } + return wechat.NewObfsWeChatUDPConn(conn, obfs), nil } else if proto == "faketcp" { conn, err := faketcp.Listen("tcp", laddr) if err != nil { @@ -119,7 +121,7 @@ func (st *ServerTransport) quicPacketConn(proto string, laddr string, obfs obfs. } } -func (st *ServerTransport) QUICListen(proto string, listen string, tlsConfig *tls.Config, quicConfig *quic.Config, obfs obfs.Obfuscator) (quic.Listener, error) { +func (st *ServerTransport) QUICListen(proto string, listen string, tlsConfig *tls.Config, quicConfig *quic.Config, obfs obfsPkg.Obfuscator) (quic.Listener, error) { pktConn, err := st.quicPacketConn(proto, listen, obfs) if err != nil { return nil, err