[Reverse Engineering] Análisis de la Estructura Hexadecimal de Kits (256 Bytes) y Extracción ZLIB

[Reverse Engineering] Análisis de la Estructura Hexadecimal de Kits (256 Bytes) y Extracción ZLIB

Publicado para la comunidad WE10JL | Estudio de archivos .bin

En esta entrada documentamos en detalle la estructura interna de los archivos de kits (como el unnamed_6909.bin). Analizaremos cómo se distribuye el bloque principal de 256 bytes por equipo, cómo se desglosa en 4 sub-bloques de 64 bytes para cada equipación, y compartiremos los scripts en Python que utilizamos para volcar y descomprimir el flujo ZLIB para su posterior visualización e ilustración en software como GIMP.


1. Estructura General del Bloque del Equipo (256 Bytes)




Cada kit completo asignado a un equipo en el archivo binario ocupa exactamente 256 bytes (0x100 en Hexadecimal). Este espacio se subdivide en 4 áreas idénticas de 64 bytes (0x40 hex) cada una:


Sub-bloque Offset Inicio Offset Fin Asignación
Sub-bloque 1 0x00000000 0x0000003F GK 1 (Portero Local)
Sub-bloque 2 0x00000040 0x0000007F PA 1 (Jugador Local)
Sub-bloque 3 0x00000080 0x000000BF GK 2 / PB (Portero/Jugador Visitante)
Sub-bloque 4 0x000000C0 0x000000FF PB / Alternativo / Extra

2. Anatomía Interna del Sub-bloque de 64 Bytes

Cada kit individual contiene dos secciones bien diferenciadas:



  • Metadatos y Configuración (Bytes 0x00 a 0x23): Controla el ID del modelo 3D, el cuello (Little Endian), punteros de memoria RAM y las coordenadas (X, Y) para fuentes y dorsales.
  • Stream Comprimido ZLIB (Bytes 0x24 a 0x3F): Marcado con el indicador estándar 78 DA (Compresión máxima). Contiene la paleta CLUT de 256 colores y los datos de la textura.

3. Scripts de Extracción y Descompresión (Python)

Para extraer los datos de la textura directamente desde el binario y dejarlos listos para importar o editar en GIMP, utilizamos la combinación de dos scripts:



Paso A: Extraer el Stream Comprimido desde el Offset 0x24

# dump_zlib.py - Extrae los bytes comprimidos desde el offset especificado
offset_inicio = 0x00000024
longitud_bloque = 0x1C  # 28 bytes del bloque comprimido

with open("unnamed_6909.bin", "rb") as f:
    f.seek(offset_inicio)
    data_comprimida = f.read(longitud_bloque)

with open("kit_gk1_compressed.bin", "wb") as f_out:
    f_out.write(data_comprimida)

print("¡Dump de ZLIB extraído correctamente!")

Paso B: Descomprimir el Bloque ZLIB a Raw Data

# decompress_zlib.py - Descomprime la textura para abrir en GIMP
import zlib

try:
    with open("kit_gk1_compressed.bin", "rb") as f:
        datos_comprimidos = f.read()

    # Descompresión del flujo ZLIB ('78 DA')
    datos_descomprimidos = zlib.decompress(datos_comprimidos)

    with open("kit_gk1_texture.raw", "wb") as f_out:
        f_out.write(datos_descomprimidos)

    print("¡Descompresión exitosa! El archivo 'kit_gk1_texture.raw' está listo para GIMP.")

except Exception as e:
    print(f"Error durante la descompresión: {e}")

4. Visualización en GIMP

Una vez obtenido el archivo kit_gk1_texture.raw, abrimos GIMP e importamos el archivo utilizando la opción Archivo > Abrir como datos brutos (Raw Data), ajustando las dimensiones de imagen correspondientes y el formato de color indexado a 8-bits.

WE10JL Hex & Modding Lab © 2026 | Documentación técnica para PlayStation 2

Comentarios

Entradas populares de este blog

Tutorial: Cómo editar Scoreboards en WE10JL (SLPM_665.95)

Tutorial: WE10JL Estilo de Camara (SLPM_665.95)

Tutorial: WE10JL (SLPM_665.95) - Relación de KITS