├── 1_5136b9e5ca2e2c9394c097d2bd2521d6.apk ├── README.md ├── emu ├── emu.py └── emu2.py ├── libjdbitmapkit.so └── sign ├── TenMagic16.py ├── TenMagic32.py ├── TenSeattos.py ├── Utils.py ├── __pycache__ ├── TenMagic16.cpython-310.pyc ├── TenMagic32.cpython-310.pyc ├── TenSeattos.cpython-310.pyc ├── Utils.cpython-310.pyc ├── __init__.cpython-310.pyc └── jdSign.cpython-310.pyc ├── jdSign.py └── test.py /1_5136b9e5ca2e2c9394c097d2bd2521d6.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n1ptune/jdSign/a76cba777a2ef5a2c6d0d7d0227f067bbbd4b1db/1_5136b9e5ca2e2c9394c097d2bd2521d6.apk -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | The sign directory include all the code to generate a sign. 2 | 3 | The emu directory include emulate code for some function. 4 | 5 | 1_5136b9e5ca2e2c9394c097d2bd2521d6.apk is the orign apk 6 | 7 | # How to use 8 | 9 | #### see /sign/test.py 10 | 11 | ```python 12 | from jdSign import getSign 13 | 14 | functionId = "switchQuery" 15 | clientVersion = "11.8.3" 16 | client = "android" 17 | uuid = "uuid" 18 | body = "aaaabbbb" 19 | getSign(functionId, body, uuid, client, clientVersion) 20 | ``` 21 | 22 | -------------------------------------------------------------------------------- /emu/emu.py: -------------------------------------------------------------------------------- 1 | from unicorn import * 2 | from unicorn.arm64_const import * 3 | from capstone import * 4 | table = [] 5 | 6 | 7 | def bytes2bin(bytes): 8 | arr = [] 9 | for v in [m for m in bytes]: 10 | arr.append( 11 | [(v & 128) >> 7, (v & 64) >> 6, (v & 32) >> 5, (v & 16) >> 4, (v & 8) >> 3, (v & 4) >> 2, (v & 2) >> 1, 12 | v & 1]) 13 | return [i for j in arr for i in j] 14 | 15 | 16 | def bin2bytes(arr): 17 | length = len(arr) // 8 18 | arr1 = [0 for _ in range(length)] 19 | for j in range(length): 20 | arr1[j] = arr[j * 8] << 7 | arr[j * 8 + 1] << 6 | arr[j * 8 + 2] << 5 | arr[j * 8 + 3] << 4 | arr[ 21 | j * 8 + 4] << 3 | arr[j * 8 + 5] << 2 | arr[j * 8 + 6] << 1 | arr[j * 8 + 7] 22 | return bytes(arr1) 23 | 24 | 25 | def read(name): 26 | with open(name, 'rb') as f: 27 | return f.read() 28 | 29 | 30 | def hook_code(mu, address, size, user_data): 31 | if address == BASE + 0x17638: 32 | arr2 = [] 33 | for byte in mu.mem_read(PLAINTEXT_ADDR, 8): 34 | arr2.append(byte) 35 | table.append([user_data.index(1), bytes2bin(arr2).index(1)]) 36 | 37 | 38 | if __name__ == "__main__": 39 | key0 = b'7d0069660c9b5d32074facf37c3738a1' 40 | mu = Uc(UC_ARCH_ARM64, CS_MODE_ARM) 41 | BASE = 0x400000 42 | STACK_ADDR = 0x0 43 | STACK_SIZE = 1024 * 2 44 | PLAINTEXT_ADDR = 1024 * 2 45 | PLAINTEXT_SIZE = 1024 46 | KEY_ADDR = 1024 * 3 47 | KEY_SIZE = 1024 48 | 49 | mu.mem_map(BASE, 1024 * 1024 * 1024) 50 | mu.mem_map(STACK_ADDR, STACK_SIZE) 51 | mu.mem_map(PLAINTEXT_ADDR, PLAINTEXT_SIZE) 52 | mu.mem_map(KEY_ADDR, KEY_SIZE) 53 | # mu.mem_write(BASE, read("F:\\Code\\Pycharm\\JDSign\\libjdbitmapkit.so")) 54 | mu.mem_write(BASE, read("./libjdbitmapkit.so")) 55 | mu.mem_write(KEY_ADDR, key0) 56 | 57 | for i in range(64): 58 | arr1 = [0 for j in range(64)] 59 | arr1[i] = 1 60 | h = mu.hook_add(UC_HOOK_CODE, hook_code, arr1) 61 | mu.reg_write(UC_ARM64_REG_SP, STACK_ADDR + STACK_SIZE - 1) 62 | mu.mem_write(PLAINTEXT_ADDR, bin2bytes(arr1)) 63 | mu.reg_write(UC_ARM64_REG_X1, KEY_ADDR) 64 | mu.reg_write(UC_ARM64_REG_X2, 16) 65 | mu.reg_write(UC_ARM64_REG_X3, PLAINTEXT_ADDR) 66 | mu.emu_start(BASE + 0x165e0, BASE + 0x1763c) 67 | mu.hook_del(h) 68 | print(table) -------------------------------------------------------------------------------- /emu/emu2.py: -------------------------------------------------------------------------------- 1 | from unicorn import * 2 | from unicorn.arm64_const import * 3 | from capstone import * 4 | table = [] 5 | table1 = [] 6 | 7 | 8 | def bytes2bin(bytes): 9 | arr = [] 10 | for v in [m for m in bytes]: 11 | arr.append( 12 | [(v & 128) >> 7, (v & 64) >> 6, (v & 32) >> 5, (v & 16) >> 4, (v & 8) >> 3, (v & 4) >> 2, (v & 2) >> 1, 13 | v & 1]) 14 | return [i for j in arr for i in j] 15 | 16 | 17 | def bin2bytes(arr): 18 | length = len(arr) // 8 19 | arr1 = [0 for _ in range(length)] 20 | for j in range(length): 21 | arr1[j] = arr[j * 8] << 7 | arr[j * 8 + 1] << 6 | arr[j * 8 + 2] << 5 | arr[j * 8 + 3] << 4 | arr[ 22 | j * 8 + 4] << 3 | arr[j * 8 + 5] << 2 | arr[j * 8 + 6] << 1 | arr[j * 8 + 7] 23 | return bytes(arr1) 24 | 25 | 26 | def read(name): 27 | with open(name, 'rb') as f: 28 | return f.read() 29 | 30 | 31 | def hook_code(mu, address, size, user_data): 32 | if address == BASE + user_data[2] -4: 33 | table.append(bytes2bin(mu.mem_read(PLAINTEXT_ADDR, user_data[0]))) 34 | 35 | 36 | if __name__ == "__main__": 37 | key0 = b'7d0069660c9b5d32074facf37c3738a1' 38 | mu = Uc(UC_ARCH_ARM64, CS_MODE_ARM) 39 | BASE = 0x400000 40 | STACK_ADDR = 0x0 41 | STACK_SIZE = 1024 * 10 42 | PLAINTEXT_ADDR = 1024 * 10 43 | PLAINTEXT_SIZE = 1024 44 | KEY_ADDR = 1024 * 11 45 | KEY_SIZE = 1024 46 | 47 | mu.mem_map(BASE, 1024 * 1024 * 1024) 48 | mu.mem_map(STACK_ADDR, STACK_SIZE) 49 | mu.mem_map(PLAINTEXT_ADDR, PLAINTEXT_SIZE) 50 | mu.mem_map(KEY_ADDR, KEY_SIZE) 51 | # mu.mem_write(BASE, read("F:\\Code\\Pycharm\\JDSign\\libjdbitmapkit.so")) 52 | mu.mem_write(BASE, read("./libjdbitmapkit.so")) 53 | mu.mem_write(KEY_ADDR, key0) 54 | 55 | 56 | func_addr = [[1, 0x691c, 0x82c4], [2, 0x82cc, 0xa590], [3, 0xa598, 0xc89c], [4, 0xc8a4, 0xed0c], [5, 0xed14, 0x11300], [6, 0x11308, 0x13af0], [7, 0x13af8, 0x16464]] 57 | for addr in func_addr: 58 | for i in range(addr[0]*8 + 1): 59 | arr1 = [0 for j in range(addr[0]*8)] 60 | if i != 0: 61 | arr1[i - 1] = 1 62 | h = mu.hook_add(UC_HOOK_CODE, hook_code, addr) 63 | mu.reg_write(UC_ARM64_REG_SP, STACK_ADDR + STACK_SIZE - 1) 64 | mu.mem_write(PLAINTEXT_ADDR, bin2bytes(arr1)) 65 | mu.reg_write(UC_ARM64_REG_X0, KEY_ADDR) 66 | mu.reg_write(UC_ARM64_REG_X1, 32) 67 | mu.reg_write(UC_ARM64_REG_X2, 1) 68 | mu.reg_write(UC_ARM64_REG_X3, PLAINTEXT_ADDR) 69 | mu.emu_start(BASE + addr[1], BASE + addr[2]) 70 | mu.hook_del(h) 71 | for i in range(addr[0]*8): 72 | for j in range(addr[0]*8): 73 | arr3 = [] 74 | if table[0][j] != table[i + 1][j]: 75 | table1.append([i, j, table[0][j], table[i + 1][j]]) 76 | print("case %s 映射关系:"%(addr[0])) 77 | print(table1) 78 | table.clear() 79 | table1.clear() 80 | -------------------------------------------------------------------------------- /libjdbitmapkit.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n1ptune/jdSign/a76cba777a2ef5a2c6d0d7d0227f067bbbd4b1db/libjdbitmapkit.so -------------------------------------------------------------------------------- /sign/TenMagic16.py: -------------------------------------------------------------------------------- 1 | from Utils import * 2 | def remain1(data): 3 | table = [[0, 0, 0, 1], [1, 3, 0, 1], [2, 5, 1, 0], [3, 4, 0, 1], [4, 7, 0, 1], [5, 2, 1, 0], [6, 6, 1, 0], [7, 1, 1, 0]] 4 | arr = toBit(data) 5 | size = len(arr) 6 | arr1 = [0 for i in range(size)] 7 | for i in range(size): 8 | if arr[i] == 0: 9 | arr1[table[i][1]] = table[i][2] 10 | else: 11 | arr1[table[i][1]] = table[i][3] 12 | return toBytes(arr1) 13 | 14 | def remain2(data): 15 | table = [[0, 5, 1, 0], [1, 10, 0, 1], [2, 11, 1, 0], [3, 15, 1, 0], [4, 14, 0, 1], [5, 7, 1, 0], [6, 0, 0, 1], [7, 9, 1, 0], 16 | [8, 1, 1, 0], [9, 3, 0, 1], [10, 6, 0, 1], [11, 8, 0, 1], [12, 13, 0, 1], [13, 2, 1, 0], [14, 4, 1, 0], [15, 12, 0, 1]] 17 | arr = toBit(data) 18 | size = len(arr) 19 | arr1 = [0 for i in range(size)] 20 | for i in range(size): 21 | if arr[i] == 0: 22 | arr1[table[i][1]] = table[i][2] 23 | else: 24 | arr1[table[i][1]] = table[i][3] 25 | return toBytes(arr1) 26 | 27 | def remain3(data): 28 | table = [[0, 7, 1, 0], [1, 1, 1, 0], [2, 0, 0, 1], [3, 23, 0, 1], [4, 18, 0, 1], [5, 15, 1, 0], [6, 8, 1, 0], [7, 20, 0, 1], 29 | [8, 13, 0, 1], [9, 11, 0, 1], [10, 3, 1, 0], [11, 4, 1, 0], [12, 16, 0, 1], [13, 5, 1, 0], [14, 14, 0, 1], [15, 21, 1, 0], 30 | [16, 17, 0, 1], [17, 22, 0, 1], [18, 6, 1, 0], [19, 12, 0, 1], [20, 9, 0, 1], [21, 19, 0, 1], [22, 2, 0, 1], [23, 10, 1, 0]] 31 | arr = toBit(data) 32 | size = len(arr) 33 | arr1 = [0 for i in range(size)] 34 | for i in range(size): 35 | if arr[i] == 0: 36 | arr1[table[i][1]] = table[i][2] 37 | else: 38 | arr1[table[i][1]] = table[i][3] 39 | return toBytes(arr1) 40 | 41 | def remain4(data): 42 | table = [[0, 20, 1, 0], [1, 3, 1, 0], [2, 14, 1, 0], [3, 5, 1, 0], [4, 9, 0, 1], [5, 13, 0, 1], [6, 8, 0, 1], [7, 17, 0, 1], 43 | [8, 6, 1, 0], [9, 18, 0, 1], [10, 22, 1, 0], [11, 7, 0, 1], [12, 24, 1, 0], [13, 31, 1, 0], [14, 16, 0, 1], [15, 0, 0, 1], 44 | [16, 23, 0, 1], [17, 10, 0, 1], [18, 11, 0, 1], [19, 15, 1, 0], [20, 19, 0, 1], [21, 28, 0, 1], [22, 4, 0, 1], [23, 1, 0, 1], 45 | [24, 26, 0, 1], [25, 30, 0, 1], [26, 21, 1, 0], [27, 29, 0, 1], [28, 12, 0, 1], [29, 27, 1, 0], [30, 2, 1, 0], [31, 25, 0, 1]] 46 | arr = toBit(data) 47 | size = len(arr) 48 | arr1 = [0 for i in range(size)] 49 | for i in range(size): 50 | if arr[i] == 0: 51 | arr1[table[i][1]] = table[i][2] 52 | else: 53 | arr1[table[i][1]] = table[i][3] 54 | return toBytes(arr1) 55 | 56 | def remain5(data): 57 | table = [[0, 16, 0, 1], [1, 24, 1, 0], [2, 6, 0, 1], [3, 17, 0, 1], [4, 2, 0, 1], [5, 1, 1, 0], [6, 14, 1, 0], [7, 33, 0, 1], 58 | [8, 31, 0, 1], [9, 32, 1, 0], [10, 7, 1, 0], [11, 8, 0, 1], [12, 20, 1, 0], [13, 0, 1, 0], [14, 39, 0, 1], [15, 29, 1, 0], 59 | [16, 34, 0, 1], [17, 10, 1, 0], [18, 27, 1, 0], [19, 3, 0, 1], [20, 19, 0, 1], [21, 18, 1, 0], [22, 22, 1, 0], [23, 4, 0, 1], 60 | [24, 37, 1, 0], [25, 9, 1, 0], [26, 13, 1, 0], [27, 38, 1, 0], [28, 12, 0, 1], [29, 21, 0, 1], [30, 23, 0, 1], [31, 25, 0, 1], 61 | [32, 11, 1, 0], [33, 5, 1, 0], [34, 26, 0, 1], [35, 35, 0, 1], [36, 28, 0, 1], [37, 30, 1, 0], [38, 15, 1, 0], [39, 36, 0, 1]] 62 | arr = toBit(data) 63 | size = len(arr) 64 | arr1 = [0 for i in range(size)] 65 | for i in range(size): 66 | if arr[i] == 0: 67 | arr1[table[i][1]] = table[i][2] 68 | else: 69 | arr1[table[i][1]] = table[i][3] 70 | return toBytes(arr1) 71 | 72 | def remain6(data): 73 | table = [[0, 11, 1, 0], [1, 44, 1, 0], [2, 9, 0, 1], [3, 17, 0, 1], [4, 47, 0, 1], [5, 1, 1, 0], [6, 14, 1, 0], [7, 23, 0, 1], 74 | [8, 31, 0, 1], [9, 25, 0, 1], [10, 29, 1, 0], [11, 8, 0, 1], [12, 5, 1, 0], [13, 0, 1, 0], [14, 43, 1, 0], [15, 45, 1, 0], 75 | [16, 34, 0, 1], [17, 10, 1, 0], [18, 27, 1, 0], [19, 16, 1, 0], [20, 24, 1, 0], [21, 18, 1, 0], [22, 22, 1, 0], [23, 30, 1, 0], 76 | [24, 6, 0, 1], [25, 13, 0, 1], [26, 7, 0, 1], [27, 28, 1, 0], [28, 4, 0, 1], [29, 26, 1, 0], [30, 46, 1, 0], [31, 42, 1, 0], 77 | [32, 40, 0, 1], [33, 3, 1, 0], [34, 41, 1, 0], [35, 35, 0, 1], [36, 37, 0, 1], [37, 15, 0, 1], [38, 20, 1, 0], [39, 36, 0, 1], 78 | [40, 12, 1, 0], [41, 33, 1, 0], [42, 38, 1, 0], [43, 32, 1, 0], [44, 19, 0, 1], [45, 21, 0, 1], [46, 2, 1, 0], [47, 39, 0, 1]] 79 | arr = toBit(data) 80 | size = len(arr) 81 | arr1 = [0 for i in range(size)] 82 | for i in range(size): 83 | if arr[i] == 0: 84 | arr1[table[i][1]] = table[i][2] 85 | else: 86 | arr1[table[i][1]] = table[i][3] 87 | return toBytes(arr1) 88 | 89 | def remain7(data): 90 | table = [[0, 11, 1, 0], [1, 44, 0, 1], [2, 8, 1, 0], [3, 38, 0, 1], [4, 20, 0, 1], [5, 4, 1, 0], [6, 9, 0, 1], [7, 23, 0, 1], 91 | [8, 1, 1, 0], [9, 25, 0, 1], [10, 29, 1, 0], [11, 47, 0, 1], [12, 5, 1, 0], [13, 45, 0, 1], [14, 43, 1, 0], [15, 35, 0, 1], 92 | [16, 7, 0, 1], [17, 40, 0, 1], [18, 31, 0, 1], [19, 21, 0, 1], [20, 24, 1, 0], [21, 32, 0, 1], [22, 54, 1, 0], [23, 30, 1, 0], 93 | [24, 14, 1, 0], [25, 13, 0, 1], [26, 17, 0, 1], [27, 28, 1, 0], [28, 36, 0, 1], [29, 55, 0, 1], [30, 22, 1, 0], [31, 42, 1, 0], 94 | [32, 27, 0, 1], [33, 51, 1, 0], [34, 49, 1, 0], [35, 46, 0, 1], [36, 53, 0, 1], [37, 15, 0, 1], [38, 16, 0, 1], [39, 26, 1, 0], 95 | [40, 12, 1, 0], [41, 18, 1, 0], [42, 50, 1, 0], [43, 34, 1, 0], [44, 19, 0, 1], [45, 41, 0, 1], [46, 2, 1, 0], [47, 39, 0, 1], 96 | [48, 3, 1, 0], [49, 10, 1, 0], [50, 52, 1, 0], [51, 0, 1, 0], [52, 6, 1, 0], [53, 33, 0, 1], [54, 37, 1, 0], [55, 48, 0, 1]] 97 | arr = toBit(data) 98 | size = len(arr) 99 | arr1 = [0 for i in range(size)] 100 | for i in range(size): 101 | if arr[i] == 0: 102 | arr1[table[i][1]] = table[i][2] 103 | else: 104 | arr1[table[i][1]] = table[i][3] 105 | return toBytes(arr1) 106 | 107 | def TenMagic16_enc(input): 108 | table = [[0, 12], [1, 62], [2, 19], [3, 48], [4, 13], [5, 40], [6, 30], [7, 49], [8, 31], [9, 24], [10, 45], 109 | [11, 61], [12, 51], [13, 4], [14, 28], [15, 3], [16, 7], [17, 58], [18, 53], [19, 1], [20, 36], 110 | [21, 21], [22, 22], [23, 39], [24, 54], [25, 25], [26, 26], [27, 6], [28, 52], [29, 10], [30, 5], 111 | [31, 50], [32, 8], [33, 46], [34, 17], [35, 16], [36, 9], [37, 37], [38, 38], [39, 57], [40, 20], 112 | [41, 41], [42, 42], [43, 23], [44, 11], [45, 34], [46, 29], [47, 44], [48, 15], [49, 14], [50, 2], 113 | [51, 60], [52, 47], [53, 43], [54, 18], [55, 35], [56, 32], [57, 27], [58, 33], [59, 55], [60, 63], 114 | [61, 56], [62, 59], [63, 0]] 115 | arr = input 116 | arr1 = [0 for i in range(len(arr))] 117 | for i in range(len(table)): 118 | arr1[table[i][1]] = arr[table[i][0]] 119 | return toBytes(arr1) 120 | 121 | 122 | def TenMagic16(data, data_len): 123 | print("TenMagic16") 124 | key = "7d0069660c9b5d32074facf37c3738a1" 125 | 126 | split_num = data_len // 8 127 | remain = data_len % 8 128 | result = b"" 129 | for i in range(split_num): 130 | data_bit = toBit(data[8*i : 8*i + 8]) 131 | result += TenMagic16_enc(data_bit) 132 | switcher = { 133 | 1: remain1, 134 | 2: remain2, 135 | 3: remain3, 136 | 4: remain4, 137 | 5: remain5, 138 | 6: remain6, 139 | 7: remain7 140 | } 141 | if remain != 0: 142 | result += switcher[remain](data[split_num*8:]) 143 | 144 | return result -------------------------------------------------------------------------------- /sign/TenMagic32.py: -------------------------------------------------------------------------------- 1 | from Utils import * 2 | def remain1(data): 3 | table = [[0, 6, 0, 1], [1, 4, 1, 0], [2, 5, 0, 1], [3, 0, 0, 1], [4, 2, 0, 1], [5, 3, 0, 1], [6, 1, 1, 0], 4 | [7, 7, 0, 1]] 5 | arr = toBit(data) 6 | size = len(arr) 7 | arr1 = [0 for i in range(size)] 8 | for i in range(size): 9 | if arr[i] == 0: 10 | arr1[table[i][1]] = table[i][2] 11 | else: 12 | arr1[table[i][1]] = table[i][3] 13 | return toBytes(arr1) 14 | 15 | def remain2(data): 16 | table = [[0, 5, 0, 1], [1, 9, 0, 1], [2, 0, 1, 0], [3, 7, 1, 0], [4, 10, 0, 1], [5, 6, 0, 1], [6, 13, 1, 0], [7, 1, 0, 1], 17 | [8, 4, 0, 1], [9, 11, 0, 1], [10, 14, 1, 0], [11, 3, 1, 0], [12, 12, 0, 1], [13, 15, 1, 0], [14, 8, 0, 1], [15, 2, 0, 1]] 18 | arr = toBit(data) 19 | size = len(arr) 20 | arr1 = [0 for i in range(size)] 21 | for i in range(size): 22 | if arr[i] == 0: 23 | arr1[table[i][1]] = table[i][2] 24 | else: 25 | arr1[table[i][1]] = table[i][3] 26 | return toBytes(arr1) 27 | 28 | def remain3(data): 29 | table = [[0, 17, 0, 1], [1, 7, 0, 1], [2, 5, 0, 1], [3, 19, 1, 0], [4, 18, 0, 1], [5, 15, 1, 0], [6, 22, 0, 1], [7, 21, 0, 1], 30 | [8, 16, 0, 1], [9, 4, 0, 1], [10, 12, 0, 1], [11, 2, 1, 0], [12, 10, 1, 0], [13, 13, 1, 0], [14, 20, 1, 0], [15, 8, 1, 0], 31 | [16, 9, 0, 1], [17, 23, 0, 1], [18, 11, 1, 0], [19, 6, 0, 1], [20, 1, 0, 1], [21, 3, 1, 0], [22, 0, 1, 0], [23, 14, 0, 1]] 32 | arr = toBit(data) 33 | size = len(arr) 34 | arr1 = [0 for i in range(size)] 35 | for i in range(size): 36 | if arr[i] == 0: 37 | arr1[table[i][1]] = table[i][2] 38 | else: 39 | arr1[table[i][1]] = table[i][3] 40 | return toBytes(arr1) 41 | 42 | def remain4(data): 43 | table = [[0, 25, 1, 0], [1, 4, 0, 1], [2, 29, 0, 1], [3, 1, 0, 1], [4, 27, 1, 0], [5, 18, 1, 0], [6, 23, 1, 0], [7, 14, 1, 0], 44 | [8, 28, 1, 0], [9, 11, 0, 1], [10, 9, 1, 0], [11, 13, 0, 1], [12, 24, 1, 0], [13, 0, 1, 0], [14, 5, 0, 1], [15, 2, 1, 0], 45 | [16, 26, 0, 1], [17, 12, 0, 1], [18, 31, 1, 0], [19, 16, 1, 0], [20, 30, 0, 1], [21, 15, 0, 1], [22, 10, 0, 1], [23, 22, 1, 0], 46 | [24, 7, 1, 0], [25, 21, 0, 1], [26, 6, 1, 0], [27, 3, 1, 0], [28, 8, 1, 0], [29, 20, 0, 1], [30, 19, 1, 0], [31, 17, 0, 1]] 47 | arr = toBit(data) 48 | size = len(arr) 49 | arr1 = [0 for i in range(size)] 50 | for i in range(size): 51 | if arr[i] == 0: 52 | arr1[table[i][1]] = table[i][2] 53 | else: 54 | arr1[table[i][1]] = table[i][3] 55 | return toBytes(arr1) 56 | 57 | def remain5(data): 58 | table = [[0, 11, 0, 1], [1, 12, 0, 1], [2, 28, 1, 0], [3, 30, 0, 1], [4, 13, 1, 0], [5, 24, 0, 1], [6, 22, 1, 0], [7, 25, 1, 0], 59 | [8, 23, 1, 0], [9, 3, 0, 1], [10, 16, 0, 1], [11, 8, 1, 0], [12, 34, 0, 1], [13, 2, 0, 1], [14, 5, 0, 1], [15, 7, 1, 0], 60 | [16, 4, 0, 1], [17, 14, 0, 1], [18, 39, 1, 0], [19, 33, 0, 1], [20, 15, 0, 1], [21, 0, 0, 1], [22, 31, 0, 1], [23, 9, 1, 0], 61 | [24, 29, 0, 1], [25, 26, 1, 0], [26, 19, 0, 1], [27, 6, 1, 0], [28, 27, 1, 0], [29, 10, 1, 0], [30, 37, 0, 1], [31, 38, 1, 0], 62 | [32, 20, 0, 1], [33, 21, 1, 0], [34, 1, 0, 1], [35, 36, 0, 1], [36, 32, 0, 1], [37, 17, 0, 1], [38, 18, 0, 1], [39, 35, 1, 0]] 63 | arr = toBit(data) 64 | size = len(arr) 65 | arr1 = [0 for i in range(size)] 66 | for i in range(size): 67 | if arr[i] == 0: 68 | arr1[table[i][1]] = table[i][2] 69 | else: 70 | arr1[table[i][1]] = table[i][3] 71 | return toBytes(arr1) 72 | 73 | def remain6(data): 74 | table = [[0, 11, 0, 1], [1, 45, 0, 1], [2, 15, 1, 0], [3, 22, 0, 1], [4, 10, 0, 1], [5, 7, 0, 1], [6, 3, 0, 1], [7, 42, 0, 1], 75 | [8, 17, 1, 0], [9, 21, 0, 1], [10, 4, 0, 1], [11, 8, 1, 0], [12, 19, 1, 0], [13, 32, 0, 1], [14, 28, 1, 0], [15, 31, 1, 0], 76 | [16, 29, 0, 1], [17, 14, 1, 0], [18, 39, 1, 0], [19, 27, 1, 0], [20, 2, 1, 0], [21, 24, 0, 1], [22, 26, 1, 0], [23, 9, 1, 0], 77 | [24, 41, 0, 1], [25, 1, 1, 0], [26, 47, 0, 1], [27, 44, 0, 1], [28, 23, 1, 0], [29, 0, 1, 0], [30, 12, 1, 0], [31, 18, 0, 1], 78 | [32, 33, 0, 1], [33, 36, 0, 1], [34, 40, 1, 0], [35, 34, 0, 1], [36, 25, 0, 1], [37, 16, 1, 0], [38, 5, 1, 0], [39, 35, 0, 1], 79 | [40, 38, 0, 1], [41, 37, 1, 0], [42, 13, 0, 1], [43, 20, 1, 0], [44, 6, 0, 1], [45, 43, 0, 1], [46, 30, 0, 1], [47, 46, 1, 0]] 80 | arr = toBit(data) 81 | size = len(arr) 82 | arr1 = [0 for i in range(size)] 83 | for i in range(size): 84 | if arr[i] == 0: 85 | arr1[table[i][1]] = table[i][2] 86 | else: 87 | arr1[table[i][1]] = table[i][3] 88 | return toBytes(arr1) 89 | 90 | def remain7(data): 91 | table = [[0, 7, 1, 0], [1, 9, 0, 1], [2, 53, 1, 0], [3, 19, 1, 0], [4, 15, 1, 0], [5, 8, 0, 1], [6, 3, 0, 1], [7, 24, 1, 0], 92 | [8, 18, 0, 1], [9, 51, 0, 1], [10, 42, 1, 0], [11, 39, 0, 1], [12, 20, 0, 1], [13, 12, 0, 1], [14, 28, 1, 0], [15, 27, 1, 0], 93 | [16, 23, 0, 1], [17, 49, 0, 1], [18, 10, 1, 0], [19, 55, 1, 0], [20, 52, 1, 0], [21, 17, 0, 1], [22, 48, 0, 1], [23, 14, 1, 0], 94 | [24, 33, 0, 1], [25, 25, 1, 0], [26, 4, 1, 0], [27, 11, 0, 1], [28, 47, 1, 0], [29, 0, 0, 1], [30, 21, 1, 0], [31, 44, 0, 1], 95 | [32, 16, 0, 1], [33, 41, 0, 1], [34, 29, 0, 1], [35, 1, 0, 1], [36, 46, 0, 1], [37, 5, 0, 1], [38, 30, 0, 1], [39, 45, 0, 1], 96 | [40, 31, 1, 0], [41, 43, 1, 0], [42, 36, 1, 0], [43, 26, 0, 1], [44, 34, 0, 1], [45, 2, 0, 1], [46, 6, 0, 1], [47, 50, 1, 0], 97 | [48, 13, 1, 0], [49, 37, 1, 0], [50, 32, 0, 1], [51, 40, 0, 1], [52, 35, 0, 1], [53, 38, 0, 1], [54, 54, 0, 1], [55, 22, 0, 1]] 98 | arr = toBit(data) 99 | size = len(arr) 100 | arr1 = [0 for i in range(size)] 101 | for i in range(size): 102 | if arr[i] == 0: 103 | arr1[table[i][1]] = table[i][2] 104 | else: 105 | arr1[table[i][1]] = table[i][3] 106 | return toBytes(arr1) 107 | 108 | def TenMagic32_enc(input): 109 | table = [[0, 0], [1, 4], [2, 61], [3, 15], [4, 56], [5, 40], [6, 6], [7, 59], [8, 62], [9, 58], [10, 17], [11, 2], 110 | [12, 12], [13, 8], [14, 32], [15, 60], [16, 13], [17, 45], [18, 34], [19, 14], [20, 36], [21, 21], 111 | [22, 22], [23, 39], [24, 23], [25, 25], [26, 26], [27, 20], [28, 1], [29, 33], [30, 46], [31, 55], 112 | [32, 35], [33, 24], [34, 57], [35, 19], [36, 53], [37, 37], [38, 38], [39, 5], [40, 30], [41, 41], 113 | [42, 42], [43, 18], [44, 47], [45, 27], [46, 9], [47, 44], [48, 51], [49, 7], [50, 49], [51, 63], [52, 28], 114 | [53, 43], [54, 54], [55, 52], [56, 31], [57, 10], [58, 29], [59, 11], [60, 3], [61, 16], [62, 50], 115 | [63, 48]] 116 | arr = input 117 | arr1 = [0 for i in range(len(arr))] 118 | for i in range(len(table)): 119 | arr1[table[i][1]] = arr[table[i][0]] 120 | return toBytes(arr1) 121 | 122 | 123 | def TenMagic32(data, data_len): 124 | print("TenMagic32") 125 | key = "44e715a6e322ccb7d028f7a42fa55040" 126 | split_num = data_len // 8 127 | remain = data_len % 8 128 | result = b"" 129 | for i in range(split_num): 130 | data_bit = toBit(data[8*i : 8*i + 8]) 131 | result += TenMagic32_enc(data_bit) 132 | switcher = { 133 | 1: remain1, 134 | 2: remain2, 135 | 3: remain3, 136 | 4: remain4, 137 | 5: remain5, 138 | 6: remain6, 139 | 7: remain7 140 | } 141 | if remain != 0: 142 | result += switcher[remain](data[split_num*8:]) 143 | 144 | return result -------------------------------------------------------------------------------- /sign/TenSeattos.py: -------------------------------------------------------------------------------- 1 | from Utils import * 2 | def TenSeattos(data, data_len): 3 | print("TenSeattos") 4 | key = "80306f4370b39fd5630ad0529f77adb6" 5 | meta_data = [0x37, 0x92, 0x44, 0x68, 0xA5, 0x3D, 0xCC, 0x7F, 0xBB, 0x0F, 0xD9, 0x88, 0xEE, 0x9A, 0xE9, 0x5A] 6 | arr = [0] * data_len 7 | for i in range(data_len): 8 | arr[i] = ord(data[i]) 9 | arr[i] ^= ord(key[i&7]) ^ meta_data[i&0xf] 10 | arr[i] += meta_data[i&0xf] 11 | arr[i] &= 0xff 12 | arr[i] ^= meta_data[i&0xf] 13 | arr[i] ^= ord(key[i&7]) 14 | return bytes(arr) -------------------------------------------------------------------------------- /sign/Utils.py: -------------------------------------------------------------------------------- 1 | from hashlib import md5 2 | import base64 3 | 4 | def toBit(data): 5 | data_bit = [] 6 | for i in range(len(data)): 7 | xor_data = 0x80 8 | for j in range(8): 9 | data_bit.append(0 if (ord(data[i]) & xor_data) == 0 else 1) 10 | xor_data >>= 1 11 | return data_bit 12 | 13 | def toBytes(data): 14 | arr1 = [] 15 | for i in range(0, len(data), 8): 16 | tmp = 0 17 | for j in range(8): 18 | tmp <<= 1 19 | tmp |= data[i+j] 20 | arr1.append(tmp) 21 | return bytes(arr1) 22 | 23 | def hash(data): 24 | md = md5() 25 | md.update(base64.b64encode(data)) 26 | return md.hexdigest() -------------------------------------------------------------------------------- /sign/__pycache__/TenMagic16.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n1ptune/jdSign/a76cba777a2ef5a2c6d0d7d0227f067bbbd4b1db/sign/__pycache__/TenMagic16.cpython-310.pyc -------------------------------------------------------------------------------- /sign/__pycache__/TenMagic32.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n1ptune/jdSign/a76cba777a2ef5a2c6d0d7d0227f067bbbd4b1db/sign/__pycache__/TenMagic32.cpython-310.pyc -------------------------------------------------------------------------------- /sign/__pycache__/TenSeattos.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n1ptune/jdSign/a76cba777a2ef5a2c6d0d7d0227f067bbbd4b1db/sign/__pycache__/TenSeattos.cpython-310.pyc -------------------------------------------------------------------------------- /sign/__pycache__/Utils.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n1ptune/jdSign/a76cba777a2ef5a2c6d0d7d0227f067bbbd4b1db/sign/__pycache__/Utils.cpython-310.pyc -------------------------------------------------------------------------------- /sign/__pycache__/__init__.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n1ptune/jdSign/a76cba777a2ef5a2c6d0d7d0227f067bbbd4b1db/sign/__pycache__/__init__.cpython-310.pyc -------------------------------------------------------------------------------- /sign/__pycache__/jdSign.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/n1ptune/jdSign/a76cba777a2ef5a2c6d0d7d0227f067bbbd4b1db/sign/__pycache__/jdSign.cpython-310.pyc -------------------------------------------------------------------------------- /sign/jdSign.py: -------------------------------------------------------------------------------- 1 | from random import randint 2 | import time 3 | 4 | 5 | from Utils import * 6 | from TenMagic32 import TenMagic32 7 | from TenMagic16 import TenMagic16 8 | from TenSeattos import TenSeattos 9 | 10 | 11 | def encrypt(data, data_len, encryptId, offset): 12 | encryptType = [0, 1, 2][offset:] + [0, 1, 2][0:offset] 13 | encrypt = encryptType[encryptId] 14 | switcher = { 15 | 0: TenMagic32, 16 | 1: TenMagic16, 17 | 2: TenSeattos 18 | } 19 | 20 | return switcher[encrypt](data, data_len) 21 | 22 | def getSign(functionId, body, uuid, client, clientVersion): 23 | t = time.time() 24 | st = str(int(round(t * 1000))) 25 | encryptId = randint(0, 2) 26 | offset = randint(0, 2) 27 | sv = "1" + str(offset) + str(encryptId) 28 | data = "&".join(("functionId="+functionId, "body="+body, "uuid="+uuid, "client="+client, "clientVersion="+clientVersion, "st="+st, "sv="+sv)) 29 | sign = hash(encrypt(data, len(data), encryptId, offset)) 30 | print("st=" + st + "&sign=" + sign + "&sv=" + sv) 31 | return sign 32 | 33 | def getSignWithstv(functionId, body, uuid, client, clientVersion): 34 | t = time.time() 35 | st = str(int(round(t * 1000))) 36 | encryptId = randint(0, 2) 37 | offset = randint(0, 2) 38 | sv = "1" + str(offset) + str(encryptId) 39 | data = "&".join(("functionId="+functionId, "body="+body, "uuid="+uuid, "client="+client, "clientVersion="+clientVersion, "st="+st, "sv="+sv)) 40 | sign = hash(encrypt(data, len(data), encryptId, offset)) 41 | print("st=" + st + "&sign=" + sign + "&sv=" + sv) 42 | return "st=" + st + "&sign=" + sign + "&sv=" + sv 43 | #test 44 | ''' 45 | def main(): 46 | functionId = "switchQuery" 47 | clientVersion = "11.8.3" 48 | client = "android" 49 | uuid = "YWC5Y2HuDNOnEWY0DWC0ZG==" 50 | body = "aaaa" 51 | Sign(functionId, body, uuid, client, clientVersion) 52 | if __name__ == "__main__": 53 | main() 54 | ''' -------------------------------------------------------------------------------- /sign/test.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from urllib.parse import urlencode 3 | 4 | from jdSign import getSignWithstv 5 | base_url = "https://api.m.jd.com/client.action?" 6 | 7 | QueryString = { 8 | "functionId" : "device", 9 | "lmt" : "0", 10 | "clientVersion" : "12.0.1", 11 | "build" : "98778", 12 | "client" : "android", 13 | "partner" : "oppo", 14 | "sdkVersion" : "28", 15 | "lang" : "zh_CN", 16 | "harmonyOs" : "0", 17 | "networkType" :"wifi", 18 | "uemps" : "2-2-2", 19 | "ext" : '{"prstate":"0","pvcStu":"1","cfgExt":"{\"privacyOffline\":\"0\"}"}', 20 | "avifSupport" : "1", 21 | "eid" : "", 22 | "ef" : "1", 23 | "ep" : '' 24 | } 25 | 26 | uuid = "ac9cdd4119f45c4e" 27 | body = { 28 | "brand":"OnePlus", 29 | "clientVersion":"12.0.1", 30 | "model":"ONEPLUS A6000", 31 | "nettype":"WIFI", 32 | "osVersion":"9", 33 | "partner":"oppo", 34 | "platform":"100", 35 | "screen":"2075*1080", 36 | "uuid": uuid 37 | } 38 | post_data = { 39 | "lmt" : "0", 40 | "body" : str(body) 41 | } 42 | def parse_url(inData : dict): 43 | return base_url + urlencode(inData) + "&" + getSignWithstv(inData["functionId"], post_data["body"], body["uuid"], inData["client"], inData["clientVersion"]) 44 | 45 | url = parse_url(QueryString) 46 | r = requests.post(url, data = post_data) 47 | print(r.text) 48 | 49 | 50 | --------------------------------------------------------------------------------