50 lines
1.4 KiB
Python
Executable File
50 lines
1.4 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
from functools import reduce
|
|
import xml.etree.ElementTree as ET
|
|
|
|
from base64 import b64decode
|
|
|
|
class Ticket:
|
|
@staticmethod
|
|
def get_properties(genAuth: ET.Element) -> str:
|
|
properties = genAuth.find('./{*}genuineProperties/{*}properties')
|
|
return properties.text
|
|
|
|
@staticmethod
|
|
def split_keyval(x: str) -> dict:
|
|
parameters = {}
|
|
|
|
for params in x.split(';'):
|
|
if not params or params == '\x00':
|
|
break
|
|
key_val = params.split('=')
|
|
parameters[key_val[0]] = key_val[1]
|
|
return parameters
|
|
|
|
@staticmethod
|
|
def get_hwid(genAuth: ET.Element) -> str:
|
|
props = Ticket.split_keyval(Ticket.get_properties(genAuth))
|
|
params = Ticket.split_keyval(b64decode(props['SessionId'] + '===').decode('utf-16'))
|
|
|
|
return params['Hwid']
|
|
|
|
if __name__ == '__main__':
|
|
import argparse
|
|
|
|
main_parser = argparse.ArgumentParser(
|
|
'hwid_extract',
|
|
description='Extract the binary hardware id from ticket'
|
|
)
|
|
main_parser.add_argument('input', type=argparse.FileType('rb'))
|
|
main_parser.add_argument('output', type=argparse.FileType('wb'), nargs='?')
|
|
args = main_parser.parse_args()
|
|
|
|
ticket = ET.parse(args.input).getroot()
|
|
hwid = Ticket.get_hwid(ticket)
|
|
|
|
hwid_block = b64decode(hwid + '===')
|
|
if args.output is None:
|
|
print(hwid_block)
|
|
else:
|
|
args.output.write(hwid_block) |