[Tutorial] Extraer y reemplazar ICON0.PNG usando Python
Publicado: 01 Ago 2012, 15:06
Muchas veces he sentido la necesidad de extraer y/o reemplazar el icon0.png de los eboot.pbp. Mientras todas las herramientas que encontraba requerian el uso de una psp me dispuse a crear un codigo que lo hiciera, tanto en PC como en PSP usando mi lenguaje favorito: python.
Este es el código del script:
acontinuación una breve explicación de su funcionamiento.
Extracción
El modulo re es esencial para este trabajo.
Abrimos el eboot y leemos los primeros 512 kb, el png suele estar al principio y ocupa muy poco, con 200 kb o incluso 100 bastaria, pero pondremos 512 para asegurarnos, ademas lo codificamos en hex para trabajar mejor.
Creamos el archivo donde guardaremos el icon0.png viejo
los png siempre empiezan por 504e47 y terminan por 49454e44ae426082, el (.*?) indica que cualquier cosa puede haber en medio.
le decimos a re que busque coincidencias
añadimos el valor hex 89 y agrupamos lo encontrado anteriormente
Escribimos los datos en el archivo icon0_old.png, como estan codificados en hex, es necesario decodificarlos.
Reemplazo
Esta vez tenemos que leer el eboot entero
Igual que antes, esta vez como trabajamos con dos icons al original lo llamamos icon_old
Al nuevo lo llamamos icon_new, lo leemos y codificamos en hex
Reemplazamos el icono viejo por el nuevo
Por último guardamos los cambios hechos en el eboot, decodificandolo por supuesto.
No ha sido tan dificil y en general se puede aplicar la misma regla a otros archivos del eboot, como el ELF. Por si no lo sabíais los pbp no es mas que una concatenación de archivos y usa metadatos para saber donde empieza y acaba un archivo, en este caso los metadatos son 504e47 para el comienzo y 49454e44ae426082 para el final.
Este es el código del script:
Código: Seleccionar todo
#! /usr/bin/env python
import re
# Extract and backup the old ICON0.PNG
x = open("EBOOT.PBP","r").read(512000).encode("hex")
y = open("icon0_old.png","w")
r = re.compile("504e47(.*?)49454e44ae426082")
m = r.search(x)
icon = "89" + m.group()
y.write(icon.decode("hex"))
y.close()
# Replace ICON0.PNG with the new one
x = open("EBOOT.PBP","rb").read().encode("hex")
r = re.compile("504e47(.*?)49454e44ae426082")
m = r.search(x)
icon_old = "89" + m.group()
icon_new = open("icon0.png","rb").read().encode("hex")
x = x.replace(icon_old, icon_new)
open("EBOOT.PBP","wb").write(x.decode("hex"))
acontinuación una breve explicación de su funcionamiento.
Extracción
Código: Seleccionar todo
import re
Código: Seleccionar todo
x = open("EBOOT.PBP","r").read(512000).encode("hex")
Código: Seleccionar todo
y = open("icon0_old.png","w")
Código: Seleccionar todo
r = re.compile("504e47(.*?)49454e44ae426082")
Código: Seleccionar todo
m = r.search(x)
Código: Seleccionar todo
icon = "89" + m.group()
Código: Seleccionar todo
y.write(icon.decode("hex"))
Reemplazo
Código: Seleccionar todo
x = open("EBOOT.PBP","rb").read().encode("hex")
Código: Seleccionar todo
r = re.compile("504e47(.*?)49454e44ae426082")
m = r.search(x)
icon_old = "89" + m.group()
Código: Seleccionar todo
icon_new = open("icon0.png","rb").read().encode("hex")
Código: Seleccionar todo
x = x.replace(icon_old, icon_new)
Código: Seleccionar todo
open("EBOOT.PBP","wb").write(x.decode("hex"))
No ha sido tan dificil y en general se puede aplicar la misma regla a otros archivos del eboot, como el ELF. Por si no lo sabíais los pbp no es mas que una concatenación de archivos y usa metadatos para saber donde empieza y acaba un archivo, en este caso los metadatos son 504e47 para el comienzo y 49454e44ae426082 para el final.