Skip to content

Commit ab04ef6

Browse files
committed
Merge branch 'master' of https://github.com/K0lb3/UnityPy
2 parents abf73dd + 4b28e64 commit ab04ef6

4 files changed

Lines changed: 26 additions & 27 deletions

File tree

UnityPy/files/BundleFile.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,10 @@ def __init__(
4141
if signature == "UnityArchive":
4242
raise NotImplementedError("BundleFile - UnityArchive")
4343
elif signature in ["UnityWeb", "UnityRaw"]:
44-
m_DirectoryInfo, blocksReader = self.read_web_raw(reader)
44+
if self.version == 6:
45+
m_DirectoryInfo, blocksReader = self.read_fs(reader)
46+
else:
47+
m_DirectoryInfo, blocksReader = self.read_web_raw(reader)
4548
elif signature == "UnityFS":
4649
m_DirectoryInfo, blocksReader = self.read_fs(reader)
4750
else:
@@ -98,6 +101,10 @@ def read_fs(self, reader: EndianBinaryReader):
98101
uncompressedSize = reader.read_u_int()
99102
dataflagsValue = reader.read_u_int()
100103

104+
# UnityWeb version 6
105+
if self.signature != "UnityFS":
106+
reader.read_byte()
107+
101108
version = self.parse_version()
102109
# https://issuetracker.unity3d.com/issues/files-within-assetbundles-do-not-start-on-aligned-boundaries-breaking-patching-on-nintendo-switch
103110
# Unity CN introduced encryption before the alignment fix was introduced.
@@ -116,19 +123,12 @@ def read_fs(self, reader: EndianBinaryReader):
116123
if self.dataflags & self.dataflags.UsesAssetBundleEncryption:
117124
self.decryptor = ArchiveStorageManager.ArchiveStorageDecryptor(reader)
118125

119-
# check if we need to align the reader
120-
# - align to 16 bytes and check if all are 0
121-
# - if not, reset the reader to the previous position
122-
if self.version >= 7:
126+
# if header version is 7 or later we need to align the reader
127+
# for 2019.4.15 and later, version should be 7 and aligned
128+
# but some games in these versions somehow has version 6 while aligned
129+
if self.version >= 7 or (version[0] == 2019 and version >= (2019, 4, 15)):
123130
reader.align_stream(16)
124131
self._uses_block_alignment = True
125-
elif version >= (2019, 4):
126-
pre_align = reader.Position
127-
align_data = reader.read((16 - pre_align % 16) % 16)
128-
if any(align_data):
129-
reader.Position = pre_align
130-
else:
131-
self._uses_block_alignment = True
132132

133133
start = reader.Position
134134
if self.dataflags & ArchiveFlags.BlocksInfoAtTheEnd: # kArchiveBlocksInfoAtTheEnd

UnityPy/files/SerializedFile.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ def save(self, packer: Optional[str] = None) -> bytes:
414414

415415
# ReadObjects
416416
meta_writer.write_int(len(self.objects))
417-
for obj in self.objects.values():
417+
for obj in sorted(self.objects.values(), key=lambda x: x.path_id):
418418
obj.write(header, meta_writer, data_writer)
419419
data_writer.align_stream(8)
420420

UnityPy/helpers/TypeTreeGenerator.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@ def load_local_game(self, root_dir: str):
3030
if "GameAssembly.dll" in root_files:
3131
ga_fp = os.path.join(root_dir, "GameAssembly.dll")
3232
gm_fp = os.path.join(data_dir, "il2cpp_data", "Metadata", "global-metadata.dat")
33-
ga_raw = open(ga_fp, "rb").read()
34-
gm_raw = open(gm_fp, "rb").read()
33+
with open(ga_fp, "rb") as f:
34+
ga_raw = f.read()
35+
with open(gm_fp, "rb") as f:
36+
gm_raw = f.read()
3537
self.load_il2cpp(ga_raw, gm_raw)
3638
else:
3739
self.load_local_dll_folder(os.path.join(data_dir, "Managed"))

UnityPy/helpers/UnityVersion.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -77,18 +77,15 @@ def from_str(cls, version: str):
7777
def __repr__(self) -> str:
7878
return f"UnityVersion {self.major}.{self.minor}{self.type_str}{self.type_number}"
7979

80-
def __getitem__(self, idx: int) -> int:
81-
if idx == 0:
82-
return self.major
83-
elif idx == 1:
84-
return self.minor
85-
elif idx == 2:
86-
return self.build
87-
elif idx == 3:
88-
return self.type.value
89-
elif idx == 4:
90-
return self.type_number
91-
raise IndexError("Invalid UnityVersion index")
80+
def __getitem__(self, idx: Union[int, slice]) -> Union[int, Tuple[int, ...]]:
81+
values = (
82+
self.major,
83+
self.minor,
84+
self.build,
85+
self.type.value,
86+
self.type_number,
87+
)
88+
return values[idx]
9289

9390
def as_tuple(self) -> Tuple[int, int, int, int, int]:
9491
return (self.major, self.minor, self.build, self.type.value, self.type_number)

0 commit comments

Comments
 (0)