Anuncios Google

ayuda crear volcado de ram [SOLUCIONADO]

hola estoy intentando hacer un programa que pueda leer la memoria ram

pero no se donde esta la ram con

freecheat puedo hacer volcados y pesan unos 24mb

es decir se aloja en la flash0 pero quiero que lo haga mi .prx estoy buscando un puntero

que cambia de direccion y quiero tenerlo parcheado creando un.prx y asi empezar en la comunidad

programando ya se C solo quiero saber ¿Donde esta la memoria ram?

gracias


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Andresmargar

La RAM (física) está entre

La RAM (física) está entre 0x08000000 y 0x09FFFFFF, y la usable entre 0x88000000 y 0x89FFFFFF

 

Para más información: http://hitmen.c02.at/files/yapspd/psp_doc/chap5.html#sec5.2

 

Saludos!!


~Actualmente estudiando Ingeniería de las Tecnologías de la Telecomunicación en la Escuela de Ingenieros~

muchas gracias pero..

gracias esa info me vino muy bien pero yo lo que quiero es visualizar los bytes de memoria de un juego y asi parchearlo con un .prx que se ejecuta desde el inicio del juego ¿como puedo ver la memoria? ya se c pero solo se ver direcciones de memoria de las variables que forman parte de mi programa y lo quiero ver es toda la ram 

Imagen de Andresmargar

Fácil

Sólo tienes que pasarle esta dirección a la función que escribe en pantalla la RAM (transformando antes ese puntero, por defecto void*, a uno legible, yo recomiendo pasarlo a char* o a u8*).

#include <psptypes.h>
 
// Obtiene el puntero global de RAM, en u8*
// Recomiendo poner "volatile" para tratar con punteros de registros de la CPU
// (No siempre es necesario pero yo siempre lo pongo :P)
#define PSP_RAM_ADDR (volatile u8*) 0x08000000
 

Saludos!!

 

 


~Actualmente estudiando Ingeniería de las Tecnologías de la Telecomunicación en la Escuela de Ingenieros~

nada

llevo varios dias y nada el define que me dijiste solo muestra el valor del puntero no el contenido de la direccion de la memoria apuntada

Imagen de Andresmargar

Tendría que funcionar

Cómo estás leyendo la memoria? Es que sin el código que usas...

Si quieres hacer un volcado simple haz algo como esto:

#define PSP_RAM_ADDR (volatile u8*) 0x08000000
 
// Haz un volcado de RAM en un archivo de texto
// path -> Archivo donde estara el volcado
// offset -> Direccion inicial a escribir
// size -> tamaño del volcado
void PSP_RAM_Read(const char *path, int offset, int size){
         FILE *f = fopen(path, "wb");
         fwrite(*(PSP_RAM_ADDR + offset), size, 1, f);
         fclose(f);
}

Saludos!!


~Actualmente estudiando Ingeniería de las Tecnologías de la Telecomunicación en la Escuela de Ingenieros~

Se te ha escapado un operador

Se te ha escapado un operador de indirección en el primer argumento de fwrite: fwrite ( const void * ptr

Imagen de Andresmargar

Ups xD

Es verdad, se me olvidó pasarlo a void*, bueno, entonces la función quedaría así:

 

#define PSP_RAM_ADDR (volatile u8*) 0x08000000
 
// Haz un volcado de RAM en un archivo de texto
// path -> Archivo donde estara el volcado
// offset -> Direccion inicial a escribir
// size -> tamaño del volcado
void PSP_RAM_Read(const char *path, int offset, int size){
         FILE *f = fopen(path, "wb");
         fwrite((void*)(PSP_RAM_ADDR + offset), size, 1, f);
         fclose(f);
}

Acabo de probarlo poniendo PSP_RAM_Read("v.txt", 30, 128), y crea un archivo de texto de 128 bytes (con la mayoría de datos a 0).

Saludos y gracias por la corrección!


~Actualmente estudiando Ingeniería de las Tecnologías de la Telecomunicación en la Escuela de Ingenieros~

ya lo hice

gracias por todo lo pude solucionar con unos apuntes viejos que yo tenia y se puede hacer de una forma muy sencilla con una variable y dos punteros a simple vista es :

FILE* archivo;
archivo=fopen("archivo","w");
unsigned char a;//variable vacia solo para ser apuntada
unsigned char *b=&a;//el puntero apunta a la variable a
unsigned char **c=&b;//el puntero apunta al puntero b y este a la variable
int d=0;//para bucle for
 
for(d=0;d<tamaño_volcado;d++)
{
fprintf(archivo,"%c",**c);
//aumentando o disminuyendo el puntero que apunta ala varialbe vacia
//el puntero **c sigue apuntando a el puntero *b pero este apunta en otra direccion de //memoria que no es la variable a
b++;
}
 
//falta apuntar al inicio del volcado de la ram

Con fprintf lo estás

Con fprintf lo estás guardando en un archivo como si la RAM entera fuera un texto, si quieres un *volcado* de la RAM debes usar fwrite, se esta forma escribes exactamente como es la RAM.

Además, esto que has hecho no tiene mucho sentido, sería mejor hacerlo así:

FILE* archivo;
archivo = fopen("archivo","wb");
unsigned long d;
for(d=0; d < tamaño_volcado; d++)
{
	fwrite((void *) d, 1, 1, archivo);
}

Que a su vez, es muy lento ir copiando byte por byte, así que la mejor forma como lo ha hecho Andresmargar.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.