mirror of
https://github.com/ScuroNeko/mtg.git
synced 2026-08-31 17:14:02 +03:00
Integrate obfuscation package
This commit is contained in:
@@ -1,10 +1,17 @@
|
|||||||
package dc
|
package dc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/9seconds/mtg/v2/mtglib/internal/obfuscation"
|
||||||
|
)
|
||||||
|
|
||||||
type Addr struct {
|
type Addr struct {
|
||||||
Network string
|
Network string
|
||||||
Address string
|
Address string
|
||||||
|
Obfuscator obfuscation.Obfuscator
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d Addr) String() string {
|
func (d Addr) String() string {
|
||||||
return d.Address
|
return fmt.Sprintf("addr=%s, secret=%v", d.Address, d.Obfuscator.Secret)
|
||||||
}
|
}
|
||||||
|
|||||||
+26
-26
@@ -13,7 +13,7 @@ import (
|
|||||||
"github.com/9seconds/mtg/v2/mtglib/internal/dc"
|
"github.com/9seconds/mtg/v2/mtglib/internal/dc"
|
||||||
"github.com/9seconds/mtg/v2/mtglib/internal/faketls"
|
"github.com/9seconds/mtg/v2/mtglib/internal/faketls"
|
||||||
"github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
|
"github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
|
||||||
"github.com/9seconds/mtg/v2/mtglib/internal/obfuscated2"
|
"github.com/9seconds/mtg/v2/mtglib/internal/obfuscation"
|
||||||
"github.com/9seconds/mtg/v2/mtglib/internal/relay"
|
"github.com/9seconds/mtg/v2/mtglib/internal/relay"
|
||||||
"github.com/panjf2000/ants/v2"
|
"github.com/panjf2000/ants/v2"
|
||||||
)
|
)
|
||||||
@@ -29,6 +29,7 @@ type Proxy struct {
|
|||||||
domainFrontingPort int
|
domainFrontingPort int
|
||||||
workerPool *ants.PoolWithFunc
|
workerPool *ants.PoolWithFunc
|
||||||
telegram *dc.Telegram
|
telegram *dc.Telegram
|
||||||
|
clientObfuscatror obfuscation.Obfuscator
|
||||||
|
|
||||||
secret Secret
|
secret Secret
|
||||||
network Network
|
network Network
|
||||||
@@ -70,8 +71,8 @@ func (p *Proxy) ServeConn(conn essentials.Conn) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := p.doObfuscated2Handshake(ctx); err != nil {
|
if err := p.doObfuscatedHandshake(ctx); err != nil {
|
||||||
p.logger.InfoError("obfuscated2 handshake is failed", err)
|
p.logger.InfoError("obfuscated handshake is failed", err)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -201,19 +202,15 @@ func (p *Proxy) doFakeTLSHandshake(ctx *streamContext) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Proxy) doObfuscated2Handshake(ctx *streamContext) error {
|
func (p *Proxy) doObfuscatedHandshake(ctx *streamContext) error {
|
||||||
dc, encryptor, decryptor, err := obfuscated2.ClientHandshake(p.secret.Key[:], ctx.clientConn)
|
dc, conn, err := p.clientObfuscatror.ReadHandshake(ctx.clientConn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot process client handshake: %w", err)
|
return fmt.Errorf("cannot process client handshake: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.dc = dc
|
ctx.dc = dc
|
||||||
|
ctx.clientConn = conn
|
||||||
ctx.logger = ctx.logger.BindInt("dc", dc)
|
ctx.logger = ctx.logger.BindInt("dc", dc)
|
||||||
ctx.clientConn = obfuscated2.Conn{
|
|
||||||
Conn: ctx.clientConn,
|
|
||||||
Encryptor: encryptor,
|
|
||||||
Decryptor: decryptor,
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -223,17 +220,22 @@ func (p *Proxy) doTelegramCall(ctx *streamContext) error {
|
|||||||
|
|
||||||
addresses := p.telegram.GetAddresses(dcid)
|
addresses := p.telegram.GetAddresses(dcid)
|
||||||
if len(addresses) == 0 && p.allowFallbackOnUnknownDC {
|
if len(addresses) == 0 && p.allowFallbackOnUnknownDC {
|
||||||
ctx.logger = ctx.logger.BindInt("fallback_dc", dc.DefaultDC)
|
ctx.logger = ctx.logger.BindInt("original_dc", dcid)
|
||||||
ctx.logger.Warning("unknown DC, fallbacks")
|
ctx.logger.Warning("unknown DC, fallbacks")
|
||||||
|
ctx.dc = dc.DefaultDC
|
||||||
addresses = p.telegram.GetAddresses(dc.DefaultDC)
|
addresses = p.telegram.GetAddresses(dc.DefaultDC)
|
||||||
}
|
}
|
||||||
|
|
||||||
var conn essentials.Conn
|
var (
|
||||||
var err error
|
conn essentials.Conn
|
||||||
|
err error
|
||||||
|
foundAddr dc.Addr
|
||||||
|
)
|
||||||
|
|
||||||
for _, addr := range addresses {
|
for _, addr := range addresses {
|
||||||
conn, err = p.network.Dial(addr.Network, addr.Address)
|
conn, err = p.network.Dial(addr.Network, addr.Address)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
foundAddr = addr
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -241,22 +243,17 @@ func (p *Proxy) doTelegramCall(ctx *streamContext) error {
|
|||||||
return fmt.Errorf("no addresses to call: %w", err)
|
return fmt.Errorf("no addresses to call: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
encryptor, decryptor, err := obfuscated2.ServerHandshake(conn)
|
conn, err = foundAddr.Obfuscator.SendHandshake(conn, ctx.dc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
conn.Close() //nolint: errcheck
|
conn.Close()
|
||||||
|
return fmt.Errorf("cannot perform server handshake: %w", err)
|
||||||
return fmt.Errorf("cannot perform obfuscated2 handshake: %w", err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.telegramConn = obfuscated2.Conn{
|
ctx.telegramConn = connTraffic{
|
||||||
Conn: connTraffic{
|
Conn: conn,
|
||||||
Conn: conn,
|
streamID: ctx.streamID,
|
||||||
streamID: ctx.streamID,
|
stream: p.eventStream,
|
||||||
stream: p.eventStream,
|
ctx: ctx,
|
||||||
ctx: ctx,
|
|
||||||
},
|
|
||||||
Encryptor: encryptor,
|
|
||||||
Decryptor: decryptor,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
p.eventStream.Send(ctx,
|
p.eventStream.Send(ctx,
|
||||||
@@ -320,6 +317,9 @@ func NewProxy(opts ProxyOpts) (*Proxy, error) {
|
|||||||
tolerateTimeSkewness: opts.getTolerateTimeSkewness(),
|
tolerateTimeSkewness: opts.getTolerateTimeSkewness(),
|
||||||
allowFallbackOnUnknownDC: opts.AllowFallbackOnUnknownDC,
|
allowFallbackOnUnknownDC: opts.AllowFallbackOnUnknownDC,
|
||||||
telegram: tg,
|
telegram: tg,
|
||||||
|
clientObfuscatror: obfuscation.Obfuscator{
|
||||||
|
Secret: opts.Secret.Key[:],
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
pool, err := ants.NewPoolWithFunc(opts.getConcurrency(),
|
pool, err := ants.NewPoolWithFunc(opts.getConcurrency(),
|
||||||
|
|||||||
Reference in New Issue
Block a user