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.

Reverse enigneering Textures using Raw Texture Cooker

Featured Replies

  • Localization

Today I am gonna show you how to reverse engineer any texture using Raw Texture Cooker, this process is by far the easiest and requires almost zero effort and just poor clicks and a little bit of inspection. (Uncompressed and Un-encrypted textures obviously).

 

+==== TUTORIAL SECTION ====+

INTRODUCTION
But how do those textures store their data?
Well, aside from properly skipping the header and parsing the width and the height values from here there is one extra step in here.
Because unlike the traditional images, textures are often scale in sizes ranging from 128x128 to 4096x4096 on average so all of them  as you can see aredividale by 2 and even 4.
Because of this difference textures relly and get a very special compression methods: DXT1, DXT3, DXT5, BC6, BC7.

TEXTURE COMPRESSION
Like any other Block Compression method (BC)...
The size of each compressed block is fixed, it's eighter 8 or 16 byts, representing a 4:1 or 8:1 compression ratio if the source image is in 8 bit RGBA format
DXT1:
Splits the image into tiny 4x4 pixel blocks
Compression stores exactly two colours, 16 bits each
Two in beetween colours can be interpolated from these
The 4x4 block is recreated using only these 4 colours, requiring 2 bits per pixel
In total, block uses 64 bits: 16 pixels * 2 colours * 16 bits per colour


BC:     Type Of Data:                         Data Rate:       Palette Size:       Line Segments:         Use For:
BC1    RGB + optional 1-bit alpha    0.5 byte/px     4                        1                                 Color maps, Cutout color maps (1-bit alpha), Normal maps, if memory is tight
BC2    RGB + 4-bit alpha                  1 byte/px        4                        1                                 n/a
BC3    RGBA                                      1 byte/px        4 color + 8 alpha  1 color + 1 alpha    Color maps with full alpha, Packing color and mono maps together
BC4    Grayscale                                0.5 byte/px     8                        1                                 Height maps, Gloss maps, Font atlases, Any grayscale image
BC5    2 × grayscale                          1 byte/px        8 per channel    1 per channel             Tangent-space normal maps
BC6    RGB, floating-point                1 byte/px         8–16                  1–2                             HDR images
BC7    RGB or RGBA                         1 byte/px         4–16                   1–3                             High-quality color maps, Color maps with full alpha

 

DATA TYPES
The data in each file can be read in binary no matter if it was readable or unreadable before, viewing in binary will spoil immediatelly everything.

This are all of the data types:
Byte/Char = 1 Byte, so 8 Bits
Word/Short = 2 Bytes, so 16 Bits
Dword/Int = 4 Bytes, so 32 Bits
ULONG32/Long = 4 Bytes, so 32 Bits
ULONG64/Long Long = 8 Bytes, so 64 Bits
Float = 4 Bytes, so 32 Bits
Double = 8 Bytes, so 64 Bits
String = A sequence of 1 Byte characters terminated by with null ("00")

Big-Endian vs Little-Endian:
While Big-Endian reads data each type normally as you would do it (left to right), Little-Endian does the opposite and reads them in right to left order,this can drastically change how we interpent the values, Big-Endians were mainly used in PS3, Xbox360 and Wii platforms while Little-Endians in Windows, PS4, Xbox One, Nintendo Switch.

TRYING TO GET THE TEXTURE

So when you finally loaded your texture into the Hex editor (I recommend 3-5 samples at least) I recommend start looking at the header for width and height values, in both Big-Endian and Little-Endain since block compression doesn't care about the Endiannes, so 128x128, 256x256, 512x512, 1024x1024, 2048x2048, 4096x4096...
Your next step is to identify the block compression format, eighter DXT (1-5) or BC (6-7) most frequently, that info is also stored in headers.
Finally the payload part, this is where your data starts, usually a countinous repeating data, but identyfing the begging byte of that data is not as fast as making previous steps, we can of course just try different setups everytime and see the result, different payload can give completelly different results as well as width and height block compression.

Edited by user3678

  • Author
  • Localization
On 12/7/2025 at 6:42 AM, ikskoks said:

Please don't publish tutorials until you finish them.


Also, Raw Texture Cooker is outdated. It's better to use ImageHeat https://github.com/bartlomiejduda/ImageHeat

It supports more pixel formats etc.

Hello, yes thanks, I am planning to update those tutorials a few times, unfotunatelly didn't had the time to finish them, today I'll try to update all of them to the minimums so later I'll just make some other smaller chenges.

I am also looking forward creating my own Reverse Engineering tools like Model Reseacher and Raw texture Cooker as well as something close to QuickBMS but more visually clever.

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.