Selaa lähdekoodia

Integrate obfuscation package

tags/v2.1.11^2^2
9seconds 2 kuukautta sitten
vanhempi
commit
140e9dfc2e
2 muutettua tiedostoa jossa 36 lisäystä ja 29 poistoa
  1. 10
    3
      mtglib/internal/dc/addr.go
  2. 26
    26
      mtglib/proxy.go

+ 10
- 3
mtglib/internal/dc/addr.go Näytä tiedosto

@@ -1,10 +1,17 @@
1 1
 package dc
2 2
 
3
+import (
4
+	"fmt"
5
+
6
+	"github.com/9seconds/mtg/v2/mtglib/internal/obfuscation"
7
+)
8
+
3 9
 type Addr struct {
4
-	Network string
5
-	Address string
10
+	Network    string
11
+	Address    string
12
+	Obfuscator obfuscation.Obfuscator
6 13
 }
7 14
 
8 15
 func (d Addr) String() string {
9
-	return d.Address
16
+	return fmt.Sprintf("addr=%s, secret=%v", d.Address, d.Obfuscator.Secret)
10 17
 }

+ 26
- 26
mtglib/proxy.go Näytä tiedosto

@@ -13,7 +13,7 @@ import (
13 13
 	"github.com/9seconds/mtg/v2/mtglib/internal/dc"
14 14
 	"github.com/9seconds/mtg/v2/mtglib/internal/faketls"
15 15
 	"github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
16
-	"github.com/9seconds/mtg/v2/mtglib/internal/obfuscated2"
16
+	"github.com/9seconds/mtg/v2/mtglib/internal/obfuscation"
17 17
 	"github.com/9seconds/mtg/v2/mtglib/internal/relay"
18 18
 	"github.com/panjf2000/ants/v2"
19 19
 )
@@ -29,6 +29,7 @@ type Proxy struct {
29 29
 	domainFrontingPort       int
30 30
 	workerPool               *ants.PoolWithFunc
31 31
 	telegram                 *dc.Telegram
32
+	clientObfuscatror        obfuscation.Obfuscator
32 33
 
33 34
 	secret          Secret
34 35
 	network         Network
@@ -70,8 +71,8 @@ func (p *Proxy) ServeConn(conn essentials.Conn) {
70 71
 		return
71 72
 	}
72 73
 
73
-	if err := p.doObfuscated2Handshake(ctx); err != nil {
74
-		p.logger.InfoError("obfuscated2 handshake is failed", err)
74
+	if err := p.doObfuscatedHandshake(ctx); err != nil {
75
+		p.logger.InfoError("obfuscated handshake is failed", err)
75 76
 
76 77
 		return
77 78
 	}
@@ -201,19 +202,15 @@ func (p *Proxy) doFakeTLSHandshake(ctx *streamContext) bool {
201 202
 	return true
202 203
 }
203 204
 
204
-func (p *Proxy) doObfuscated2Handshake(ctx *streamContext) error {
205
-	dc, encryptor, decryptor, err := obfuscated2.ClientHandshake(p.secret.Key[:], ctx.clientConn)
205
+func (p *Proxy) doObfuscatedHandshake(ctx *streamContext) error {
206
+	dc, conn, err := p.clientObfuscatror.ReadHandshake(ctx.clientConn)
206 207
 	if err != nil {
207 208
 		return fmt.Errorf("cannot process client handshake: %w", err)
208 209
 	}
209 210
 
210 211
 	ctx.dc = dc
212
+	ctx.clientConn = conn
211 213
 	ctx.logger = ctx.logger.BindInt("dc", dc)
212
-	ctx.clientConn = obfuscated2.Conn{
213
-		Conn:      ctx.clientConn,
214
-		Encryptor: encryptor,
215
-		Decryptor: decryptor,
216
-	}
217 214
 
218 215
 	return nil
219 216
 }
@@ -223,17 +220,22 @@ func (p *Proxy) doTelegramCall(ctx *streamContext) error {
223 220
 
224 221
 	addresses := p.telegram.GetAddresses(dcid)
225 222
 	if len(addresses) == 0 && p.allowFallbackOnUnknownDC {
226
-		ctx.logger = ctx.logger.BindInt("fallback_dc", dc.DefaultDC)
223
+		ctx.logger = ctx.logger.BindInt("original_dc", dcid)
227 224
 		ctx.logger.Warning("unknown DC, fallbacks")
225
+		ctx.dc = dc.DefaultDC
228 226
 		addresses = p.telegram.GetAddresses(dc.DefaultDC)
229 227
 	}
230 228
 
231
-	var conn essentials.Conn
232
-	var err error
229
+	var (
230
+		conn      essentials.Conn
231
+		err       error
232
+		foundAddr dc.Addr
233
+	)
233 234
 
234 235
 	for _, addr := range addresses {
235 236
 		conn, err = p.network.Dial(addr.Network, addr.Address)
236 237
 		if err == nil {
238
+			foundAddr = addr
237 239
 			break
238 240
 		}
239 241
 	}
@@ -241,22 +243,17 @@ func (p *Proxy) doTelegramCall(ctx *streamContext) error {
241 243
 		return fmt.Errorf("no addresses to call: %w", err)
242 244
 	}
243 245
 
244
-	encryptor, decryptor, err := obfuscated2.ServerHandshake(conn)
246
+	conn, err = foundAddr.Obfuscator.SendHandshake(conn, ctx.dc)
245 247
 	if err != nil {
246
-		conn.Close() //nolint: errcheck
247
-
248
-		return fmt.Errorf("cannot perform obfuscated2 handshake: %w", err)
248
+		conn.Close()
249
+		return fmt.Errorf("cannot perform server handshake: %w", err)
249 250
 	}
250 251
 
251
-	ctx.telegramConn = obfuscated2.Conn{
252
-		Conn: connTraffic{
253
-			Conn:     conn,
254
-			streamID: ctx.streamID,
255
-			stream:   p.eventStream,
256
-			ctx:      ctx,
257
-		},
258
-		Encryptor: encryptor,
259
-		Decryptor: decryptor,
252
+	ctx.telegramConn = connTraffic{
253
+		Conn:     conn,
254
+		streamID: ctx.streamID,
255
+		stream:   p.eventStream,
256
+		ctx:      ctx,
260 257
 	}
261 258
 
262 259
 	p.eventStream.Send(ctx,
@@ -320,6 +317,9 @@ func NewProxy(opts ProxyOpts) (*Proxy, error) {
320 317
 		tolerateTimeSkewness:     opts.getTolerateTimeSkewness(),
321 318
 		allowFallbackOnUnknownDC: opts.AllowFallbackOnUnknownDC,
322 319
 		telegram:                 tg,
320
+		clientObfuscatror: obfuscation.Obfuscator{
321
+			Secret: opts.Secret.Key[:],
322
+		},
323 323
 	}
324 324
 
325 325
 	pool, err := ants.NewPoolWithFunc(opts.getConcurrency(),

Loading…
Peruuta
Tallenna