Ver Mensaje Individual
  #5  
Antiguo 23-11-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Reputación: 11
aguml Va por buen camino
A ver si me explico, este archivo es leido por la PS3 y es donde se guarda la partida de un juego en concreto. La empresa que ha creado el juego lo ha protegido con un checksum que por lo visto se llama DWADD que no es mas que ir sumando DWORDs del archivo uno detras de otro en un rango especifico y el valor obtenido es el checksum el cual lo guarda en otra parte del archivo para saber si ha sido modificado. El problema me lo encontré con que mi checksum no tenia nada que ver con el correcto y despues de muchas vueltas alguien me dijo que el modo en que se lee la memoria depende de la arquitectura del procesador y me dije ¿y si la ps3 lo hace al reves?
O sea, si miras en binario el archivo verias algo como
11 22 33 44 55 66 77 88
Si lees dos dwords obtendrias:
0x44332211
0x88776655
Al menos en mi pc es asi.
Pues bien, la suma al final si que era invirtiendolo con lo que quedarian como:
0x11223344
0x55667788
Lo he conseguido con esta pequeña funcion que me he creado para esto:
Código PHP:
int TForm1::InvertirValor(int valor)
{
    
union{
        
int valor;
        
unsigned char cadena[5];
    }
u;
    
int aux;

    
u.valor=valor;

    
aux u.cadena[0];
    
u.cadena[0]=u.cadena[3];
    
u.cadena[3]=aux;

    
aux=u.cadena[1];
    
u.cadena[1]=u.cadena[2];
    
u.cadena[2]=aux;

    return 
u.valor;
}
//--------------------------------------------------------------------------- 
Con eso consigo lo que quiero, primero invirtiendo cada DWORD que leo y luego, antes de guardar el checksum en el archivo invierto tambien el checksum para que se guarde correctamente y con eso va perfecto.
De todos modos soy todo oidos.
Responder Con Cita