Skip to content
View in the app

A better way to browse. Learn more.

ResHax

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.
Help us keep the site running.

Ben 10: Protector of Earth (PS2) Extracting 3D models

Featured Replies

Body:

Hi everyone,

I am trying to extract 3D character models from Ben 10: Protector of Earth (PS2), developed by High Voltage Software (Omni Engine).

I successfully unpacked the main GAME.WAD and GAME.DIR using the standard QuickBMS script. According to the extracted levels.txt, the main player models and animations are inside a file named 99_95.pss (~34.5 MB).

The Problem: The .pss extension is fake. When opening the file in a hex editor, the header actually reads BIGB1 and mentions <Strat Wad>. This is a custom Omni Engine archive container.

What I've tried:

Standard ea_big4.bms: Fails with the error: the signature "BIGB" doesn't match the one expected by the script BIG4.

ininja.bms (since I-Ninja runs on the same engine): Fails because the script expects a split .dir dictionary file, but these .pss files are standalone containers.

You can clearly see raw PS2 files (like RIFF WAVE audio) sitting unencrypted inside the hex, so the data isn't heavily compressed, it's just locked in this custom BIGB container.

Could someone please take a look and help me write a QuickBMS or Python script to unpack the internal files from this BIGB Strat Wad?

Link to the sample file (99_95.pss): > [Paste your Google Drive / MEGA link here]

Hex screenshot: [Attach your screenshot of the Hex Editor showing the BIGB1 header here]

Any help or pointers to existing High Voltage Software tools would be massively appreciated! Thank you!

 

https://www.mediafire.com/folder/qk0wmy2tv6kei/Ben+10+Protector+of+Earth+PS2+Wad+Extracted

  • Localization

Just from visually looking at some of the files, I wonder if the format is something like this:

 

+---------------------------------------+
| Ben 10 Protector of Earth [PS2] *.pss |
+---------------------------------------+

// HEADER
  4 - Header (BIGB)
  4 - Header Length (492)
  492 - Unknown
  
// RIFF DATA
  4 - null
  4 - VAG Data Offset [*2048]
  X - Compressed RIFF Data
  X - null Padding to a multiple of 2048 bytes
  
// VAG DATA
  X - VAG Data Stream
  X - null Padding to a multiple of 2048 bytes

 

It looks like the RIFF data might be compressed, as some of the strings in there are obviously split in the middle, or are missing parts that might have been a repeat from earlier.

It looks kinda like the remaining data might just be a single long VAG audio stream, or something like that. It seems to just be a continuous block of data with size 16 bytes, much like VAG audio looks.

 

Not really sure how to take it from here though.

  • Localization

I've seen this format before, here's how I currently handle it which is obviously wrong (I think it's a compressed stream with different data/token tracks that I just extract raw currently)

f = File(i,endian='<')
asrt(f.read(4) == b'BIGB')

do = 0x10 + f.readu32()
v = f.readu32()
asrt(v in {0x9D,0xA3})

f.skip(4)
if v == 0xA3: asrt(f.readu8() == 1)
x = b'Type: ' + f.readc(0x40).split(b'\0')[0] + b'\n\nName: ' + f.readc(0x28).split(b'\0')[0] + b'\n\ncmd: '
if v == 0xA3: f.padc(3)
s3,s4,s1,s2,zs1,zs2 = f.readu32(),f.readu32(),f.readu32(),f.readu32(),f.readu32(),f.readu32()
cmd = f.readc(0x100).split(b'\0')[0]
writefile(o + '/$comment.txt',x + cmd + b'\n')

cmd = cmd.split(b' ')
if b'-ps2' in cmd: gex = guess_ext_ps2
else: gex = guess_ext
f.seek(do)
d = f.decompress(zs1,'none',usize=s1) # placeholder
writefile(f'{o}/1.cmp',d)
d = f.decompress(zs2,'none',usize=s2)
writefile(f'{o}/2.cmp',d)
f.align(0x800)
if s3:
    d = f.readc(s3)
    writefile(f'{o}/3.{gex(d)}',d)
    f.align(0x800)
if s4:
    d = f.readc(s4)
    writefile(f'{o}/4.{gex(d)}',d)

I'm looking into the executable and I'm seeing some sort of custom scripting/relocation format in the file which will be a pain lol

  • Localization

added support, only extracts audio currently as I've no clue how the 3d models (AMPC) knows it's offsets

https://github.com/smiRaphi/UniPyX (https://github.com/smiRaphi/UniPyX/commit/46a9f811f79d84a93e8ec9f3480f717ab25e54b6)

 

Also to play the audios, you'll need a player that supports this specific format, only one I know is: https://github.com/librempeg/librempeg

  • Localization
2 hours ago, DKDave said:

You've hijacked this post with a pointless question - use the search first and you can easily find the answer to what you're asking.

 

Did you move his post to the correct section?

Create an account or sign in to comment

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.