Hacking libyaz0 - A library for compressing and decompressing Yaz0/1 compression formats.

AboodXD

I hack NSMB games, and other shiz.
OP
Member
Joined
Oct 11, 2014
Messages
2,880
Trophies
1
Location
Not under a rock.
XP
2,921
Country
United Arab Emirates
libyaz0 is a library in Python for decompressing and compressing Yaz0/1 compression formats.
Written in Python 3.

Yaz0 is a compression format used in several games from the N64, GC, Wii, 3DS, Wii U, and now the Switch.

A few of those games:
  • The Legend of Zelda: Ocarina of Time.
  • Super Mario Sunshine.
  • Mario Kart Wii.
  • Super Mario 3D Land.
  • New Super Mario Bros. U.
  • Mario Kart 8.
  • Breath of the Wild.
  • ARMS.
  • Splatoon 2.

I'd say it's a Nintendo-favorite. :>

--------------------------------------------------------------------------------------------

Example of how Yaz0 compressed data can be decompressed:
Code:
from libyaz0 import decompress

# Yaz0 compressed data
data = b"Yaz0\x00\x00\x00\x10\x00\x00\x00\x00\x00" \
          b"\x00\x00\x00\xfbThis \x10\x02a \xf8test!"

# Decompress it
decompressed_data = decompress(data)
Code:
>>> decompressed_data.decode('utf-8')
'This is a test!'

--------------------------------------------------------------------------------------------

Example of how decompressed data can be Yaz0 compressed:
Code:
from libyaz0 import compress

# Decompressed data
data = 'This is a test!'.encode('utf-8')

# Compress it
## unk: the 4-bytes value that will be located at 0x8-0xC of the Yaz0 header
### default is 0x00000000
unk = 0

## level: compression level.
### 0: No compression (Fastest)
### 9: Best compression (Slowest)
#### default is 1
level = 9

compressed_data = compress(data, unk, level)
Code:
>>> compressed_data
b'Yaz0\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\xfbThis \x10\x02a \xf8test!'

--------------------------------------------------------------------------------------------

libyaz0 can also be used to guess the file extension from the decompressed data.

File formats libyaz0 can detect:
  • BNTX (.bntx)
  • BNSH (.bnsh)
  • BFLAN (.bflan)
  • BFLYT (.bflyt)
  • BFLIM (.bflim)
  • GTX (.gtx)
  • SARC (.sarc)
  • Yaz0/SZS (.yaz0)

Code:
from libyaz0 import guessFileExt

# Guess the file extension from the decompressed data
file_extension = guessFileExt(decompressed_data)

--------------------------------------------------------------------------------------------

libyaz0 can also be used as a standalone program. (Download below)

Usage:
  • libyaz0 [option...] input
Options:
  • -o <output>: Output file, if not specified, the output file will have the same name as the intput file
  • -c: Compress (Will try to decompress if not specified)
Compression options:
  • -level <level>: compression level (1-9) (1 is the default)
    0: No compression (Fastest)
    9: Best compression (Slowest)

  • -unk <unk>: the unknown value that will be located at 0x8-0xC (0x00000000 is the default)

--------------------------------------------------------------------------------------------

Download:

You can get libyaz0 using pip:
Code:
pip install libyaz0==0.4

Or you could get the source code from GitHub.
Github.
Standalone program (Windows).

--------------------------------------------------------------------------------------------

Credits:
Written by AboodXD.
Decompression algorithm based on wszst's.
Special thanks to RoadrunnerWMC for helping with looking up matches for the compression algorithm.
 
Last edited by AboodXD,

tunip3

[debugger active]
Banned
Joined
Oct 31, 2016
Messages
1,675
Trophies
0
XP
1,661
Country
United Kingdom
libyaz0 is a library in Python for decompressing and compressing Yaz0/1 compression formats.
Written in Python 3.

Yaz0 is a compression format used in several games from GC, Wii, 3DS, Wii U, and now the Switch.

A few of those games:
  • Super Mario Sunshine.
  • Mario Kart Wii.
  • Super Mario 3D Land.
  • Mario Kart 8.
  • Breath of the Wild.
  • Splatoon 2.

I'd say it's a Nintendo-favorite. :>

--------------------------------------------------------------------------------------------

Example of how Yaz0 compressed data can be decompressed:
Code:
from libyaz0 import decompress

# Yaz0 compressed data
data = b"Yaz0\x00\x00\x00\x10\x00\x00\x00\x00\x00" \
          b"\x00\x00\x00\xfbThis \x10\x02a \xf8test!"

# Decompress it
decompressed_data = decompress(data)
Code:
>>> decompressed_data.decode('utf-8')
'This is a test!'

--------------------------------------------------------------------------------------------

Example of how decompressed data can be Yaz0 compressed:
Code:
from libyaz0 import compress

# Decompressed data
data = 'This is a test!'.encode('utf-8')

# Compress it
## unk: the 4-bytes value that will be located at 0x8-0xC of the Yaz0 header
### default is 0x00000000
unk = 0

## level: compression level.
### 0: No compression (Fastest)
### 9: Best compression (Slowest)
#### default is 1
level = 9

compressed_data = compress(data, unk, level)
Code:
>>> compressed_data
b'Yaz0\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\xfbThis \x10\x02a \xf8test!'

