SimpleExtractor is an extractor for .spmod (Simple Planes) and .sr-mod (Simple Rockets 2/Juno: New Origins) mod files, written in Python.
The code is based on reverse-engineered game/modtools .dlls' from Simple Planes and Simple Rockets 2 / Juno: New Origins
Disclaimer: For Research Purposes Only
The information and materials provided in this document are intended for research purposes only. Any use of the content for commercial, educational, or any other purposes is at your own risk. The authors do not endorse or promote any unethical or illegal activities.
$ python main.py mod.spmod
Will extract assetBundles for platforms, included in the mod
Since the unpacker is in its early version, it may have some issues, including, but not limited to:
- The unpacker may not be ready to unpack old mods
- The unpacker may not be able to unpack "bundled" mods
In case of getting an error, reach us out in issues, including mod you were trying to unpack
After extracting any .dll files with any desired extractor of assetBundles (for example UABE), you may sometimes notice that you can't open those via any C# disassembler. You may already have noticed, that those are as TextAssets
For Juno: New Origins (SimpleRockets2) consider using pre-1.0 version (for example, 0.3.4.0) of AssetRipper, since its based on Unity 2022, as newer ones break assemblies.
- To properly import library, use any possible HEX editor and remove first 132 bytes (0-83 blocks, length 84, if you are using HxD) of .txt file, and save it as dll
-
- Those 132 bytes, are "header" which mark files as "assembly" for the game. You can find exact header numbers in main.py.
- Now dll should be importable
Initially, when downloaded, the mod is in compressed state.
In such case, file consists of:
- Header (
SimplePlanesCompressedModFileV001
) - Gzip data
When you import it into the game, game copies into the dir, runs unpacking function on dir, and scans all mods
After unpack, we get file consisting of:
- Header (
SimplePlanesModHeaderV001
) - 8 bits of 64-bit signed integer, representing Windows assetBundle offset, for loading with
AssetBundle.LoadFromFile
function later. If the bundle isn't here, the number will be lower than or equal to 0. - Same 8 bits, but for MacOS assetBundle offset
- 8 bits for Linux assetBundle offset
- 8 bits for Android assetBundle offset
- Bundles itself, defined by offsets
Notice, that Android is no longer supported as a platform, yet its saved in the format. This is due to drop of 32-bit support.
iOS should've also had support of mods, and has a lot of mentions in ModTools dll's. However, the support is not avaliable.
Almost same as
spmod
Initially, when downloaded, the mod is in compressed state.
In such case, file consists of:
- Header (
SimpleRockets2CompressedModFileV001
) - Gzip data
When you import it into the game, game copies into the dir, runs unpacking function on dir, and scans all mods
After unpack, we get file consisting of:
- Header (
SimpleRockets2ModHeaderV001
) - 8 bits of 64-bit signed integer, representing Windows assetBundle offset, for loading with
AssetBundle.LoadFromFile
function later. If the bundle isn't here, the number will be lower than or equal to 0. - Same 8 bits, but for MacOS assetBundle offset
- 8 bits for Linux assetBundle offset
- 8 bits for Android assetBundle offset
- Bundles itself, defined by offsets