Registrarse

[Herramienta] [Para dev's][python] Modulo python para ROM-Hacking

cosarara97

Dejad de cambiar de nick
Miembro de honor
Bueno, pues igual que hay un modulo de vb para crear herramientas de RH (nos lo muestra Gut en su escuela) creado por Darhatron, yo he creado uno para facilitar la tarea en python :D

Lo uso en versiones recientes de pyFSF-GUI (en la versión avanzada, que de momento no hace casi nada), y por lo tanto lo podeis descargar con git de "https://code.google.com/p/python-free-space-finder/", en "branch/advanced version/romHacking.py" donde lo mantendré actualizado.

EDIT: Ahora la versión básica también lo usa :)

Peeero como se que soys unos vagos y no quereis usar git, lo pondré en descarga directa del repositorio xD (más abajo)

Bueno, el modulo es este:
Aquí está en colores
Código:
"""Author: cosarara97
Version: 0.2
This module was created to make the creation of ROM-Hacking tools easier.
It uses the binascii module a lot, and some of it functions are only
used of synonyms of binascii ones."""

#import sys, os
import binascii


def conv_file2h(romFile):
    hexString = binascii.hexlify(romFile)
    return hexString


def conv_a2h(asciistr):
    """Converts ASCII hex string to it's hex equivalents."""
    hexstr = binascii.a2b_hex(asciistr)
    return hexstr


def convn_h2a(hexstr):
    """Converts hex string to it's ASCII equivalents."""
    asciistr = binascii.b2a_hex(hexstr)
    return asciistr


def conv_dec2hex(decnum):
    """Converts decimal int to it's hex equivalent
       without 0x (returns string)."""
    hexnum = hex(decnum)[2:]
    return hexnum


def conv_hex2dec(hexnum):
    """Converts hex number (string var) to it's decimal equivalent."""
    decnum = int(str(hexnum), 16)
    return decnum


def search(rom, length, start, byte="ff"):
    """Search for a certain number of repeated bytes in a string variable
       containing a ROM image in Hex. Normally used to search for FF
       bytes, which are free space in GBA ROMs, but also 00, which are free
       space in GB ROMs (i think).
       It returns the offset where all those bytes are in.
       "rom" is a string, "length" is an int, "start" is an int and "byte" is a
       string"""
    whatToSearchFor = byte * length  # whatToSearchFor = byte to search for
                                     # (usually ff) * length of bytes to search.
    offset_found = rom.find(whatToSearchFor, start) / 2
    return offset_found


def openRomRead(fileName):
    romOpenInReadMode = open(fileName, "rb")
    romContents = romOpenInReadMode.read()
    romOpenInReadMode.close()
    romHexString = conv_file2h(romContents)
    return romHexString


def openRomWrite(fileName):
    romOpenInWriteMode = open(fileName, 'wb')
    return romOpenInWriteMode


def readRomByte(hexRom, hexOffset):
    if hexOffset[0:2] == "0x":
        hexOffset = hexOffset[2:]
    decOffset = conv_hex2dec(hexOffset)
    byte = hexRom[decOffset * 2:decOffset * 2 + 2]
    return byte


def readRomData(hexRom, hexOffset, length):
    if hexOffset[0:2] == "0x":
        hexOffset = hexOffset[2:]
    decOffset = conv_hex2dec(hexOffset)
    data = hexRom[decOffset * 2:decOffset * 2 + length * 2]
    return data


def insertSpacesBetweenBytes(hexstring):
    """"This is a very useful one :D If you have a sting like this:
        '36373839302d41', this function will turn it into something like this:
        '36 37 38 39 30 2d 41'. It may be useless when you are working with
        the variables, but useful when you have to show the bytes to the user"""
    new = ""
    for i in range(len(hexstring) / 2):
        pos = i * 2
        new += hexstring[pos:pos + 2] + " "
    return new

Funciones del módulo:
Código:
conv_file2h(romFile):

conv_a2h(asciistr):

convn_h2a(hexstr):

conv_dec2hex(decnum):

conv_hex2dec(hexnum):

search(rom, length, start, byte="ff"):

openRomRead(fileName):

openRomWrite(fileName):

readRomByte(hexRom, hexOffset):

readRomData(hexRom, hexOffset, length):

insertSpacesBetweenBytes(hexstring):
Lo que hace cada una os lo podeis imaginar :D

Aún falta documentar un poco y añadir las funciones de escribir, pero ya lo iré haciendo...


Descarga:
http://python-free-space-finder.googlecode.com/git/branch/advanced%20version/romHacking.py
("Click derecho -> Save link as" o equivalente)


EDIT: No es un parche ni se parece a uno, pero si va mejor ahí ya lo moverá un mod...

EDIT2: Para usarlo hay más de una forma, las pongo en spoiler.
Primero de todo copiemos el modulo a la misma carpeta que nuestro programa.

Forma 1:
Agregar al inicio del programa lo siguiente:
Código:
import romHacking
Luego hay que usar sus funciones añadiendo "romHacking." al principio. Ejemplo:
Código:
mybyte = romHacking.readRomByte(hexRom, 800000):

Forma 2:
Agregar al inicio del programa lo siguiente:
Código:
import romHacking as RH
Luego hay que usar sus funciones añadiendo "RH." al principio. Ejemplo:
Código:
mybyte = RH.readRomByte(hexRom, 800000):

Forma 3:
Agregar al inicio del programa lo siguiente:
Código:
from romHacking import *
Luego se pueden usar sus funciones directamente. Ejemplo:
Código:
mybyte = readRomByte(hexRom, 800000):
 

Kal!ser

Vuelve el lobito
Como siempre, facilitando y acercando la programación al python como alternativa al VB e_e.

Bueno, primero, gran trabajo, haces logros cada vez mayores en herramientas. Sólo creo que esto debería ir en parches... ya que no es una herramienta propiamente dicha =S. Bueno, pues eso, gracias y sigue así!
 

Cheve

MoonLover~
Miembro de honor
Foro dijo:
Parches Base y Packs

Encontrá todo tipo de modificaciones preparadas para aplicar o importar a tu hack.
Allí van solo Parches de y para Roms...
El tema está bien ubicado.
[/Mod]

Bueno, según lo que entiendo ésto ayudará y facilitará la creación de herramientas para el Rom Hacking en Python.
Me alegro que sigas aportando así, las herramientas son lo principal a la hora de crear un Hack, porque somos unos vagos que no queremos usar Hex sin ellas nos costaría quizás hasta 8 veces más :D

Sigue así!

Suerte y Salu2! ñ.ñ
 
Arriba