Add files via upload
This commit is contained in:
parent
634b353ebb
commit
a617f59a99
BIN
bin/PPLcontrol.exe
Normal file
BIN
bin/PPLcontrol.exe
Normal file
Binary file not shown.
BIN
bin/pssuspend64.exe
Normal file
BIN
bin/pssuspend64.exe
Normal file
Binary file not shown.
BIN
drivers/RTCore/RTCore64.sys
Normal file
BIN
drivers/RTCore/RTCore64.sys
Normal file
Binary file not shown.
4
drivers/RTCore/install.cmd
Normal file
4
drivers/RTCore/install.cmd
Normal file
@ -0,0 +1,4 @@
|
||||
copy "%~dp0RTCore64.sys" %systemdrive%\RTCore64.sys
|
||||
sc.exe create RTCore64 type= kernel start= auto binPath= %systemdrive%\RTCore64.sys DisplayName= "Micro - Star MSI Afterburner"
|
||||
net.exe start RTCore64
|
||||
pause
|
4
drivers/RTCore/remove.cmd
Normal file
4
drivers/RTCore/remove.cmd
Normal file
@ -0,0 +1,4 @@
|
||||
net.exe stop RTCore64
|
||||
sc.exe delete RTCore64
|
||||
del %systemdrive%\RTCore64.sys
|
||||
pause
|
BIN
drivers/StartSuspended/StartSuspended.sys
Normal file
BIN
drivers/StartSuspended/StartSuspended.sys
Normal file
Binary file not shown.
5
drivers/StartSuspended/install.cmd
Normal file
5
drivers/StartSuspended/install.cmd
Normal file
@ -0,0 +1,5 @@
|
||||
copy "%~dp0StartSuspended.sys" %systemdrive%\StartSuspended.sys
|
||||
sc.exe create StartSuspended type= kernel start= auto binPath= %systemdrive%\StartSuspended.sys
|
||||
reg.exe add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\StartSuspended /v Target /t REG_SZ /d sppsvc.exe /f
|
||||
net.exe start StartSuspended
|
||||
pause
|
4
drivers/StartSuspended/remove.cmd
Normal file
4
drivers/StartSuspended/remove.cmd
Normal file
@ -0,0 +1,4 @@
|
||||
net.exe stop RTCore64
|
||||
sc.exe delete RTCore64
|
||||
del %systemdrive%\RTCore64.sys
|
||||
pause
|
49
keyderiv.py
Normal file
49
keyderiv.py
Normal file
@ -0,0 +1,49 @@
|
||||
import re
|
||||
import json
|
||||
import sys
|
||||
|
||||
"""
|
||||
Set all following breakpoints on sppsvc.exe in x64dbg with Break Condition 0, Command Condition 1, and the associated Command Text:
|
||||
|
||||
For prod key, works on 19041.1266 -> 19044.3803
|
||||
|
||||
`sppsvc+1957F4` - `log "MODULUS {mem;0x80@rdx}"`
|
||||
`sppsvc+195A80` - `log "MUL F1 {mem;0x80@rdx}"; log "MUL F2 {mem;0x80@r8}"`
|
||||
`sppsvc+1A36F1` - `log "MUL PROD {mem;0x80@rbx}"`
|
||||
`sppsvc+198CEC` - `log "MPMUL F1 {mem;0x80@[[arg.get(2)]-[[sppsvc+0x440198]]]}"; log "MPMUL F2 {mem;0x80@[[arg.get(3)]-[[sppsvc+0x440198]]]}"`
|
||||
`sppsvc+199E07` - `log "MPMUL PROD {mem;0x80@[rax-[[sppsvc+0x440198]]]}"`
|
||||
`sppsvc+19561C` - `log "LAST MPMODMUL"`
|
||||
|
||||
For test key, works on 20221.1000
|
||||
|
||||
`sppsvc+1DD940` - `log "MODULUS {mem;0x80@rdx}"`
|
||||
`sppsvc+1DDFF0` - `log "MUL F1 {mem;0x80@rdx}"; log "MUL F2 {mem;0x80@r8}"`
|
||||
`sppsvc+1DD8B1` - `log "MUL PROD {mem;0x80@rdi}"`
|
||||
`sppsvc+1D2050` - `log "MPMUL F1 {mem;0x80@[[arg.get(2)]-[[sppsvc+0x483178]]]}"; log "MPMUL F2 {mem;0x80@[[arg.get(3)]-[[sppsvc+0x483178]]]}"`
|
||||
`sppsvc+1D30F4` - `log "MPMUL PROD {mem;0x80@[[rbp-0x69]-[[sppsvc+0x483178]]]}"`
|
||||
`sppsvc+1CEDE2` - `log "LAST MPMODMUL"`
|
||||
|
||||
Right-click in Log tab, select "Redirect Log File" and choose path before unsuspending, once LAST MPMODMUL is shown then save log file and use with this script.
|
||||
"""
|
||||
|
||||
pows = {}
|
||||
|
||||
mul_log = open(sys.argv[1], "r").read()
|
||||
|
||||
muls = re.finditer(r"\s*(?:MPMUL|MUL) F1 (\w+)\s*(?:MPMUL|MUL) F2 (\w+)\s*(?:MPMUL|MUL) PROD (\w+)\s*", mul_log, re.DOTALL | re.MULTILINE)
|
||||
fs_mul = muls.__next__()
|
||||
|
||||
assert fs_mul[1] == fs_mul[2]
|
||||
|
||||
pows[fs_mul[1]] = 1
|
||||
pows[fs_mul[3]] = 2
|
||||
|
||||
last_pow = 0
|
||||
|
||||
for mul in muls:
|
||||
print(mul[1][:8], mul[2][:8], mul[3][:8])
|
||||
pows[mul[3]] = pows[mul[1]] + pows[mul[2]]
|
||||
|
||||
last_pow = pows[mul[3]]
|
||||
|
||||
print("Derived private key: ", hex(last_pow))
|
16
splog.py
Normal file
16
splog.py
Normal file
@ -0,0 +1,16 @@
|
||||
# Decrypt C:\Windows\System32\spsys.log from Windows 7
|
||||
# Can be used to trace functions executed in spsys
|
||||
|
||||
from Crypto.Cipher import AES
|
||||
from struct import unpack
|
||||
|
||||
aeskey = bytes([0x5B, 0x68, 0x49, 0x25, 0x79, 0x7B, 0x81, 0xFE, 0x5C, 0x44, 0x1B, 0x08, 0x2B, 0xEA, 0xEC, 0x4E])
|
||||
|
||||
log_data = b""
|
||||
|
||||
with open("spsys.log", "rb") as f:
|
||||
aes = AES.new(aeskey, AES.MODE_ECB)
|
||||
log_data = aes.decrypt(f.read()[0x28:])
|
||||
|
||||
with open("spsys_log_d.bin", "wb") as f:
|
||||
f.write(log_data)
|
15
spp_prod.pem
Normal file
15
spp_prod.pem
Normal file
@ -0,0 +1,15 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIICXQIBAAKBgQDXsWBAi5fZLtghWfw8h436oA2jj9NRtXwIflPNtfCZajhZUjie
|
||||
lWojg02FFWw/QgKAymqXWOACbvl1kME9PNFMKP42LQNci+TpaGWj8KUr9+llQ7c5
|
||||
FD1WYETdxd5BAB6GBWVRQjM6YbgR4/WL3U8IZ/k7sjhrJhLYV5BSP7qHKQIDAQAB
|
||||
AoGBAL84RIHUf9GOYxPmR+WNs4RuosjPuGOnBogtHrSvyNbpwX0GlKWbBxbm0DHd
|
||||
FTNbnQZ67Vax9x6RLd1ZcMeOhGljjawdN1J69svKdGEfLgk6ZjwY/IK1R+lhcNm6
|
||||
6wq7lGZubHks+v4bfoIgNU6PSyrVguMUKyCIZI9UmNLXISbVAkEA2BvXsM7ByJx1
|
||||
3UgjmQIIoYJLihaJxxR7VIXZG7k4Q5IE89tSUxNqgPr/KF5MlOBc4U1a3LfkV7E8
|
||||
zFC1YG4KKwJBAP+B4YPO+6233rd/Ua73QyXVAAp1rY/ZD/LYnfV/x5tew6HutDIK
|
||||
DeDwQ+FAnpbOH6e6MzBEaSn2SxinRy6nLfsCQAK15rCrBzcy7y+FVhz3L5CHB9eF
|
||||
jNjYYuueeiik3BXM4Q8F8zRji/RuMYEaHa/IWKHizH70N4L6EB8n6/53ot0CQFhQ
|
||||
EB564Eq/Dt/lxdnv5OmioYz7962MnRKXBKHiNJ/jNUM3OllBWGKzKQMmTqpZPF/A
|
||||
4AiC3MaANpyi1NuvNRkCQQCr+LBFMuA05e901DwL24dMQsHsd3IDaXaf+ZBImg+M
|
||||
60aHSrllG6RLV/Sk5lgKWCUvrIJ97Yza156wV/7U4VFj
|
||||
-----END RSA PRIVATE KEY-----
|
15
spp_test.pem
Normal file
15
spp_test.pem
Normal file
@ -0,0 +1,15 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIICXQIBAAKBgQD2nHchRdHpsxBrJhmBFbOxIa8tw+JXQb42rnz4cOYjaFEGeM7Q
|
||||
wydMfOOumFxQ/Jg9yl64N9mVduFpvcGzZdbz2/Td5ZDTnJ3PHo6178NgkmdyUzo3
|
||||
nv06m1+zgHrZ6Qi3thRXP+1RND1tqzUWDBYeP9ETxGYX1GfdNlTduHe+DwIDAQAB
|
||||
AoGBAPFt/LL2R6sjQs+jXRSiymh/MaD8RHpoQnAGIxKWdLf1SF2tp8t5Qt/+5Gfp
|
||||
gXdH00Oq+1AeXUWWPNfojdmzudrXYgAv750Vf5TdPMb9gPZZkc1d5ksw3n3h103V
|
||||
0Wp0fX3sJavF5WiEN8GeByr+4c+naeQQm8+jacHQMmjTEWgBAkEA/CnRmlNCe7lF
|
||||
BiDMrFCHBHWa7bJRkZWoZhwOCYIEk2Sfrl1+WMWFMF7UkANtCU8ZECQH+4bbK7xh
|
||||
Mh2deLbd4QJBAPpdBVPcGDHCiPWAiSSEpVrXADEacJ8MuzE4ux48oXj6E8c4mmu/
|
||||
S+mxoZLsa9PeEo5QLSGcVMsrhwVpdRZHue8CQDaHZIgW0R2oJsD4fsoUb94LAIG+
|
||||
Od1dm5jZID/2Gb8110IBfbz8mZyoJRcvZnjI3gabhA5kTyjaB7qqpM7h3IECQQC+
|
||||
ooHh/t71VLlQplTG17HI35knyogis2D988KXHXeeVF0m/vSmQn0dLsJmy1q3cosS
|
||||
jf4vb4gpQ7WF62zaUDdFAkBv/Lk1yuGX2Yx1f6a+BK4tC/EfJSTi2ojyvSH6IjgI
|
||||
2eXEW4fB1vpiz0cf7maWHO2iPSFducHYF7OkuC//SJ+B
|
||||
-----END RSA PRIVATE KEY-----
|
BIN
sppdebug.reg
Normal file
BIN
sppdebug.reg
Normal file
Binary file not shown.
219
tokens_rebuild_v2.py
Normal file
219
tokens_rebuild_v2.py
Normal file
@ -0,0 +1,219 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import struct
|
||||
import sys
|
||||
import os
|
||||
import hashlib
|
||||
|
||||
TOKENS_VERSION = 3
|
||||
|
||||
BLOCK_SIZE = 16384
|
||||
ENTRY_SIZE = 158
|
||||
MAX_ENTRIES = (BLOCK_SIZE - 8) // ENTRY_SIZE
|
||||
|
||||
ENTRY_CONTENTS_HEADER = b'\x55' * 32
|
||||
ENTRY_CONTENTS_FOOTER = b'\xAA' * 32
|
||||
|
||||
def parse_entry(f, offset):
|
||||
f.seek(offset)
|
||||
unpacked = struct.unpack('<lllll', f.read(20))
|
||||
|
||||
if unpacked[0] != offset or unpacked[1] == 0 or unpacked[2] == 0:
|
||||
return None
|
||||
|
||||
(name_b, ext_b) = struct.unpack('<130s8s', f.read(138))
|
||||
|
||||
name = (
|
||||
name_b.decode('utf-16-le').rstrip('\0'),
|
||||
ext_b.decode('utf-16-le').rstrip('\0')
|
||||
)
|
||||
|
||||
return (unpacked[2], unpacked[3], name)
|
||||
|
||||
|
||||
def parse_block_entries(f, offset):
|
||||
o_entry = offset + ((MAX_ENTRIES - 1) * ENTRY_SIZE)
|
||||
entries = []
|
||||
|
||||
for i in range(MAX_ENTRIES):
|
||||
entry = parse_entry(f, o_entry)
|
||||
o_entry -= ENTRY_SIZE
|
||||
|
||||
if entry != None:
|
||||
entries.append(entry)
|
||||
|
||||
return entries
|
||||
|
||||
|
||||
def parse_block(f, offset):
|
||||
f.seek(offset)
|
||||
unpacked = struct.unpack('<ll', f.read(8))
|
||||
|
||||
if unpacked[0] != offset:
|
||||
return None
|
||||
|
||||
entries = parse_block_entries(f, f.tell())
|
||||
return (entries, unpacked[1])
|
||||
|
||||
|
||||
def get_token(f, entry):
|
||||
(offset, length, name) = entry
|
||||
f.seek(offset)
|
||||
|
||||
if f.read(32) != ENTRY_CONTENTS_HEADER:
|
||||
return None
|
||||
|
||||
(h_len, h_sha256) = struct.unpack('<l32s', f.read(36))
|
||||
|
||||
if length != h_len:
|
||||
return None
|
||||
|
||||
contents = f.read(h_len)
|
||||
|
||||
if f.read(32) != ENTRY_CONTENTS_FOOTER:
|
||||
return None
|
||||
|
||||
return (name, contents)
|
||||
|
||||
|
||||
def get_tokens(f):
|
||||
f.seek(0)
|
||||
|
||||
if struct.unpack('<l32xl', f.read(40)) != (TOKENS_VERSION, 36):
|
||||
return None
|
||||
|
||||
offset = 36
|
||||
all_entries = []
|
||||
|
||||
while offset != 0:
|
||||
(entries, offset) = parse_block(f, offset)
|
||||
all_entries += entries
|
||||
|
||||
tokens = []
|
||||
|
||||
for entry in all_entries:
|
||||
token = get_token(f, entry)
|
||||
if token != None:
|
||||
tokens.append(token)
|
||||
|
||||
return tokens
|
||||
|
||||
|
||||
def build_entry_value(data):
|
||||
d_len = len(data).to_bytes(4, "little")
|
||||
d_sha256 = hashlib.sha256(data).digest()
|
||||
|
||||
value = ENTRY_CONTENTS_HEADER
|
||||
value += d_len
|
||||
value += d_sha256
|
||||
value += data
|
||||
value += ENTRY_CONTENTS_FOOTER
|
||||
|
||||
return (value, len(value))
|
||||
|
||||
|
||||
def build_entry_meta(o_meta, populated, o_value, vd_len, name):
|
||||
return struct.pack(
|
||||
"<IIIII130s8s",
|
||||
o_meta,
|
||||
populated,
|
||||
o_value,
|
||||
vd_len,
|
||||
vd_len,
|
||||
name[0].encode('utf-16-le'),
|
||||
name[1].encode('utf-16-le')
|
||||
)
|
||||
|
||||
|
||||
def build_entry(o_meta, o_value, entry):
|
||||
value, v_len = build_entry_value(entry[1])
|
||||
|
||||
vd_len = len(entry[1])
|
||||
meta = build_entry_meta(o_meta, True, o_value, vd_len, entry[0])
|
||||
|
||||
return (value, v_len, meta)
|
||||
|
||||
|
||||
def build_entries_block(entries, o_start):
|
||||
meta_block = b''
|
||||
data_block = b''
|
||||
|
||||
o_meta = o_start + 8 + ((MAX_ENTRIES - 1) * ENTRY_SIZE)
|
||||
o_data = o_start + BLOCK_SIZE + 32
|
||||
|
||||
next_block = 0
|
||||
write_entries = len(entries)
|
||||
write_next_block_offset = False
|
||||
|
||||
if len(entries) > MAX_ENTRIES:
|
||||
write_entries = MAX_ENTRIES
|
||||
write_next_block_offset = True
|
||||
|
||||
for _ in range(write_entries):
|
||||
data, data_len, meta = build_entry(o_meta, o_data, entries.pop(0))
|
||||
|
||||
meta_block = meta + meta_block
|
||||
o_meta -= ENTRY_SIZE
|
||||
|
||||
data_block += data
|
||||
o_data += data_len
|
||||
|
||||
for _ in range(MAX_ENTRIES - write_entries):
|
||||
meta = build_entry_meta(o_meta, False, 0, 0xFFFFFFFF, ('', ''))
|
||||
|
||||
meta_block = meta + meta_block
|
||||
o_meta -= ENTRY_SIZE
|
||||
|
||||
if write_next_block_offset:
|
||||
next_block = o_data
|
||||
|
||||
finished_block = struct.pack("<II", o_start, next_block)
|
||||
finished_block += meta_block
|
||||
finished_block += b'\0' * (BLOCK_SIZE - (MAX_ENTRIES * ENTRY_SIZE) - 8)
|
||||
finished_block += hashlib.sha256(finished_block).digest()
|
||||
finished_block += data_block
|
||||
|
||||
return (finished_block, next_block, entries)
|
||||
|
||||
|
||||
def build_tokens(entries):
|
||||
tokens_data = b''
|
||||
header = TOKENS_VERSION.to_bytes(4, "little")
|
||||
|
||||
o_next = 36
|
||||
entries_l = entries
|
||||
|
||||
while o_next != 0:
|
||||
block, o_next, entries_l = build_entries_block(entries_l, o_next)
|
||||
tokens_data += block
|
||||
|
||||
tokens_hash = hashlib.sha256(header + tokens_data).digest()
|
||||
|
||||
finished_tokens = header
|
||||
finished_tokens += tokens_hash
|
||||
finished_tokens += tokens_data
|
||||
|
||||
return finished_tokens
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) != 3:
|
||||
print(f'Usage: {sys.argv[0]} source_tokens_file destination_tokens_file')
|
||||
exit(1)
|
||||
|
||||
source = sys.argv[1]
|
||||
destination = sys.argv[2]
|
||||
|
||||
if not os.path.isfile(source):
|
||||
print(f'Source {source} is not a file')
|
||||
exit(1)
|
||||
|
||||
if os.path.isdir(destination):
|
||||
print(f'Source {source} is a directory')
|
||||
exit(1)
|
||||
|
||||
with open(source, 'rb') as f:
|
||||
tokens = get_tokens(f)
|
||||
|
||||
with open(destination, 'wb') as f:
|
||||
f.write(build_tokens(tokens))
|
55
tsdecrypt.py
Normal file
55
tsdecrypt.py
Normal file
@ -0,0 +1,55 @@
|
||||
from Crypto.PublicKey import RSA
|
||||
from Crypto.Cipher import AES, PKCS1_v1_5
|
||||
from Crypto.Signature import PKCS1_v1_5 as PKCS1_v1_5s
|
||||
from Crypto.Util.Padding import unpad
|
||||
from Crypto.Hash import SHA1, HMAC
|
||||
from sys import argv
|
||||
|
||||
SPP_PROD_KEY = """-----BEGIN RSA PRIVATE KEY-----
|
||||
MIICXQIBAAKBgQDXsWBAi5fZLtghWfw8h436oA2jj9NRtXwIflPNtfCZajhZUjie
|
||||
lWojg02FFWw/QgKAymqXWOACbvl1kME9PNFMKP42LQNci+TpaGWj8KUr9+llQ7c5
|
||||
FD1WYETdxd5BAB6GBWVRQjM6YbgR4/WL3U8IZ/k7sjhrJhLYV5BSP7qHKQIDAQAB
|
||||
AoGBAL84RIHUf9GOYxPmR+WNs4RuosjPuGOnBogtHrSvyNbpwX0GlKWbBxbm0DHd
|
||||
FTNbnQZ67Vax9x6RLd1ZcMeOhGljjawdN1J69svKdGEfLgk6ZjwY/IK1R+lhcNm6
|
||||
6wq7lGZubHks+v4bfoIgNU6PSyrVguMUKyCIZI9UmNLXISbVAkEA2BvXsM7ByJx1
|
||||
3UgjmQIIoYJLihaJxxR7VIXZG7k4Q5IE89tSUxNqgPr/KF5MlOBc4U1a3LfkV7E8
|
||||
zFC1YG4KKwJBAP+B4YPO+6233rd/Ua73QyXVAAp1rY/ZD/LYnfV/x5tew6HutDIK
|
||||
DeDwQ+FAnpbOH6e6MzBEaSn2SxinRy6nLfsCQAK15rCrBzcy7y+FVhz3L5CHB9eF
|
||||
jNjYYuueeiik3BXM4Q8F8zRji/RuMYEaHa/IWKHizH70N4L6EB8n6/53ot0CQFhQ
|
||||
EB564Eq/Dt/lxdnv5OmioYz7962MnRKXBKHiNJ/jNUM3OllBWGKzKQMmTqpZPF/A
|
||||
4AiC3MaANpyi1NuvNRkCQQCr+LBFMuA05e901DwL24dMQsHsd3IDaXaf+ZBImg+M
|
||||
60aHSrllG6RLV/Sk5lgKWCUvrIJ97Yza156wV/7U4VFj
|
||||
-----END RSA PRIVATE KEY-----"""
|
||||
|
||||
ciph = PKCS1_v1_5.new(RSA.import_key(SPP_PROD_KEY))
|
||||
sig = PKCS1_v1_5s.new(RSA.import_key(SPP_PROD_KEY))
|
||||
|
||||
f = open(argv[1], "rb")
|
||||
f.seek(0x10)
|
||||
|
||||
aesk_sig = f.read(0x80)
|
||||
|
||||
f.seek(0x90)
|
||||
aes_data = f.read(0x80)
|
||||
|
||||
if sig.verify(SHA1.new(aes_data), aesk_sig):
|
||||
aeskey = ciph.decrypt(aes_data, 0)
|
||||
aes = AES.new(aeskey, AES.MODE_CBC, b"\x00" * 16)
|
||||
|
||||
f.seek(0x110)
|
||||
decr_data = unpad(aes.decrypt(f.read()), AES.block_size)
|
||||
|
||||
hmac_key = decr_data[:0x10]
|
||||
hmac_sig = decr_data[0x10:0x24]
|
||||
ts_data = decr_data[0x28:]
|
||||
|
||||
try:
|
||||
hmac = HMAC.new(hmac_key, ts_data, SHA1)
|
||||
#hmac.verify(hmac_sig)
|
||||
|
||||
with open(argv[2], "wb") as fw:
|
||||
fw.write(ts_data)
|
||||
except ValueError:
|
||||
print("!!! BAD HMAC !!!")
|
||||
else:
|
||||
print("!!! BAD SIGNATURE !!!")
|
48
tsencrypt.py
Normal file
48
tsencrypt.py
Normal file
@ -0,0 +1,48 @@
|
||||
from Crypto.PublicKey import RSA
|
||||
from Crypto.Cipher import AES, PKCS1_v1_5
|
||||
from Crypto.Signature import PKCS1_v1_5 as PKCS1_v1_5s
|
||||
from Crypto.Util.Padding import pad
|
||||
from Crypto.Hash import SHA1, HMAC
|
||||
from Crypto.Random import get_random_bytes
|
||||
from sys import argv
|
||||
|
||||
SPP_PROD_KEY = """-----BEGIN RSA PRIVATE KEY-----
|
||||
MIICXQIBAAKBgQDXsWBAi5fZLtghWfw8h436oA2jj9NRtXwIflPNtfCZajhZUjie
|
||||
lWojg02FFWw/QgKAymqXWOACbvl1kME9PNFMKP42LQNci+TpaGWj8KUr9+llQ7c5
|
||||
FD1WYETdxd5BAB6GBWVRQjM6YbgR4/WL3U8IZ/k7sjhrJhLYV5BSP7qHKQIDAQAB
|
||||
AoGBAL84RIHUf9GOYxPmR+WNs4RuosjPuGOnBogtHrSvyNbpwX0GlKWbBxbm0DHd
|
||||
FTNbnQZ67Vax9x6RLd1ZcMeOhGljjawdN1J69svKdGEfLgk6ZjwY/IK1R+lhcNm6
|
||||
6wq7lGZubHks+v4bfoIgNU6PSyrVguMUKyCIZI9UmNLXISbVAkEA2BvXsM7ByJx1
|
||||
3UgjmQIIoYJLihaJxxR7VIXZG7k4Q5IE89tSUxNqgPr/KF5MlOBc4U1a3LfkV7E8
|
||||
zFC1YG4KKwJBAP+B4YPO+6233rd/Ua73QyXVAAp1rY/ZD/LYnfV/x5tew6HutDIK
|
||||
DeDwQ+FAnpbOH6e6MzBEaSn2SxinRy6nLfsCQAK15rCrBzcy7y+FVhz3L5CHB9eF
|
||||
jNjYYuueeiik3BXM4Q8F8zRji/RuMYEaHa/IWKHizH70N4L6EB8n6/53ot0CQFhQ
|
||||
EB564Eq/Dt/lxdnv5OmioYz7962MnRKXBKHiNJ/jNUM3OllBWGKzKQMmTqpZPF/A
|
||||
4AiC3MaANpyi1NuvNRkCQQCr+LBFMuA05e901DwL24dMQsHsd3IDaXaf+ZBImg+M
|
||||
60aHSrllG6RLV/Sk5lgKWCUvrIJ97Yza156wV/7U4VFj
|
||||
-----END RSA PRIVATE KEY-----"""
|
||||
|
||||
VERSION = 5
|
||||
|
||||
ciph = PKCS1_v1_5.new(RSA.import_key(SPP_PROD_KEY))
|
||||
sig = PKCS1_v1_5s.new(RSA.import_key(SPP_PROD_KEY))
|
||||
|
||||
f = open(argv[1], "rb")
|
||||
ts_data = f.read()
|
||||
|
||||
aeskey = b"massgrave.dev :3"
|
||||
hmackey = b"untrustedstore "
|
||||
|
||||
enc_aeskey = ciph.encrypt(aeskey)
|
||||
aeskey_sig = sig.sign(SHA1.new(enc_aeskey))
|
||||
hmac = HMAC.new(hmackey, ts_data, SHA1)
|
||||
hmac_sig = hmac.digest()
|
||||
|
||||
header = VERSION.to_bytes(4, "little") + b"UNTRUSTSTORE" + aeskey_sig + enc_aeskey
|
||||
data = hmackey + hmac_sig + b"\x00\x00\x00\x00" + ts_data
|
||||
|
||||
aes = AES.new(aeskey, AES.MODE_CBC, b"\x00" * 16)
|
||||
encr_data = aes.encrypt(pad(data, AES.block_size))
|
||||
|
||||
with open(argv[2], "wb") as g:
|
||||
g.write(header + encr_data)
|
Loading…
x
Reference in New Issue
Block a user