This repository was archived by the owner on Feb 15, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathpatchNpdm.py
More file actions
107 lines (94 loc) · 4.05 KB
/
patchNpdm.py
File metadata and controls
107 lines (94 loc) · 4.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# Original script: https://github.com/skyline-dev/skyline/blob/master/scripts/patchNpdm.py
# This script allows more SVCs to work so some games won't crash (f.e. Xenoblade Chronicles 3)
import struct, binascii
HEADER_SIZE = 0x70
PERMISSIONS_DATA = """
30 03 00 00 9C 00 00 00 80 00 00 00 AC 02 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
41 43 49 44 AC 01 00 00 00 00 00 00 01 00 00 00
00 00 01 00 00 00 00 01 FF FF FF FF FF FF FF 01
40 02 00 00 2C 00 00 00 70 02 00 00 02 00 00 00
80 02 00 00 2C 00 00 00 00 00 00 00 00 00 00 00
01 00 00 00 FF FF FF FF FF FF FF FF 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 2A 00 00 00 00 00 00 00 00 00 00 00 00 00 00
B7 73 00 03 EF FF FF 1F EF FF FF 3F EF DF E6 5F
EF FF FF 7F EF FF F7 9F EF 1F 00 A0 FF 5F 00 00
FF BF 48 00 FF 7F 00 02 FF FF 02 00 00 00 00 00
41 43 49 30 00 00 00 00 00 00 00 00 00 00 00 00
00 20 26 13 F0 74 00 01 00 00 00 00 00 00 00 00
40 00 00 00 1C 00 00 00 60 00 00 00 02 00 00 00
70 00 00 00 2C 00 00 00 00 00 00 00 00 00 00 00
01 00 00 00 FF FF FF FF FF FF FF FF 1C 00 00 00
00 00 00 00 1C 00 00 00 00 00 00 00 00 00 00 00
00 2A 00 00 00 00 00 00 00 00 00 00 00 00 00 00
B7 73 00 02 EF FF FF 1F EF FF FF 3F EF DF E6 5F
EF FF FF 7F EF FF F7 9F EF 1F 00 A0 FF 5F 00 00
FF BF 48 00 FF 7F 00 02 FF FF 02 00
"""
def unhexlify(string):
return binascii.unhexlify(string.encode('latin-1'))
def hexlify(byte_string):
return binascii.hexlify(byte_string).decode('latin-1')
def read_u32(f):
return struct.unpack('<L', f.read(4))[0]
def write_u32(f, u32):
return f.write(struct.pack('<L', u32))
def read_tid(f):
return f.read(8)
def from_hex(hex_str):
return unhexlify(hex_str.replace(' ', '').replace('\n', ''))
def patch_npdm(in_file, out_file):
copy = lambda x: out_file.write(in_file.read(x))
# copy header
copy(HEADER_SIZE)
aci0_offset = read_u32(in_file)
in_file.seek(aci0_offset + 0x10)
tid = read_tid(in_file)
print("Title ID = " + hexlify(tid[::-1]))
data = from_hex(PERMISSIONS_DATA)
data = data[:0x2D0] + tid + data[0x2D8:]
out_file.write(data)
def main(args):
with open(args.npdm_in, 'rb') as npdm_in:
with open(args.npdm_out, 'wb') as npdm_out:
patch_npdm(npdm_in, npdm_out)
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('npdm_in', help='NPDM to patch')
parser.add_argument('npdm_out', help='File to output NPDM to')
args = parser.parse_args()
main(args)