[Tutorial] Extraer y reemplazar ICON0.PNG usando Python

Moderadores: Kravenbcn, largeroliker, fidelcastro, cerealkiller, pspCaracas, dark_sasuke, m0skit0, LnD, ka69, zacky06

Responder
Avatar de Usuario
Acid_Snake
Desarrollador
Desarrollador
Mensajes: 132
Registrado: 30 Jul 2012, 21:26

[Tutorial] Extraer y reemplazar ICON0.PNG usando Python

Mensaje por Acid_Snake »

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:

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
El modulo re es esencial para este trabajo.

Código: Seleccionar todo

x = open("EBOOT.PBP","r").read(512000).encode("hex")
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.

Código: Seleccionar todo

y = open("icon0_old.png","w")
Creamos el archivo donde guardaremos el icon0.png viejo

Código: Seleccionar todo

r = re.compile("504e47(.*?)49454e44ae426082")
los png siempre empiezan por 504e47 y terminan por 49454e44ae426082, el (.*?) indica que cualquier cosa puede haber en medio.

Código: Seleccionar todo

m = r.search(x)
le decimos a re que busque coincidencias

Código: Seleccionar todo

icon = "89" + m.group()
añadimos el valor hex 89 y agrupamos lo encontrado anteriormente

Código: Seleccionar todo

y.write(icon.decode("hex"))
Escribimos los datos en el archivo icon0_old.png, como estan codificados en hex, es necesario decodificarlos.

Reemplazo

Código: Seleccionar todo

x = open("EBOOT.PBP","rb").read().encode("hex")
Esta vez tenemos que leer el eboot entero

Código: Seleccionar todo

r = re.compile("504e47(.*?)49454e44ae426082")
m = r.search(x)
icon_old = "89" + m.group()
Igual que antes, esta vez como trabajamos con dos icons al original lo llamamos icon_old

Código: Seleccionar todo

icon_new = open("icon0.png","rb").read().encode("hex")
Al nuevo lo llamamos icon_new, lo leemos y codificamos en hex

Código: Seleccionar todo

x = x.replace(icon_old, icon_new)
Reemplazamos el icono viejo por el nuevo

Código: Seleccionar todo

open("EBOOT.PBP","wb").write(x.decode("hex"))
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.

Avatar de Usuario
Ryone
Mascota del foro
Mascota del foro
Mensajes: 2243
Registrado: 10 Jul 2010, 16:30
PSN ID: RazorPlay3
Steam ID: Ryonetheonly
Twitter: Ryoneunleashed
Ubicación: Granada, España.
Contactar:

Re: [Tutorial] Extraer y reemplazar ICON0.PNG usando Python

Mensaje por Ryone »

Buen trabajo.

Responder