--------------------------------------------------------------------------------------------

libyaz0 can also be used to guess the file extension from the decompressed data.

File formats libyaz0 can detect:
  • BNTX (.bntx)
  • BNSH (.bnsh)
  • BFLAN (.bflan)
  • BFLYT (.bflyt)
  • BFLIM (.bflim)
  • GTX (.gtx)
  • SARC (.sarc)
  • Yaz0/SZS (.yaz0)

Code:
from libyaz0 import guessFileExt

# Guess the file extension from the decompressed data
file_extension = guessFileExt(decompressed_data)

--------------------------------------------------------------------------------------------

libyaz0 can also be used as a standalone program. (Download below)

Usage:
  • libyaz0 [option...] input
Options:
  • -o <output>: Output file, if not specified, the output file will have the same name as the intput file
  • -c: Compress (Will try to decompress if not specified)
Compression options:
  • -level <level>: compression level (1-9) (1 is the default)
    0: No compression (Fastest)
    9: Best compression (Slowest)

  • -unk <unk>: the unknown value that will be located at 0x8-0xC (0x00000000 is the default)

--------------------------------------------------------------------------------------------

Download:

You can get libyaz0 using pip:
Code:
pip install libyaz0

Getting libyaz0 from GitHub is rather recommended because it includes a Cython version of the algorithms, which is much faster.

Github.
Standalone program (Windows).

--------------------------------------------------------------------------------------------

Credits:
Written by AboodXD.
Decompression algorithm based on wszst's.
Special thanks to RoadrunnerWMC for helping with looking up matches for the compression algorithm.
and how would you dump it
 

Alzter

Member
Newcomer
Joined
Apr 4, 2014
Messages
14
Trophies
0
Age
43
XP
145
Country
United States
I try to open the .exe and then it closes. Help? (I'm trying to decrypt a .szs file I found in the rom of Photo Dojo that I believe contains all the graphics...)
 
Last edited by Alzter,

AceTartarSquad

Member
Newcomer
Joined
Jun 11, 2018
Messages
18
Trophies
0
Age
44
XP
178
Country
United States
I try to open the .exe and then it closes. Help? (I'm trying to decrypt a .szs file I found in the rom of Photo Dojo that I believe contains all the graphics...)

You need to double click the python library, and if that doesn't work, try double clicking it twice.
 

Alzter

Member
Newcomer
Joined
Apr 4, 2014
Messages
14
Trophies
0
Age
43
XP
145
Country
United States
I opened a command line at the install location, entered the command and it worked perfectly! Thank you so much!
 

Site & Scene News

Popular threads in this forum

General chit-chat
Help Users
  • BakerMan @ BakerMan:
    well, i'm glad he seems to be doing fine, and ig i'm going to start spewing goofy shit again
  • BakerMan @ BakerMan:
    Update: Turns out he's epileptic
  • K3Nv2 @ K3Nv2:
    Get a 2nd opinion run mris etc they told me that also
  • Psionic Roshambo @ Psionic Roshambo:
    Also a food allergy study would be a good idea
  • K3Nv2 @ K3Nv2:
    Turns out you can't sprinkle methamphetamine on McDonald's French fries
    +1
  • ZeroT21 @ ZeroT21:
    they wouldn't be called french fries at that point
    +1
  • ZeroT21 @ ZeroT21:
    Probably just meth fries
    +1
  • K3Nv2 @ K3Nv2:
    White fries hold up
    +1
  • The Real Jdbye @ The Real Jdbye:
    @K3Nv2 sure you can
  • BakerMan @ BakerMan:
    why tf do people hate android users? is it the video quality? just because "AnDrOiD = pOoR" bc they don't cost an arm and a leg like iphones do?
    +1
  • BakerMan @ BakerMan:
    i won't be turned off by an iphone, but don't pick on me for having an android, that's just how this shit should work
  • ZeroT21 @ ZeroT21:
    Should say more what these kind of android users say bout nokia 3310 users
  • BigOnYa @ BigOnYa:
    I've owned both iPhone and Androids over the years. Both are just as good, other than Apples higher price. I'm currently on Android, Samsung S21 I think, and very happy with it.
  • K3Nv2 @ K3Nv2:
    Got my 60 minute steps in whew
    +2
  • BigOnYa @ BigOnYa:
    I get mine in everyday, going back n forth to the fridge for a beer.
    +1
  • K3Nv2 @ K3Nv2:
    6,000 steps in so far legs almost broke getting off
    +1
  • K3Nv2 @ K3Nv2:
    Your mind gets in a werid pattern of just finishing then when you're done you're like I need a soda
  • BigOnYa @ BigOnYa:
    You get a "walkers" high?
  • K3Nv2 @ K3Nv2:
    Not really I just use to love building up a sweat
  • BigOnYa @ BigOnYa:
    Funny, that's what uremum always says
  • K3Nv2 @ K3Nv2:
    Yeah and people that take viagra think they have a big dick
  • K3Nv2 @ K3Nv2:
    You cant fix one insult edit for another edit you pog
  • BigOnYa @ BigOnYa:
    Nuh I'm on my tablet n it always auto corrects me
    BigOnYa @ BigOnYa: Nuh I'm on my tablet n it always auto corrects me