Jump to content

The Gunstringer (Xbox 360): Missing Magic Header/CRC Check on .GR2 files


Recommended Posts

Posted (edited)

(This is an attempt to revive an old topic I made a year or 2 ago)

Here are the details I have learnt since then:

The game runs on a proprietary engine known as BEARD. Created by the studio behind the game: Twisted Pixel. Apparently used for games such as the 'Splosion Man series.

The game's animation and model format comes in the form of RAD Games specific Granny3D/GR2 files. Which do have software that allows you to view and export these files into other formats.

But this is where the issue comes in:

It seems these GR2 files have no magic header or way of passing the CRC check done by any Granny3D software. Making them seen as unreadable/Corrupt. It may be a case that each game that has GR2 format could have different compression/encryption methods. But I would not know myself as I am not a reverse engineer.

There could be a way that these model files could be reverse engineered or parsed to support software that can export them to something like .obj/.dae/.fbx

If someone who is familiar with the GR2 format or just a model format reverse engineer in general could help out with this, that would be great

I have attached the model files to this post. Have fun I guess.

models.zip

Edited by JoshuqTheHusk
Posted (edited)
On 3/9/2025 at 11:00 PM, 05SpeedMaster said:

Do you have the base files? Like granny2.dll and such?

I do not think the extracted game files had any form of granny2.dll included. These model files and a bunch of other things such as Lua scripts and textures come from .xpr files stored in the games files alongside compress audio formats (that's I've managed to figure out) and stuff like raw achievement icons and video files used in certain parts of the game.

 

Here's two versions of the .xpr files they are found in:

 

This is one is uncompressed after turning it into an XPR2 file (Which was required to extract the original xpr file properly):

 

https://www.mediafire.com/file/u7tws2je63n8hio/resident_unpack.xpr/file

 

And this one is the original .xpr file:

 

https://www.mediafire.com/file/i74aw6y3nge6e7i/resident.xpr/file

(Also I remember you from the last time I posted about this topic. So I bet you'd probably remember this. Oh btw, do you have a discord so we can easily talk about this more? If you wanna add me, name is joshuqthehusk)

Edited by JoshuqTheHusk
Posted (edited)

That did comfirm which version of Granny was used.
Granny Standard Exporter, SDK version 2.7.0.25

I can now look for the proper format of the header. I should have the Magic numbers I need.

 

And I don't do Discord.

Edited by 05SpeedMaster
  • Thanks 1
  • Confused 1
Posted
21 hours ago, 05SpeedMaster said:

That did comfirm which version of Granny was used.
Granny Standard Exporter, SDK version 2.7.0.25

I can now look for the proper format of the header. I should have the Magic numbers I need.

 

And I don't do Discord.

Alright good to know 😄

Posted (edited)

Going back through all my notes and my collection of example files?  I'm beginning to think the files are in the RAW format.

Never paid to much attention to that format as most Games I've messed about with used a standard GR2 or slightly modified version of it.

I also think that XPR2 is the data base file used by the RAW files as there's alot of information generally found in a GR2 such as bones, textures, and such.

Time to dive deeper into the rabbit hole!
:classic_wacko:

 

Edited by 05SpeedMaster
Posted
17 hours ago, 05SpeedMaster said:

Going back through all my notes and my collection of example files?  I'm beginning to think the files are in the RAW format.

Never paid to much attention to that format as most Games I've messed about with used a standard GR2 or slightly modified version of it.

I also think that XPR2 is the data base file used by the RAW files as there's alot of information generally found in a GR2 such as bones, textures, and such.

Time to dive deeper into the rabbit hole!
:classic_wacko:

 

While I have no clue what's going on exactly with this, it still impresses me all the same.

  • Haha 1
  • Confused 1
Posted

I think I got it figured out. I'm going to write a Script for 010 to grab the info to output an obj file.

Had me a bit confused until I remembered the Xbox 360 uses BigEndian.  Once I switched to that things looked more like a standard GR2 file struture for a mesh.

I'm testing on the shadowcube.gr2 since it's the smallest file. I don't have to write the structure as I've had that since 2010 or so.

Posted
On 3/15/2025 at 3:46 PM, 05SpeedMaster said:

I think I got it figured out. I'm going to write a Script for 010 to grab the info to output an obj file.

Had me a bit confused until I remembered the Xbox 360 uses BigEndian.  Once I switched to that things looked more like a standard GR2 file struture for a mesh.

I'm testing on the shadowcube.gr2 since it's the smallest file. I don't have to write the structure as I've had that since 2010 or so.

Cool!

2 questions:

Does the files come with the textures as well?

Is it possible to also obtain the rigs too.

Don't really know much about this stuff so idk how hard it would be to do that.

Posted (edited)

What did you use to decompress the XPR file?  I have the ISO now so would like to examine more files.
As to Skeletons and such like animations. All the information is contained in the files just as they are in standard GR2 files. So someone better then I am at writting code could extract everything.

What happens when converted to the RAW format is that the file information is stripped out and you get just the information in a flat format.

No pointers to where things are.  They just cram everything in a pile but it's all in the same order as a standard GR2.

 

Edited by 05SpeedMaster
Posted (edited)
20 hours ago, 05SpeedMaster said:

What did you use to decompress the XPR file?  I have the ISO now so would like to examine more files.
As to Skeletons and such like animations. All the information is contained in the files just as they are in standard GR2 files. So someone better then I am at writting code could extract everything.

What happens when converted to the RAW format is that the file information is stripped out and you get just the information in a flat format.

No pointers to where things are.  They just cram everything in a pile but it's all in the same order as a standard GR2.

 

Not exactly the best way to show how we did it but yeah here. Sry if it's a bit messy.

EDIT:

Updated the images to be a bit more clear.

image-27.png

image-40.png

Edited by JoshuqTheHusk
Posted

Nearly finished figureing out the RAW start index. It's mostly pointers to some information. Kind of like a stock GR2 file. 

You do have to read the files in Big Endian. Some areas I'm not sure of yet but it appears to layout the exact order of included information like Mesh info and such.

 

 

Posted

I have the Parent Index, Transform and InverseWorld Transform figured out. Also the OBBmin and OBBMax along with InitialPlacement settings. It's getting narrowed down bit by bit.
Or should I say Byte by Byte?
:classic_biggrin:

Posted (edited)

One thing I do is copy information from the Stringcube. GR2 to a stock GR2 file. Then look at that in Granny Viewer.

Most will get a CRC error and not open the file. I have a Viewer that ignores the CRC so it's not a problem.

I also can recalculate the CRC for files like that if need be.

One must make sure the source file and destination file are the same Endian!

Edited by 05SpeedMaster

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...