diff --git a/client/direct.go b/client/direct.go index 5abe56c..40e0696 100644 --- a/client/direct.go +++ b/client/direct.go @@ -36,8 +36,8 @@ func DirectInit(ctx context.Context, cancel context.CancelFunc, socket net.Conn, connOpts.ConnectionProto = mtproto.ConnectionProtocolAny connOpts.ClientAddr = conn.RemoteAddr() - conn = wrappers.NewCtx(ctx, cancel, conn) conn = wrappers.NewStreamCipher(conn, obfs2.Encryptor, obfs2.Decryptor) + conn = wrappers.NewCtx(ctx, cancel, conn) return conn, connOpts, nil } diff --git a/main.go b/main.go index 5cc71be..a023f76 100644 --- a/main.go +++ b/main.go @@ -117,8 +117,10 @@ func main() { var server *proxy.Proxy if len(conf.AdTag) == 0 { + zap.S().Infow("Use direct connection to Telegram") server = proxy.NewProxyDirect(conf) } else { + zap.S().Infow("Use middle proxy connection to Telegram") server = proxy.NewProxyMiddle(conf) } diff --git a/obfuscated2/frame.go b/obfuscated2/frame.go index edcb8b4..6c6f6ab 100644 --- a/obfuscated2/frame.go +++ b/obfuscated2/frame.go @@ -9,7 +9,6 @@ import ( "github.com/juju/errors" "github.com/9seconds/mtg/mtproto" - "github.com/9seconds/mtg/utils" ) // [frameOffsetFirst:frameOffsetKey:frameOffsetIV:frameOffsetMagic:frameOffsetDC:frameOffsetEnd] @@ -68,7 +67,14 @@ func (f Frame) ConnectionType() (mtproto.ConnectionType, error) { // Invert inverts frame for extracting encryption keys. Pkease check that link: // https://blog.susanka.eu/how-telegram-obfuscates-its-mtproto-traffic/ func (f Frame) Invert() Frame { - return Frame(utils.ReverseBytes([]byte(f))) + reversed := make(Frame, FrameLen) + copy(reversed, f) + + for i := 0; i < frameLenKey+frameLenIV; i++ { + reversed[frameOffsetFirst+i] = f[frameOffsetIV-1-i] + } + + return reversed } // ExtractFrame extracts exact obfuscated2 handshake frame from given reader. diff --git a/proxy/direct.go b/proxy/direct.go index 56b6ce2..663f93b 100644 --- a/proxy/direct.go +++ b/proxy/direct.go @@ -21,25 +21,23 @@ func NewProxyDirect(conf *config.Config) *Proxy { return &Proxy{ conf: conf, acceptCallback: func(ctx context.Context, cancel context.CancelFunc, clientSocket net.Conn, - connID string, wait *sync.WaitGroup, conf *config.Config) error { + connID string, wait *sync.WaitGroup, conf *config.Config) (io.Closer, io.Closer, error) { client, opts, err := client.DirectInit(ctx, cancel, clientSocket, connID, conf) if err != nil { - return errors.Annotate(err, "Cannot initialize client connection") + return nil, nil, errors.Annotate(err, "Cannot initialize client connection") } - defer client.Close() server, err := directTelegramStream(ctx, cancel, opts, connID, tg) if err != nil { - return errors.Annotate(err, "Cannot initialize telegram connection") + return client, nil, errors.Annotate(err, "Cannot initialize telegram connection") } - defer server.Close() wait.Add(2) go directPipe(client, server, wait) go directPipe(server, client, wait) - return nil + return client, server, nil }, } } diff --git a/proxy/middle.go b/proxy/middle.go index 4987a13..6ab300b 100644 --- a/proxy/middle.go +++ b/proxy/middle.go @@ -2,6 +2,7 @@ package proxy import ( "context" + "io" "net" "sync" @@ -20,25 +21,23 @@ func NewProxyMiddle(conf *config.Config) *Proxy { return &Proxy{ conf: conf, acceptCallback: func(ctx context.Context, cancel context.CancelFunc, clientSocket net.Conn, - connID string, wait *sync.WaitGroup, conf *config.Config) error { + connID string, wait *sync.WaitGroup, conf *config.Config) (io.Closer, io.Closer, error) { client, opts, err := client.MiddleInit(ctx, cancel, clientSocket, connID, conf) if err != nil { - return errors.Annotate(err, "Cannot initialize client connection") + return nil, nil, errors.Annotate(err, "Cannot initialize client connection") } - defer client.Close() server, err := middleTelegramStream(ctx, cancel, opts, connID, tg) if err != nil { - return errors.Annotate(err, "Cannot initialize telegram connection") + return client, nil, errors.Annotate(err, "Cannot initialize telegram connection") } - defer server.Close() wait.Add(2) go middlePipe(client, server, wait, &opts.ReadHacks) go middlePipe(server, client, wait, &opts.WriteHacks) - return nil + return client, server, nil }, } } diff --git a/proxy/proxy.go b/proxy/proxy.go index d1baf93..0debedd 100644 --- a/proxy/proxy.go +++ b/proxy/proxy.go @@ -2,6 +2,7 @@ package proxy import ( "context" + "io" "net" "sync" @@ -12,7 +13,7 @@ import ( "github.com/9seconds/mtg/config" ) -type proxyAcceptCallback func(context.Context, context.CancelFunc, net.Conn, string, *sync.WaitGroup, *config.Config) error +type proxyAcceptCallback func(context.Context, context.CancelFunc, net.Conn, string, *sync.WaitGroup, *config.Config) (io.Closer, io.Closer, error) type Proxy struct { conf *config.Config @@ -51,7 +52,16 @@ func (p *Proxy) accept(conn net.Conn) { ctx, cancel := context.WithCancel(context.Background()) wait := &sync.WaitGroup{} - if err := p.acceptCallback(ctx, cancel, conn, connID, wait, p.conf); err != nil { + client, server, err := p.acceptCallback(ctx, cancel, conn, connID, wait, p.conf) + defer func() { + if client != nil { + client.Close() + } + if server != nil { + server.Close() + } + }() + if err != nil { log.Errorw("Cannot initialize connection", "error", err) cancel() }