lunes, 25 de abril de 2016



Primera parte - la fuerza bruta

Etapa preparatoria - nuestro primer intento donde tratamos de atacar a fuerza bruta un escenario.

NV hacking: Este es un tema muy interesante y amplio, sobretodo por esos rompecabezas que a veces hacen trabajar mucho a nuestro cerebro :) Trataré de mostrarte las bases de la Ingeniería Inversa y  el hacking en general en este capítulo.

El intérprete de script de prueba está aquí. Descárgalo ahora pero trata de no mirar el código fuente todavía :)

Lo que necesitamos ahora es un editor hexadecimal. Si no tienes ninguno te sugiero el 010 editor (la versión trial vale por ahora) - hace tiempo usaba WinHex pero es pésimo cuando trabaja en la configuración japonesa - casi se hacía inservible. Probé esta herramienta y resultó ser bastante buena.

Así que, comencemos.

¿Ves runme.dat en el directorio de Scenario Runner? Eso es un "escenario" que funciona. Abre el EXE. El escenario es simple, así como el propio intérprete - genera una cadena, después te hace una pregunta y dependiendo de tu respuesta volverá a hacer la misma pregunta o emitirá un mensaje y saldrá.

Tu trabajo consiste en cambiar las cadenas que muestra - eso es lo que hacemos cuando tenemos que traducir un juego, por ejemplo.

Para comenzar usaremos la fuerza bruta: Abre runme.dat en un editor hexadecimal. Puedes ver claramente algunas cadenas como "Make me laugh!" y otras. ¿Qué tal si cambiamos una de ellas?

Edita la primera cadena  - Yo puse "Do not cry..." - en este caso tenemos una "!" extra a la izquierda de la anterior cadena - bórrala. El archivo tendrá 1 byte menos.

Cuando editas con un editor hexadecimal hay dos áreas donde puedes hacerlo - a la izquierda debes introducir valores hexadecimales (0-9, a-f) mientras que a la derecha puedes introducir letras y otros símbolos normalmente. Dado que necesitamos introducir una cadena "humana" es más conveniente que lo hagamos en el lado derecho.
De todos modos, puedes alternar entre los dos lados  pulsando Tab.
También, fíjate en que hay dos maneras - sobrescribir e insertar. Puedes cambiar de uno a otro como sueles hacerlo en los editores de texto normales - pulsando la tecla Insert.


Abre el exe. Oh oh,  tenemos una excepción y también vemos que han salido algunos "☺" - aunque es importante ser positivo no es exactamente lo que esperábamos ver :)

Probablemente olvidamos actualizar algo, por ejemplo, la longitud de una cadena.  Naturalmente, la aplicación debe saber cuan larga es la cadena. ¿Cómo podrá saberlo?

Recordemos algo sobre dos tipos generales de cadenas - Estilo-C y estilo-Pascal. Como sabrás, el estilo-C no tiene ningún campo de longitud, la longitud es determinada en tiempo de ejecución mediante la búsqueda de un caracter con código #0: 32 33 34 00. El estilo-Pascal no utiliza caracteres nulos, más bien incluye la longitud de la cadena antes de la cadena actual, lo que hace que  la cadena sea procesada más rápido (a costa de tener un campo de longitud adicional, pero es un coste muy bajo) :
03 00 32 33 34. Normalmente, este campo es de 2 (palabra) o de 4(doble palabra) bytes de longitud.

Necesitamos mirar todo para encontrar dónde está el problema. ¿Puedes hacerlo por ti mismo? :)

----------------------------

Esto es lo que tenemos : 0E 00 44 6F 20 6E 6F 74 20 63 72 79 2E 2E 2E.

Esos bytes 0E 00 parecen ser la longitud de la cadena, ¿verdad? Tenemos que hacer una rápida conversión para comprobar esta suposición: presiona F11 (Tools | Converter Base) e introduce 0E en el campo hex - es 14 en notación decimal. Normalmente, también puedes hacer esto mediante el establecimiento de un puntero antes de 0E y mirándolo con el Inspector bajo Unsigned Short.
Si estás usando un editor hexadecimal diferente u otra cosa que te impida usar una herramienta de conversión de notación de escritorio, puedes usar una base de conversión online como esta en i-tools.org.

Una rápida introducción sobre cómo los números se almacenan en la memoria y otros lugares.
Algo que me pareció confuso sobre ellos al principio es que están almacenados en orden contrario, ejemplo, si tenemos un número de 2 bytes y es 255 aparecerá como FF 00 en la representación de máquina, no como 00FF como escribimos. De hecho, esto es llamado little-endian u orden de bytes Intel y también hay un orden de bytes big-endian, que se mostrará como nuestra notación normal, es decir, como 00 FF.
De todos modos, el orden de bytes Intel es el más ampliamente utilizado (un sitio que conozco  que usa  big-endian son las transmisiones de red de área).

Por cierto, antes de hacer nada  con tu proyecto asegúrate de respaldar los archivos originales por si acaso los estropeas demasiado - siempre es un buen hábito que adquirir.

Actualiza la longitud y ejecuta el script. ¡Wow, es genial, tenemos un script funcional! ¡Hurra!
...Bueno, no exactamente después de investigar un poco - el script funciona correctamente cuando se escoge la segunda opción - si no es así, se crasheará. Dice que el bytecode está corrupto...

Ahora te dejo que explores el script con el editor hexadecimal por ti mismo para que intentes encontrar donde está el problema. Cuando hayas usado todas tus deducciones, pasa a la parte más fascinante - ¡la depuración o debugging! :D

miércoles, 23 de marzo de 2016

Pronto estaré de vuelta

Bueno, han pasado casi tres años desde la última entrada que hice en este blog. Por motivos de estudios, personales y demás lo he ido aparcando, pero más que nada, ha sido por desgana en general de seguir con ninguno de mis proyectos de traducción. Ahora que más o menos estoy motivada, regresaré pronto con cositas traducidas de la guía aquella que comentaba en mi otra entrada, por si a alguien le pueden servir de ayuda.
Sin más que decir, me despido ya hasta la próxima entrada :)