AndTools 0.2.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- AndTools-0.2.6/AndTools/Pack.py +114 -0
- AndTools-0.2.6/AndTools/TEA.py +100 -0
- AndTools-0.2.6/AndTools/__init__.py +3 -0
- AndTools-0.2.6/AndTools/byte_.py +23 -0
- AndTools-0.2.6/AndTools.egg-info/PKG-INFO +13 -0
- AndTools-0.2.6/AndTools.egg-info/SOURCES.txt +25 -0
- AndTools-0.2.6/AndTools.egg-info/dependency_links.txt +1 -0
- AndTools-0.2.6/AndTools.egg-info/top_level.txt +4 -0
- AndTools-0.2.6/Jce/__init__.py +11 -0
- AndTools-0.2.6/Jce/bytebuffer.py +81 -0
- AndTools-0.2.6/Jce/exception.py +7 -0
- AndTools-0.2.6/Jce/stream.py +331 -0
- AndTools-0.2.6/Jce/struct.py +66 -0
- AndTools-0.2.6/Jce_b/__init__.py +38 -0
- AndTools-0.2.6/Jce_b/buffer.py +218 -0
- AndTools-0.2.6/Jce_b/head.py +42 -0
- AndTools-0.2.6/Jce_b/jcetypes.py +17 -0
- AndTools-0.2.6/Jce_b/reader.py +423 -0
- AndTools-0.2.6/Jce_b/struct.py +24 -0
- AndTools-0.2.6/Jce_b/typing.py +19 -0
- AndTools-0.2.6/Jce_b/writer.py +216 -0
- AndTools-0.2.6/PKG-INFO +13 -0
- AndTools-0.2.6/README.md +21 -0
- AndTools-0.2.6/pyproto/__init__.py +345 -0
- AndTools-0.2.6/setup.cfg +4 -0
- AndTools-0.2.6/setup.py +21 -0
- AndTools-0.2.6/test/test_Jce.py +10 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
from AndTools import hexFormat
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class pack_u:
|
|
5
|
+
"""解包"""
|
|
6
|
+
|
|
7
|
+
def __init__(self, data):
|
|
8
|
+
if isinstance(data, str):
|
|
9
|
+
self._byte_data = bytearray.fromhex(data.replace(' ', ''))
|
|
10
|
+
else:
|
|
11
|
+
self._byte_data = data
|
|
12
|
+
|
|
13
|
+
def _get_bytes(self, length: int) -> bytes:
|
|
14
|
+
res = self._byte_data[:length]
|
|
15
|
+
self._byte_data = self._byte_data[length:]
|
|
16
|
+
return res
|
|
17
|
+
|
|
18
|
+
def get_int(self, length=4):
|
|
19
|
+
"""取整数"""
|
|
20
|
+
res = self._get_bytes(length)
|
|
21
|
+
return int.from_bytes(res, 'big')
|
|
22
|
+
|
|
23
|
+
def get_long(self):
|
|
24
|
+
"""取长整数"""
|
|
25
|
+
res = self._get_bytes(8)
|
|
26
|
+
return int.from_bytes(res, 'big')
|
|
27
|
+
|
|
28
|
+
def get_byte(self):
|
|
29
|
+
"""取字节"""
|
|
30
|
+
res = self._get_bytes(1)
|
|
31
|
+
return int.from_bytes(res, 'big', signed=True)
|
|
32
|
+
|
|
33
|
+
def get_bin(self, length):
|
|
34
|
+
"""取字节集"""
|
|
35
|
+
res = self._get_bytes(length)
|
|
36
|
+
return res
|
|
37
|
+
|
|
38
|
+
def get_short(self):
|
|
39
|
+
"""取短整数"""
|
|
40
|
+
res = self._get_bytes(2)
|
|
41
|
+
return int.from_bytes(res, 'big')
|
|
42
|
+
|
|
43
|
+
def get_len(self):
|
|
44
|
+
"""取长度"""
|
|
45
|
+
return len(self._byte_data)
|
|
46
|
+
|
|
47
|
+
def get_all(self, Hex=False):
|
|
48
|
+
"""取全部"""
|
|
49
|
+
res = self._byte_data[:]
|
|
50
|
+
if Hex:
|
|
51
|
+
res = ' '.join(['{:02x}'.format(byte) for byte in res])
|
|
52
|
+
return res
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class pack_b:
|
|
56
|
+
"""组包
|
|
57
|
+
好像作用不大....
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
def __init__(self):
|
|
61
|
+
self._bytes_data = bytearray()
|
|
62
|
+
|
|
63
|
+
def add_bin(self, bytes_temp):
|
|
64
|
+
if bytes_temp is not None:
|
|
65
|
+
self._bytes_data.extend(bytes_temp)
|
|
66
|
+
|
|
67
|
+
def add_Hex(self, bytes_temp):
|
|
68
|
+
if bytes_temp is not None:
|
|
69
|
+
self._bytes_data.extend(bytearray.fromhex(bytes_temp))
|
|
70
|
+
|
|
71
|
+
def add_bytes(self, bytes_temp):
|
|
72
|
+
"""字节或字节集"""
|
|
73
|
+
if bytes_temp is not None:
|
|
74
|
+
self._bytes_data.append(bytes_temp)
|
|
75
|
+
|
|
76
|
+
def add_int(self, int_temp, length=4):
|
|
77
|
+
"""整数
|
|
78
|
+
length:
|
|
79
|
+
int:4
|
|
80
|
+
Short:2
|
|
81
|
+
long:8
|
|
82
|
+
"""
|
|
83
|
+
if int_temp is not None:
|
|
84
|
+
self._bytes_data.extend(int_temp.to_bytes(length, 'big'))
|
|
85
|
+
|
|
86
|
+
def add_body(self, data, length=4, _hex=False, add_len=0):
|
|
87
|
+
"""头部&内容"""
|
|
88
|
+
if data is None:
|
|
89
|
+
return
|
|
90
|
+
|
|
91
|
+
if isinstance(data, str):
|
|
92
|
+
bytes_data = bytes.fromhex(data) if _hex else data.encode('utf-8')
|
|
93
|
+
else:
|
|
94
|
+
bytes_data = data
|
|
95
|
+
|
|
96
|
+
self.add_int(len(bytes_data) + add_len, length)
|
|
97
|
+
self.add_bin(bytes_data)
|
|
98
|
+
|
|
99
|
+
def set_data(self, byte_temp):
|
|
100
|
+
"""置数据"""
|
|
101
|
+
if byte_temp is not None:
|
|
102
|
+
self._bytes_data = byte_temp
|
|
103
|
+
|
|
104
|
+
def empty(self):
|
|
105
|
+
"""清空"""
|
|
106
|
+
self._bytes_data = bytearray()
|
|
107
|
+
|
|
108
|
+
def get_bytes(self, Hex=False):
|
|
109
|
+
if Hex:
|
|
110
|
+
_bytes_temp = self._bytes_data.hex()
|
|
111
|
+
_bytes_temp = hexFormat(_bytes_temp)
|
|
112
|
+
else:
|
|
113
|
+
_bytes_temp = self._bytes_data
|
|
114
|
+
return _bytes_temp
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import struct
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class TEA:
|
|
5
|
+
"""QQ TEA 加解密, 64比特明码, 128比特密钥
|
|
6
|
+
这是一个确认线程安全的独立加密模块,使用时必须要有一个全局变量secret_key,要求大于等于16位
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
def xor(a, b):
|
|
10
|
+
op = 0xffffffff
|
|
11
|
+
a1, a2 = struct.unpack(b'>LL', a[0:8])
|
|
12
|
+
b1, b2 = struct.unpack(b'>LL', b[0:8])
|
|
13
|
+
return struct.pack(b'>LL', (a1 ^ b1) & op, (a2 ^ b2) & op)
|
|
14
|
+
|
|
15
|
+
def code(v, k):
|
|
16
|
+
n = 16
|
|
17
|
+
op = 0xffffffff
|
|
18
|
+
delta = 0x9e3779b9
|
|
19
|
+
k = struct.unpack(b'>LLLL', k[0:16])
|
|
20
|
+
y, z = struct.unpack(b'>LL', v[0:8])
|
|
21
|
+
s = 0
|
|
22
|
+
for i in range(n):
|
|
23
|
+
s += delta
|
|
24
|
+
y += (op & (z << 4)) + k[0] ^ z + s ^ (op & (z >> 5)) + k[1]
|
|
25
|
+
y &= op
|
|
26
|
+
z += (op & (y << 4)) + k[2] ^ y + s ^ (op & (y >> 5)) + k[3]
|
|
27
|
+
z &= op
|
|
28
|
+
r = struct.pack(b'>LL', y, z)
|
|
29
|
+
return r
|
|
30
|
+
|
|
31
|
+
def decipher(v, k):
|
|
32
|
+
n = 16
|
|
33
|
+
op = 0xffffffff
|
|
34
|
+
y, z = struct.unpack(b'>LL', v[0:8])
|
|
35
|
+
a, b, c, d = struct.unpack(b'>LLLL', k[0:16])
|
|
36
|
+
delta = 0x9E3779B9
|
|
37
|
+
s = (delta << 4) & op
|
|
38
|
+
for i in range(n):
|
|
39
|
+
z -= ((y << 4) + c) ^ (y + s) ^ ((y >> 5) + d)
|
|
40
|
+
z &= op
|
|
41
|
+
y -= ((z << 4) + a) ^ (z + s) ^ ((z >> 5) + b)
|
|
42
|
+
y &= op
|
|
43
|
+
s -= delta
|
|
44
|
+
s &= op
|
|
45
|
+
return struct.pack(b'>LL', y, z)
|
|
46
|
+
|
|
47
|
+
def encrypt(v, key):
|
|
48
|
+
if isinstance(key, str):
|
|
49
|
+
secret_key = bytearray.fromhex(key.replace(' ', ''))
|
|
50
|
+
else:
|
|
51
|
+
secret_key = key
|
|
52
|
+
|
|
53
|
+
END_CHAR = b'\0'
|
|
54
|
+
FILL_N_OR = 0xF8
|
|
55
|
+
vl = len(v)
|
|
56
|
+
filln = (8 - (vl + 2)) % 8 + 2
|
|
57
|
+
fills = b''
|
|
58
|
+
for i in range(filln):
|
|
59
|
+
fills = fills + bytes([220])
|
|
60
|
+
v = (bytes([(filln - 2) | FILL_N_OR])
|
|
61
|
+
+ fills
|
|
62
|
+
+ v
|
|
63
|
+
+ END_CHAR * 7)
|
|
64
|
+
tr = b'\0' * 8
|
|
65
|
+
to = b'\0' * 8
|
|
66
|
+
r = b''
|
|
67
|
+
o = b'\0' * 8
|
|
68
|
+
for i in range(0, len(v), 8):
|
|
69
|
+
o = TEA.xor(v[i:i + 8], tr)
|
|
70
|
+
tr = TEA.xor(TEA.code(o, secret_key), to)
|
|
71
|
+
to = o
|
|
72
|
+
r += tr
|
|
73
|
+
return r
|
|
74
|
+
|
|
75
|
+
def decrypt(v, key):
|
|
76
|
+
if isinstance(key, str):
|
|
77
|
+
secret_key = bytearray.fromhex(key.replace(' ', ''))
|
|
78
|
+
else:
|
|
79
|
+
secret_key = key
|
|
80
|
+
l = len(v)
|
|
81
|
+
prePlain = TEA.decipher(v, secret_key)
|
|
82
|
+
pos = (prePlain[0] & 0x07) + 2
|
|
83
|
+
r = prePlain
|
|
84
|
+
preCrypt = v[0:8]
|
|
85
|
+
for i in range(8, l, 8):
|
|
86
|
+
x = TEA.xor(TEA.decipher(TEA.xor(v[i:i + 8], prePlain), secret_key), preCrypt)
|
|
87
|
+
prePlain = TEA.xor(x, preCrypt)
|
|
88
|
+
preCrypt = v[i:i + 8]
|
|
89
|
+
r += x
|
|
90
|
+
if r[-7:] != b'\0' * 7:
|
|
91
|
+
return None
|
|
92
|
+
return r[pos + 1:-7]
|
|
93
|
+
|
|
94
|
+
# data = 'cb 63 ea be db ef f9 ff 79 f8 36 b4 d2 7a e7 0d 67 6e 04 49 a6 fa 9d 83 08 79 8f f2 39 07 25 25 12 28 b1 53 4e 0d d0 1e eb 3f 36 f0 f2 27 1d d0 07 d6 0e 6b bd da 4f fb b7 6a b4 5d 65 5f 03 66 bf 32 88 1e a5 3c 4d f6 a9 7f 9e 53 6b 71 44 c1 49 52 a2 5a 27 34 a2 eb d0 c0 6e df a5 5e 37 b7 90 01 2d 43 9d 3f 18 80 50 0e 81 c9 9b ae a5 2c aa fc 73 33 16 8e 2f 02 a8 1b 00 9b fc f1 ef 9e 48 f9 d1 30 69 45 84 24 a9 99 a1 88 40 09 72 94 20 89 2d 62 5a 5a 7a a1 9f ec a1 ec a8 c2 b5 e3 b7 3d fb 8b 26 63 15 41 fd c3 21 16 f4 1b 2c c0 72 0f cc 2b c1 39 5c ba 9b 37 90 be c8 9e 25 94 d7 6c a4 07 27 45 64 a8 67 73 30 8c c0 83 c4 94 eb 78 d8 32 3a 4e 2d 52 52 b3 62 9d 94 49 35 5d 0f 5f c0 89 bc 58 c8 71 28 fe 45 51 c4 12 60 a8 46 ac 0d 97 dc ab 74 21 7d 9b b7 b8 63 64 e7 c0 62 ea e7 11 5a 75 74 f6 b2 2e 40 af a3 3d 8e 3d 5c 4a 73 53 59 0c 76 71 07 3b 48 e9 35 ba f6 a5 91 3a e0 b2 43 3a fe 67 02 a0 91 c5 6e 27 81 6c e5 ba 1b 63 07 35 fb 2e 07 6c 7f 77 ac cd a8 17 d5 cd 74 84 fd 85 59 0e 60 fe 82 6a 71 b9 9e ef 24 54 c7 61 b7 16 6d 6f e5 e9 97 36 80 60 81 f9 2d 57 05 72 3b 6f cb 5e f9 d3 f7 f8 ee b4 8b 21 0f 7f ec 55 63 2c e2 ee d0 78 5c ac 18 d4 05 ad ca f8 e5 2c 29 a3 5b 89 cb 26 89 ef 0e a6 82 35 61 5e 3b 02 50 b3 48 d2 d6 52 b8 83 f4 da ce e2 1a 7a 94 36 22 61 bf 38 a1 4f 4b 36 1c e6 5a 89 b1 1e c0 6a ef b2 34 3b 39 e7 f1 13 96 c2 9d d8 bc 7d 2c 99 b8 cd fb 5c c8 f8 8a 11 f1 85 e7 76 2e 45 a1 17 7a c4 7c f8 6f 99 97 d6 81 10 ba 30 75 11 e6 6f 33 5a ab 35 bf 4c 0a 31 44 24 cf dd 91 cc e3 a9 67 80 30 d3 bf 6c b5 e4 29 f6 1b 57 35 7d da b4 b8 d1 6f ae df 9d 3d 63 75 88 30 23 11 3b ce 2d 87 1b 5c 48 f4 f8 1a ff 1c 0b a0 0b b6 7b 0e c4 45 2a 20 80 64 a2 ab d6 cb f6 d7 70 c8 bd 34 76 5b 1f 60 6c 71 ea b1 d2 49 0b e4 2b 85 e0 43 2e fe c1 7c 09 3e 9d cd 6c 1a 6c 1d c0 6b 2a f4 f8 82 e1 a1 03 80 63 fa 52 71 fc 67 e4 df 88 95 3d 71 72 ac 77 80 5f f5 d0 63 57 18 a5 c4 fa 56 42 3a 26 b5 d0 05 af f6 ee c5 da 54 90 cc 98 35 81 9d c8 07 a1 70 a5 23 1a 7e 73 23 04 50 d4 1e db 73 d9 2a 05 d3 c4 10 3e 77 f0 90 cc b3 85 f5 cb db fd 60 41 d0 be 99 d6 2a 27 7f 0e e9 00 27 fe 58 64 65 00 5e 55 8c 7e 86 80 2d b1 cc 3a 1f b8 ba 6f fe 07 a6 38 af 53 e5 1d 4c 90 bb ef 98 96 28 32 8f 93 6f a7 8d 6c d3 62 a0 f4 6a a8 79 33 8a c7 69 48 c9 b9 35 d2 11 cc 16 72 03 f6 9c c1 75 09 ed 7d 2a 37 7d 52 a5 6c e3 72 fc 80 85 6d 73 3b 77 f2 26 bf 08 43 fa 44 d1 7b 8d 93 a2 2b af b2 2b 9d 49 16 18 a8 8e a6 0a 94 77 86 1f 4b 9c a8 bb bb e3 8b 02 70 9c 2b 6b 9a d4 be 61 b7 de ee 7e 3c 6c 12 17 56 74 0c e9 96 ea d3 09 93 4c 31 4d 14 f6 3d ed 91 81 18 5f 86 9a 16 96 91 57 92 ff 20 70 1b d6 6e c9 e0 c2 42 af 95 06 80 6c 82 ca 53 5f 50 df 40 54 d1 6f ed 7b f2 18 bc 27 c4 5a a5 a2 3c c2 9d db f2 a5 c9 1e 55 95 26 a8 fb 9f e4 0b 09 f7 c8 22 ba b8 c8 e7 eb 60 35 b4 f3 7d 99 b6 f8 fc 27 79 36 c3 a2 28 d3 90 7b 4b 98 a8 e8 13 12 e4 d0 fa d9 ca 3f 32 f2 5f 45 df 97 e5 0a bd 9e 5b cc 4d c9 60 52 82 be aa e5 ee 53 91 57 fd b6 cf ba 68 d9 25 af 96 18 6a 21 ff 23 11 dd 58 0d 55 e6 f1 55 60 df 2a f9 6b 8c 4d 4b 64 d3 50 cb 22 ed aa 59 ad cd 45 c0 bd 5a 9e fd c4 57 91 e6 d2 c0 ff ce 8c 47 e5 a6 92 7e 86 ce 4d 2c c5 d3 2c c2 6d de b1 79 86 d1 74 00 86 97 f9 66 e5 d4 d2 d9 35 ec 0a 26 61 5c f5 63 9e 20 17 c2 10 75 74 38 5d fc fb 95 55 4d 60 68 85 55 83 74 af b8 a6 dd 08 8e 94 ba 3d 75 bb 67 5d 24 18 c1 42 69 32 5f 51 2f 7f 9b 7a 1e 5e cd 56 e4 d0 72 43 6a d5 cd 91 6c 6e 28 0b 64 d0 cf 53 d6 58 f1 6b 51 52 7d 2a 95 0b 98 01 bc 73 13 32 4c 32 de 0c 66 3c 7a cd 01 a8 c3 38 c9 04 c3 02 49 bf 72 9f 2b 98 fa 33 a4 76 b4 61 22 26 96 e2 3c 40 df 34 c2 36 4a 0a 90 16 47 87 5e ce e4 0f 14 f5 7a 92 63 9c bf 84 06 30 1f ae 0b b0 f6 d1 a8 d5 e6 1d 8c f6 ab f2 56 34 2d e6 e7 11 96 fe 29 d0 f9 12 c9 8c 9d 43 59 26 a6 ec 1f 67 b5 55 c6 22 14 c0 d9 2e cf 5c f7 e0 84 17 07 bb 96 32 0e 75 30 2e 27 66 f1 c7 c8 3a a3 69 b5 4f fc 58 3b 3b 92 c1 a4 86 00 13 d7 cc ca e6 d2 a0 d5 a7 89 d5 98 23 2b 12 a4 fa fd 05 be 15 13 31 f9 8f af f1 b7 46 4d 63 8e c7 cf 52 ad 43 49 64 ac 19 df bb 03 fb 30 17 ec a3 40 44 81 b6 2e 38 ab b0 e8 e9 2f 61 41 4d 44 0e 48 d9 9b 9a 63 78 ac 8d a4 f9 36 16 2f ea ee 87 74 a3 c6 ab 89 23 7c 7c a1 e8 c7 22 15 a2 94 9f c0 cf ad 35 df 90 25 1d 06 da 76 34 6c 3f 6d 36 06 e2 1f da 0d be ed 2f 9a a5 1a 7a 00 a6 0e 64 34 23 1e 13 0a c4 85 40 86 3c b6 69 d3 e8 32 11 43 69 b7 14 44 a2 a6 86 67 50 f7 fa a8 6c 74 35 f0 ff 47 49 1c 6a 5a 60 cd 11 d7 bc 8e 18 20 60 8d 60 e6 13 29 ba 89 f3 a5 3e 3d 2c de 86 49 04 7f af 41 46 15 15 21 de 82 a1 6a 2b e9 61 d7 83 35 80 c0 e4 af 06 5a 12 2e 4e a7 06 26 e1 fa 22 cd 78 ac fb 1b 17 85 23 6f 6b 23 83 c2 ca 78 b8 7a 3f db f7 70 79 22 15 61 0e 34 42 f8 56 4a b1 b1 91 0f 38 55 8e 38 da cf 70 73 a4 28 1a 56 90 29 0e 1f a6 aa c2 56 88 93 9a 1d 73 c6 7d 39 6e d0 7b 9c 19 19 ed 97 4b 2f 5c 09 c1 72 ea 06 89 95 b7 46 63 a6 cc c8 69 23 d0 8e 0d da 5d a8 b3 5b c7 de 27 39 0e 25 95 19 1d af 81 54 d7 98 61 a5 67 f5 2b 1f 0b 09 e7 b6 6a 22 7f 70 01 c1 11 e4 72 aa a4 be 45 e9 32 d7 82 3c b7 e7 82 33 89 d5 a6 3e 69 79 1f e1 6d c6 64 02 c0 4a fa bc 77 2d 9c e7 e9 c1 76 a1 09 86 7a 7f d4 ad dc a8 3a 1d d2 80 17 f1 27 f3 3a a9 a4 0e 97 ad f8 93 37 62 28 32 7a c2 c8 ab 84 21 a3 1c 7a 8e 4e 33 ba b8 2b 0e 2d 1a bd a8 88 18 27 95 60 3c 5d 84 e0 4b d1 72 b3 fa 96 56 0c 68 43 5d bf ca d3 2f e9 53 b6 90 e7 23 50 49 09 ec 88 a3 41 6d 99 c8 25 42 dc d4 c3 b7 57 bf a1 62 c3 51 f1 34 4b 94 d1 82 4c 66 0d 99 33 bc d8 82 aa b9 0e 29 4d 0f ac 8d 94 5a 92 8f db 45 27 4a 2a c9 be 4a 2f b7 c5 34 19 56 26 67 48 50 52 62 13 95 d8 66 72 14 69 f4 7c 1b 99 9c 62 b0 74 c2 97 20 64 91 46 71 a3 85 ca 1d 89 2b 15 d4 51 03 b3 23 4a 0a 84 88 8f c5 3c 3a 7b 1a 34 0e 49 81 bc 69 0d 43 4a 6b 2f 3a 63 c1 5a a9 c6 b2 a9 6b 07 47 f3 75 4d 8a 0f fa 23 ae bb 1a 1f 7b 61 51 36 e0 5c c5 21 9e d3 16 bd 53 20 a8 f4 c3 34 10 d6 f6 06 d9 be d4 ad 31 a3 10 ab f9 5f 77 57 12 95 87 75 16 d2 48 58 ef 88 f7 18 1c 33 70 a4 b8 8f e5 9f ac b8 26 1a ba 77 ac 1e 5c af 3e de ef 0d e3 fd be ac 82 17 a1 15 82 45 3a 29 65 f0 2d 29 de ac 32 ed 67 4e 18 fd e7 1c aa 88 37 65 1d e0 56 73 31 ff 30 5e 53 cf 9a f7 5b 17 c4 0a ff 33 84 81 cf 43 02 e5 ad 9d 45 fe a8 23 59 a3 c9 60 ef a1 fa 29 82 b5 6d 7d 12 60 49 81 72 e1 34 5e 46 57 9c 73 51 4b 9d d3 2b d6 43 8d 11 8d 8d 3e f4 a6 c5 6c 45 07 c2 be c5 af ce ca fb a3 0b 94 09 21 58 b4 e9 9b cb c1 cb d7 22 e7 92 00 dd 6e ce d7 c5 32 03 8c 4e 4c 97 70 4b ef 40 c2 64 ba 8a 1b 9b b4 9a 56 03 fd 70 '
|
|
95
|
+
#
|
|
96
|
+
# key = '7F9C5F4A38168696190994E1392CDF16'
|
|
97
|
+
# bin = bytearray.fromhex(data.replace(' ', ''))
|
|
98
|
+
# secret_key = bytearray.fromhex(key.replace(' ', ''))
|
|
99
|
+
#
|
|
100
|
+
# print(TEA.decrypt(bin, secret_key))
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import hashlib
|
|
2
|
+
import random
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def hexFormat(Hex):
|
|
6
|
+
"""Hex格式化"""
|
|
7
|
+
Hex = ' '.join(Hex[i:i + 2] for i in range(0, len(Hex), 2))
|
|
8
|
+
return Hex
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def get_random_bin(len):
|
|
12
|
+
byte = b""
|
|
13
|
+
for _ in range(len):
|
|
14
|
+
byte += bytes([random.randint(0, 255)])
|
|
15
|
+
return byte
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def get_md5(byte_content):
|
|
19
|
+
if isinstance(byte_content, str):
|
|
20
|
+
byte_content = byte_content.encode('utf-8')
|
|
21
|
+
md5_object = hashlib.md5()
|
|
22
|
+
md5_object.update(byte_content)
|
|
23
|
+
return md5_object.digest()
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: AndTools
|
|
3
|
+
Version: 0.2.6
|
|
4
|
+
Summary: Android Tools for Python
|
|
5
|
+
Home-page:
|
|
6
|
+
Author: 1x
|
|
7
|
+
Author-email: 111111@gmail.com
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
|
|
13
|
+
Android Tools for Python
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
README.md
|
|
2
|
+
setup.py
|
|
3
|
+
AndTools/Pack.py
|
|
4
|
+
AndTools/TEA.py
|
|
5
|
+
AndTools/__init__.py
|
|
6
|
+
AndTools/byte_.py
|
|
7
|
+
AndTools.egg-info/PKG-INFO
|
|
8
|
+
AndTools.egg-info/SOURCES.txt
|
|
9
|
+
AndTools.egg-info/dependency_links.txt
|
|
10
|
+
AndTools.egg-info/top_level.txt
|
|
11
|
+
Jce/__init__.py
|
|
12
|
+
Jce/bytebuffer.py
|
|
13
|
+
Jce/exception.py
|
|
14
|
+
Jce/stream.py
|
|
15
|
+
Jce/struct.py
|
|
16
|
+
Jce_b/__init__.py
|
|
17
|
+
Jce_b/buffer.py
|
|
18
|
+
Jce_b/head.py
|
|
19
|
+
Jce_b/jcetypes.py
|
|
20
|
+
Jce_b/reader.py
|
|
21
|
+
Jce_b/struct.py
|
|
22
|
+
Jce_b/typing.py
|
|
23
|
+
Jce_b/writer.py
|
|
24
|
+
pyproto/__init__.py
|
|
25
|
+
test/test_Jce.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from .bytebuffer import ByteBuffer
|
|
2
|
+
from .struct import JceStruct
|
|
3
|
+
from .stream import JceInputStream
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def jce_to_json(_data):
|
|
7
|
+
"""将 Jce 数据转换为 JSON 格式"""
|
|
8
|
+
_stream = JceInputStream(_data)
|
|
9
|
+
jce = JceStruct()
|
|
10
|
+
jce.read_from(_stream)
|
|
11
|
+
return jce.to_json()
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import struct
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class ByteBuffer(object):
|
|
5
|
+
_bytes = None
|
|
6
|
+
_position = 0
|
|
7
|
+
|
|
8
|
+
@property
|
|
9
|
+
def bytes(self) -> bytes:
|
|
10
|
+
return self._bytes
|
|
11
|
+
|
|
12
|
+
@property
|
|
13
|
+
def position(self):
|
|
14
|
+
return self._position
|
|
15
|
+
|
|
16
|
+
@position.setter
|
|
17
|
+
def position(self, value):
|
|
18
|
+
if not isinstance(value, int):
|
|
19
|
+
raise TypeError("'position' 属性必须是整数")
|
|
20
|
+
elif value < 0:
|
|
21
|
+
raise ValueError("'position' 属性必须是正数")
|
|
22
|
+
elif value > len(self._bytes):
|
|
23
|
+
raise ValueError('')
|
|
24
|
+
else:
|
|
25
|
+
self._position = value
|
|
26
|
+
|
|
27
|
+
def __init__(self, bs: bytes):
|
|
28
|
+
if isinstance(bs, bytes):
|
|
29
|
+
self._bytes = bs
|
|
30
|
+
elif isinstance(bs, bytearray):
|
|
31
|
+
self._bytes = bytes(bs)
|
|
32
|
+
else:
|
|
33
|
+
raise TypeError("'bs' 参数必须是字节或字节数组")
|
|
34
|
+
|
|
35
|
+
def get(self):
|
|
36
|
+
if self._position >= len(self._bytes):
|
|
37
|
+
raise BufferError('到达字节末尾')
|
|
38
|
+
b = self._bytes[self._position]
|
|
39
|
+
self._position += 1
|
|
40
|
+
return b
|
|
41
|
+
|
|
42
|
+
def get_bytes(self, size):
|
|
43
|
+
"""获取字节"""
|
|
44
|
+
if size < 0:
|
|
45
|
+
raise ValueError("'size'属性必须是正数")
|
|
46
|
+
if self._position > len(self._bytes):
|
|
47
|
+
raise BufferError('到达字节末尾')
|
|
48
|
+
if self.position + size > len(self._bytes):
|
|
49
|
+
raise BufferError('到达字节末尾')
|
|
50
|
+
b = self._bytes[self.position:self.position + size]
|
|
51
|
+
# print(b.hex(),b)
|
|
52
|
+
self.position = self.position + size
|
|
53
|
+
return b
|
|
54
|
+
|
|
55
|
+
def get_int2(self):
|
|
56
|
+
b = self.get_bytes(2)
|
|
57
|
+
return struct.unpack('>h', b)[0]
|
|
58
|
+
|
|
59
|
+
def get_int4(self):
|
|
60
|
+
b = self.get_bytes(4)
|
|
61
|
+
return struct.unpack('>i', b)[0]
|
|
62
|
+
|
|
63
|
+
def get_int8(self):
|
|
64
|
+
b = self.get_bytes(8)
|
|
65
|
+
return struct.unpack('>q', b)[0]
|
|
66
|
+
|
|
67
|
+
def get_float(self):
|
|
68
|
+
b = self.get_bytes(4)
|
|
69
|
+
return struct.unpack('>f', b)[0]
|
|
70
|
+
|
|
71
|
+
def get_double(self):
|
|
72
|
+
b = self.get_bytes(8)
|
|
73
|
+
return struct.unpack('>d', b)[0]
|
|
74
|
+
|
|
75
|
+
def duplicate(self):
|
|
76
|
+
bb = ByteBuffer(self._bytes)
|
|
77
|
+
bb.position = self.position
|
|
78
|
+
return bb
|
|
79
|
+
|
|
80
|
+
def clear(self):
|
|
81
|
+
self._position = 0
|