[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
0x00a0x23): 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
0x24a0x3F): Marcado con el indicador estándar78 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.



Comentarios
Publicar un comentario