Información parches IPS

Lugar donde se intentarán resolver problemas específicos
Responder
Avatar de Usuario
Leeg
Mensajes: 381
Registrado: 20 Mar 2014, 00:25

Información parches IPS

Mensaje por Leeg » 11 Nov 2014, 19:22

¡Hola!

Estoy tratando de hacer un parcheador con interfaz y me preguntaba dónde puedo encontrar información sobre la estructura que siguen los parches IPS o... si me va a ser mejor y más fácil diseñar yo solo la interfaz y hacer que se ejecute en segundo plano un parcheador IPS de otra persona en consola...

Gracias ;D

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5579
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 11 Nov 2014, 20:27

Entiendo que lo que quieres es aplicar un parche IPS y no crearlo, así que allá va el rollo.

Un parche IPS se compone de:
- 5 bytes con la signatura "PATCH"
- chunks (me jode llamarlos registros)
- 3 bytes con la signatura "EOF"

Cada chunk tiene:
- 3 bytes con el offset <--- esto limita el parcheo a 16 megas, desde 0x000000 hasta 0xFFFFFF
- 2 bytes con la longitud a cambiar
- X bytes a sustituir

Si la longitud es 0 entonces se trata de un dato comprimido (es una simple RLE) y el registro completo sería:
- 3 bytes con el offset
- 2 bytes con el valor 0
- 2 bytes con la longitud
- 1 byte con el valor a repetir

Hay programas que no controlan bien los 3 bytes del offset, y cuando se encuentra el "EOF" final se cree que es el offset 0x464F5E y la lía parda.

Con eso ya deberías ser capaz de crear una simple rutinita para aplicar cualquier parche.

Avatar de Usuario
Leeg
Mensajes: 381
Registrado: 20 Mar 2014, 00:25

Mensaje por Leeg » 11 Nov 2014, 21:04

¡Muchas gracias!

A ver si me sale, porque parece difícil, he encontrado un código fuente para parchear en PHP y me ha dado miedito XD Yo voy a probar con C#.

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5579
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 12 Nov 2014, 17:30

Es muy simple. Lo único a tener en cuenta es el "EOF". Puede darse el caso de que un offset tenga el valor 0x464F5E, que no sería un "EOF" real, así que sólo se debe terminar el proceso cuando aparece el "EOF" y no haya más información en el fichero IPS. Más o menos sería así:

Código: Seleccionar todo

read &#40;IPS, SIGNATURA&#41;
if SIGNATURA != "PATCH" error
while 1 &#123;
  read &#40;IPS, OFFSET&#41;
  if OFFSET == "EOF" exit // <--- sólo si eran los 3 últimos bytes
  seek &#40;FILE, OFFSET&#41;
  read &#40;IPS, LEN&#41;
  if LEN != 0 &#123;
    while &#40;LEN--&#41; &#123;
      read &#40;IPS, CH&#41;
      write &#40;FILE, CH&#41;
    &#125;
  &#125; else &#123;
    read &#40;IPS, LEN&#41;
    read &#40;IPS, CH&#41;
    while &#40;LEN--&#41; &#123;
      write &#40;FILE, CH&#41;
    &#125;
  &#125;
&#125;

Avatar de Usuario
Leeg
Mensajes: 381
Registrado: 20 Mar 2014, 00:25

Mensaje por Leeg » 12 Nov 2014, 18:28

¡Gracias por la información!

Al final creo que lo voy a hacer para xdelta en vez de IPS, porque son parches universales que me valdrán para todo, los IPS están muy limitados de tamaño... Originalmente la idea era hacer esto para el parche de Shining Force II de mi compañero de blog, pero hemos decidido convertir ese parche a xdelta mejor, así lo que programe servirá para todos los parches que saquemos, que es más razonable, creo.

Avatar de Usuario
Leeg
Mensajes: 381
Registrado: 20 Mar 2014, 00:25

Mensaje por Leeg » 14 Nov 2014, 17:43

Una pregunta muy estúpida, porque estoy programando esto y algo no me cuadra...

¿Xdelta3 no puede aplicar parches sobre un mismo archivo? Es decir, ¿es necesario que se cree siempre un nuevo archivo? ¿No se puede aplicar el parche sobre el original?

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5579
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 14 Nov 2014, 17:58

Es que no tiene sentido que se aplique el parche al mismo fichero. Con un ejemplo un poco tonto se ve mejor.

