1- from AESEncryptor import AESModeCTR
2- import os
31from hashlib import sha256
4- import numpy
5- import hexdump
2+ from AESEncryptor import AESModeCTR
3+ from config import Config
4+ import random
5+ import asyncio
6+
7+ TG_DC = [
8+ "149.154.175.50" , "149.154.167.51" , "149.154.175.100" ,
9+ "149.154.167.91" , "149.154.171.5"
10+ ]
11+
612
713class MTProxy :
814 class MTProtoPacket :
9- def __init__ (self ):
10- pass
1115
12- def to_client_obfuscated2 (self , raw_data , secret ):
13- obf_enc_key_bytes = bytes (os .urandom (64 ))
14- obf_enc_key = obf_enc_key_bytes [8 :40 ] # 8 - 39 bytes [32]
15- obf_enc_iv = obf_enc_key_bytes [40 :56 ] # 40 - 55 bytes [16]
16- secret = bytes .fromhex (secret )
17- dec_key = sha256 ()
18- dec_key .update (obf_enc_key )
19- dec_key .update (secret )
20- obf_enc_key = dec_key .digest ()
21- encryptor = AESModeCTR (key = obf_enc_key ,
22- iv = obf_enc_iv )
23- enc_data = encryptor .encrypt (raw_data )
24- return enc_data
25-
26- def from_client_deobfuscated2 (self , enc_data , secret ):
16+ async def from_client_to_telegram (self , enc_data , secret ):
2717 obf_dec_key_bytes = bytes (enc_data [0 :64 ])
2818 obf_dec_key = obf_dec_key_bytes [8 :40 ] # 8 - 39 bytes [32]
2919 obf_dec_iv = obf_dec_key_bytes [40 :56 ] # 40 - 55 bytes [16]
@@ -32,27 +22,54 @@ def from_client_deobfuscated2(self, enc_data, secret):
3222 dec_key .update (obf_dec_key )
3323 dec_key .update (secret )
3424 obf_dec_key = dec_key .digest ()
35- encryptor = AESModeCTR (key = obf_dec_key ,
36- iv = obf_dec_iv )
37- raw_data = encryptor .decrypt (enc_data )
38- return raw_data
39-
40- def from_telegram_deobfuscated2 (self , enc_data ):
41- obf_dec_key_bytes = bytes (enc_data [0 :48 ])[::- 1 ] # reversed
42- obf_dec_key = obf_dec_key_bytes [0 :32 ] # 0 - 32 bytes [32]
43- obf_dec_iv = obf_dec_key_bytes [32 :48 ] # 32 - 48 bytes [16]
44- encryptor = AESModeCTR (key = obf_dec_key ,
25+ decryptor = AESModeCTR (key = obf_dec_key ,
26+ iv = obf_dec_iv )
27+
28+ obf_enc_key_bytes = bytes (enc_data [8 :56 ])[::- 1 ]
29+ obf_enc_key = obf_dec_key_bytes [0 :32 ]
30+ obf_enc_iv = obf_dec_key_bytes [32 :48 ]
31+ enc_key = sha256 ()
32+ enc_key .update (obf_enc_key )
33+ enc_key .update (secret )
34+ obf_enc_key = enc_key .digest ()
35+ encryptor = AESModeCTR (key = obf_enc_key ,
36+ iv = obf_enc_iv )
37+
38+ raw_data = decryptor .decrypt (enc_data )
39+
40+ dc_idx = int .from_bytes (raw_data [60 :62 ], "little" ) - 1
41+ if dc_idx < 0 or dc_idx >= len (TG_DC ):
42+ raise Exception
43+ dc = TG_DC [dc_idx ]
44+ if b'\xef \xef \xef \xef ' == raw_data [56 :60 ]:
45+ return dc , decryptor , encryptor
46+ else :
47+ raise Exception
48+
49+ async def from_telegram_to_client (self ,dc ,secret ):
50+ tg_reader , tg_writer = await asyncio .open_connection (dc , TG_DC )
51+
52+ obf_dec_key_bytes = bytearray ([random .randrange (0 , 256 ) for i in range (64 )])
53+ obf_dec_key_bytes [56 ] = obf_dec_key_bytes [57 ] = obf_dec_key_bytes [58 ] = obf_dec_key_bytes [59 ] = 0xef
54+ obf_dec_key_iv = bytes (obf_dec_key_bytes [8 :56 ])[::- 1 ]
55+ obf_dec_key = obf_dec_key_iv [0 :32 ]
56+ obf_dec_iv = obf_dec_key_iv [32 :48 ]
57+ decryptor = AESModeCTR (key = obf_dec_key ,
4558 iv = obf_dec_iv )
46- raw_data = encryptor .decrypt (enc_data )
47- return raw_data
4859
49- def to_telegram_obfuscated2 (self , raw_data ):
50- obf_enc_key_bytes = os .urandom (64 )
51- obf_enc_key = obf_enc_key_bytes [8 :40 ] # 8 - 40 bytes [32]
52- obf_enc_iv = obf_enc_key_bytes [40 :56 ] # 40 - 56 bytes [16]
53- encryptor = AESModeCTR (key = obf_enc_key ,
54- iv = obf_enc_iv )
55- enc_data = encryptor .encrypt (raw_data )
56- return enc_data
60+ obf_enc_key_bytes = bytes (obf_dec_key_bytes )[::- 1 ]
61+ obf_enc_key = obf_enc_key_bytes [8 :40 ] # 8 - 39 bytes [32]
62+ obf_enc_iv = obf_enc_key_bytes [40 :56 ] # 40 - 55 bytes [16]
63+ secret = bytes .fromhex (secret )
64+ enc_key = sha256 ()
65+ enc_key .update (obf_enc_key )
66+ enc_key .update (secret )
67+ obf_enc_key = enc_key .digest ()
68+ encryptor = AESModeCTR (key = obf_enc_key ,
69+ iv = obf_enc_iv )
70+ enc_data = obf_dec_key_bytes [:56 ] + encryptor .encrypt (bytes (obf_dec_key_bytes ))[56 :]
5771
72+ tg_writer .write (enc_data )
73+ await tg_writer .drain ()
5874
75+ return encryptor , decryptor , tg_reader , tg_writer
0 commit comments