K0lb3 / UnityPy

UnityPy is python module that makes it possible to extract/unpack and edit Unity assets

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Saving files bigger than 4GB

ev1313 opened this issue · comments

Code

    env = UnityPy.load(datafile)

    for obj in env.objects:
        if obj.type.name == "MonoBehaviour":
            if not obj.serialized_type.nodes:
                data = obj.read()
                if data.name == "DataBaseCompiled":
                    data = obj.read()
                    with open(inputfile, "rb") as f:
                        data.save(raw_data = f.read())

    with open("data.unity3d", "wb") as f:
        f.write(env.file.save())

Error

Traceback (most recent call last):
  File "replace_database.py", line 24, in <module>
    unpack_monobehaviour(sys.argv[1], sys.argv[2])
  File "replace_database.py", line 21, in unpack_monobehaviour
    f.write(env.file.save())
            ^^^^^^^^^^^^^^^
  File "/python3.11/site-packages/UnityPy/files/BundleFile.py", line 224, in save
    self.save_fs(writer, 64, 64)
  File "/python3.11/site-packages/UnityPy/files/BundleFile.py", line 325, in save_fs
    block_writer.write_u_int(uncompressed_data_size)
  File "/python3.11/site-packages/UnityPy/streams/EndianBinaryWriter.py", line 70, in write_u_int
    self.write(pack(self.endian + "I", value))
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
struct.error: 'I' format requires 0 <= number <= 4294967295

Bug
The file gets saved without an error.

To Reproduce
I think the problem is saving a unity3d file that is uncompressed bigger than 4GB, considering the file size overflows?

If I print the size, it is 0x21b5da210.

  • Python 3.11
  • UnityPy 1.10.7

I cannot upload the file for copyright reasons, however it is from the game "Broken Arrow" https://store.steampowered.com/app/1604270/Broken_Arrow/

A possible fix for this is pretty straight forward - replicating what Unity does, splitting the data into blocks and compressing these.
As this would require some testing I'm not sure when I will come around to implementing it tho.