Imagina que donde originalmente hay una 'A' ahora quieres poner 'EO'. Eso te cambiaría el byte 'A' original por 'E' y el siguiente por 'O', pero no es eso lo que queremos. Se podría hacer si hacemos una copia del original, que sería con la que se trabajaría, pero hay que hacer la copia y luego borrarla, que es más trabajo que crear el fichero final.

También puedes verlo al revés. Cambiar un 'EO' por 'A', con lo que el fichero final debe ser de menor tamaño, y tendríamos que hacer más trabajo que creando el fichero final.

Avatar de Usuario
Leeg
Mensajes: 381
Registrado: 20 Mar 2014, 00:25

Mensaje por Leeg » 14 Nov 2014, 18:21

¡Muchas gracias!

Es que había programado por mi cuenta que se creara una copia de seguridad de la ROM antes de ser parcheada... pero si xdelta3 no permite aplicar el parche sobre la propia ROM de origen, mi copia de seguridad no me sirve de nada, porque se tiene que acabar creando forzosamente otra ROM distinta.

Avatar de Usuario
Leeg
Mensajes: 381
Registrado: 20 Mar 2014, 00:25

Mensaje por Leeg » 15 Nov 2014, 12:16

Pues ya lo he acabado, lo he subido a github por si alguien quiere reciclarlo ya que cambiar el diseño con Visual Studio sin tocar el código es fácil (siempre teniendo en cuenta que esto es la primera vez que toco C# y el código tiene que estar horrible).

https://github.com/Artuvazro/patcherxd3

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5579
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 15 Nov 2014, 12:57

Yo voy a hacer de abogado del diablo, que es la forma fina de decir que hoy no tengo nada mejor que hacer que meterme contigo un poco, sobre todo con dos aspectos que no están muy bien vistos :twisted: :twisted: :twisted:

¿Por qué el parcheador debe funcionar exclusivamente en máquinas de 64 bits? Debe ser una utilidad tan simple como el parche, que pueda usarse por cualquier usuario independientemente del equipo que tenga.

¿Por qué se deben ocultar los programas de terceros? En tu caso estás usando XDELTA3, que tiene ciertas condiciones para su distribución y las ignoras.

Avatar de Usuario
Leeg
Mensajes: 381
Registrado: 20 Mar 2014, 00:25

Mensaje por Leeg » 15 Nov 2014, 13:24

Me gusta el feedback, y si es destructivo mejor XD

Lo de los 64 bits no lo entiendo, si en el compilador puse any CPU y preferencia de 32 bits :S déjame que lo revise...

[img]http://i.imgur.com/ZJ1PPY0.png[/img]


Edito: Vale, que lo que es para 64bits es el exe de xdelta3, se me ha colado. Lo cambio.

Respecto a lo de la licencia, estuve mirando antes de hacer nada las condiciones de distribución de xdelta aquí: (pero no está muy bien redactado y no me ha quedado claro del todo... viendo los comentarios parece que no soy el único)
https://code.google.com/p/xdelta/wiki/LicensingXdelta

"You may use and distribute the Xdelta executable (i.e., the command-line program) without an excemption to the GPL"

Supuestamente puedes usarlo y distribuirlo si el programa donde lo metes tiene una licencia GPL, ¿no? Lo que he subido yo a GIT no tiene licencia alguna así que entiendo que también es válido, pero corrígeme si me equivoco que no quiero líos después XD

Edito: Le pondré que tiene licencia GPL también por si las moscas.

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5579
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 15 Nov 2014, 16:24

El problema con XDELTA es que no estás distribuyendo el ejecutable, lo pones "oculto" para que no se vea, que es lo que viola con nocturnidad y alevosía la licencia (es lo que pasa por ir escrita con minifalda, que va provocando, y luego pasa lo que pasa).

Muchos lo hacen así y no es la forma correcta, aunque tampoco es que vayan a ir a por ti a cortarte las pelotas con una motosierra por eso. Para evitarme líos, yo siempre he optado por un simple fichero batch acompañando al ejecutable, y si alguien quiere añadir el GUI que existe por ahí es libre de hacerlo. Así me quito el marrón de encima y, además, sudo lo menos posible, que hay que ver lo cara que está la energía últimamente.

Supongo que también es cuestión de cada uno. Yo, al igual que me gusta que respeten mi trabajo, procuro respetar el de los demás.

La norma general, no escrita, es que para ROM de juegos de consolas antiguas, las mal llamadas "clásicas", se use un simple IPS porque el juego no pasa de 16 megas, que es la razón de ser de la limitación de los IPS. Más que nada es porque existen emuladores, que es donde se usarán normalmente, que permiten cargar el juego original y aplicar el parche al vuelo. Otra razón es que así se pueden aplicar varios parches al mismo juego, que es otra de las ventajas de los IPS al no controlar CRC ni checksums. Para cosas más gordas, como ROM de consolas modernas o ISO, se usa normalmente XDELTA o PPF.

En tu caso a lo mejor deberías echar un vistazo a IPSEXE15, que transforma el IPS en un ejecutable, pudiendo incluso añadir la comprobación de CRC, añadir una descripción y poder mirar un "readme.txt", todo ello ocupando una mierdecilla. Un ejemplo:
[align=center][img]http://s25.postimg.org/iavbwsnnj/Dibujo.png[/img][/align]

Avatar de Usuario
Leeg
Mensajes: 381
Registrado: 20 Mar 2014, 00:25

Mensaje por Leeg » 15 Nov 2014, 16:31

Gracias por la información y el programilla ese.

Respecto a lo otro, si libero el código fuente donde el exe no va oculto, (que ya lo he hecho) y lo pongo al mismo nivel de licencia que xdelta3 (que ya lo he hecho también), debería estar todo "guay" ¿no?

Otra opción es enviarle un correo al autor, cosa que no me importa nada hacer y preguntarle.

De todas formas, eso de que vaya oculto o no, si pudieras enlazarme a algún lado donde se explique te lo agradecería, porque yo he estado leyendo y no he visto nada de eso :S

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5579
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 15 Nov 2014, 16:41

A mí me da que te estás liando. Si lo que quieres es liberar el código de una tool para aplicar parches, vale, pero si lo que quieres es publicar un parcheador para un juego, ¿qué sentido tiene el código fuente? No le va a interesar a nadie, y lo que más te van a pedir es que les pases el juego ya parcheado (si es que los traductores sois mala gente, que hacéis trabajar a los demás en vez de subir todo hecho ya a mega, panda de vagos).

Lo de "oculto" o no está claro, al menos para mí. La licencia dice que puedes distribuir el ejecutable, pero tú no lo haces, estás usándolo de forma oculta, sin que la gente se entere, y eso no se puede considerar "distribuir", es un simple "uso".

Avatar de Usuario
Leeg
Mensajes: 381
Registrado: 20 Mar 2014, 00:25

Mensaje por Leeg » 15 Nov 2014, 16:48

Liberar el código fuente del programa es obligatorio según las restricciones del autor, por eso lo hago:
You may use and distribute the Xdelta executable (i.e., the command-line program) without an excemption to the GPL. If your program integrates directly with Xdelta at the API level, if you "link" directly to the Xdelta API, you must either distribute your source according to the terms of the GPL
El fin último es usarlo como parcheador, claro, pero liberar el código es un requisito según eso. ¿Me explico?

Y yo no entiendo que oculte a la gente nada, si en el readme del código fuente pongo que se usa. De todas formas le voy a preguntar al autor por correo, que no me cuesta nada y salimos de dudas para siempre XD

Edito: Vaya hombre, se le ha jodido a Google el captcha-antispam para los correos... no puedo ver su dirección entera, le dejaré una pregunta en la página de licencias.

Edito 2: Aquí si viene algo de lo que tú dices, pero solo si le das un uso comercial:
No obstante, en muchos casos usted puede distribuir el software cubierto por la GPL junto a su sistema privativo. Para hacerlo de forma válida, debe asegurarse de que los programas libres y privativos se comunican a distancia, de que no estén combinados de ninguna manera que los convierta de hecho en un solo programa.
Y respecto a la distribución del código fuente:
¿Cómo puedo asegurarme de que todo usuario que se baje los binarios obtenga también los archivos fuente?
No tiene por qué asegurarse de esto. Mientras publique los archivos fuente y los binarios de manera que los usuarios puedan ver lo que hay disponible y tomen lo que deseen, usted ya ha hecho todo lo que se le pide. Que el usuario se baje o no los archivos fuente depende de él.
El propósito de nuestros requisitos para los redistribuidores es asegurarnos de que los usuarios puedan acceder al código fuente, no forzar a los usuarios a bajárselo aun cuando no quieran hacerlo.
http://www.gnu.org/licenses/gpl-faq.html

Responder