Novedades sobre AL3D

Después de unos cuantos meses (ya que esto lo hago en el poco tiempo libre que me queda) puedo enseñar algo más de AL3D el motor de renderizado para web que estoy preparando y viene con bastantes novedades.

La que más ilusión me hace es la incorporación de una nueva librería: ALPhysics.js que se encargará de llevar a cabo las físicas, estoy bastante ilusionado con esta librería y las posibilidades que puede ofrecer. Aunque todavía está en pañales y pasará bastante tiempo hasta que acabe integrada completamente en el proyecto.

Con esto ya son 3 las librerías del proyecto: AL3D.js, ALMath.js y ALPhysics.js.

Las novedades del motor son muchas y variadas, distribuidas entre todas las librerías, pero la que más novedades presenta es AL3D.js.

Novedades en ALMath.js:

  • Gestión de errores
  • Mejoras en el rendimiento, sobre todo en el cálculo de la matriz normal (ahora solo se calcula la inversa cuando sea necesario, calculando la transpuesta cuando sea posible)
  • Añadida la clase Quaternion
  • Correción de pequeños errores.

Novedades en ALPhysics.js:

  • Como principal novedad está la creación de esta misma librería.
  • Generador de fuerzas gravitatorias
  • 2 ODE Solver (Resolutor de ecuaciones diferenciales ordinarias
    • Euler ODE Solver
    • Fourth-Order Runge-Kutta ODE Solver
  • NO dispone de broad-phase (por ahora)
  • NO dispone de narrow-phase (por ahora)

Novedades en AL3D.js:

  • Posibilidad de renderizar escenas 3D
  • Añadidas figuras geométricas básicas:
    • Esfera
    • Cono
    • Cilindro
    • Plano
    • Circulo
    • Cubo
  • Añadidos distintas fuentes de luz
    • Point Light (Con atenuación lumínica)
    • Directional Ligth
    • Spot Ligth (Con atenuación lumínica)
  • Añadidos distintos tipos de materiales
    • Material Lambert (Aquél en el que la luz reflacta en todas las direcciones)
    • Material Phong (Aquél en el que la luz reflacta en todas las direcciones pero además hay una zona en la que refleja bastante luz al observador)
    • Material Blinn (Optimización del algoritmo de Phong)
    • Material Toon (Aquél que da una aspecto cartoon a la malla).
    • Material Básico (Aquél que no se ve afectado por la luz)
  • Añadidos 2 algoritmos de cálculo de luz
    • Gouraud
    • Phong
  • Generador dinámico de Shader y gestor de Shaders con cache.
  • Gestor de Texturas con cache.
  • Los materiales tienen la posibilidad de realizar el cálculo de luz por un lado o por ambos lados invirtiendo las normales

Aquí dejo un pequeño ejemplo que he hecho con él.

http://angelluispg.es/AL3D/example/

El código aún no está disponible en mi repositorio pero desde la página web pulsando Control+U podéis ver el código fuente, si lo haceis veréis que la librería ALPhysics.js aún no está integrada en el proyecto.

El proyecto tiene una licencia MIT.

Incorporaciones próximas futuras:

  • Optimizador de escenas mediante Octree y BSP
  • Mapas normales y especulares
  • Skyboxes
  • Sombras
  • Cargador de mallas.

Tutorial 2 - Crackme en Visual Basic

Material

Como ya adelantamos en el tutorial anterior, en este tutorial nos dedicaremos a crackear programas en Visual Basic, que nos servirá como introducción al crackeo de este tipo de programas.

Nociones básicas sobre cracking en Visual Basic

  • Visual Basic no utiliza las API’s de Windows, sino que tiene sus propias librerías, estas librerías reciben el nombre de MSVBVM60 en el caso de la versión 6 y MSVBVM50 en el caso de la versión 5, en este tutorial nos centraremos en la función VbaStrCmp que supongo que significa Visual Basic Strings Compare y que sirve para comparar cadenas de texto

Esta vez usaremos un crackme hecho en Visual Basic y de autor desconocido, lo único que se es que hace referencia a la pagina web http://usuarios.lycos.es/sisar .

Abrimos el programa y vemos que nos da una serie de instrucciones

Crackme con fines educativos.

###############################

Trate de hayar un número de serie correcto o un KeyGen

Solución en: http://usuarios.lycos.es/sisar

Quedémonos con eso del Keygen, después veremos por qué, y bueno, con la gran falta de ortografía que ha cometido el autor.

Antes de empezar veamos en que lenguaje esta programado y con que compilador, aunque ya lo sabemos, pero es para coger costumbre, así que abrimos el PEiD y:

0

Vemos que esta programado en Basic y con el compilador Visual Basic 5 o 6 (en este caso es 6, debido a las librerías que utiliza, pero PEiD no sabe diferenciar )

Como hicimos en el tutorial anterior abriremos el crackme, meteremos los datos que nos pide y veremos si nos da mensaje de error o hay que tirar de las API’s para crackear:

1

Vaya, vemos que otra vez nos dan mensaje de error y por lo tanto tiraremos de las referencias de texto para crackearlo, en un principio, según las instrucciones que se nos da, nosotros tendríamos que intentar crackearlo rompiendo la puerta, haciendo una copia de llaves y creando una llave maestra, pues vamos a ello

Rompiendo la Puerta

Cargamos el programa en el OLLY y vamos a ver las string references (2º botón sobre donde aparece el código en ASM y luego Search for > all referenced text string) y alli vemos lo siguiente:

2

Vemos que encontramos el mensaje de felicitación y el de error, también vemos un número sospechoso que si lo habéis probado sabréis que no es el serial . Ahora haremos doble clic sobre el mensaje de felicitación o el de error, da igual cual, yo, por elegir uno, he elegido el de felicitación. Apareceremos en:

3

Arriba del todo esta el mensaje de felicitación y abajo el de error (si os fijáis ahora en vez de ASCII pone UNICODE, UNICODE es otro sistema de codificación más completo que ASCII ).

Si seguimos un poco más arriba del mensaje de Correcto vemos un salto condicional sospechoso y que además apunta hacia un lugar cerca del mensaje de error:

4

Podríamos poner un BreakPoint como hicimos en el anterior tutorial para estar seguros de si es ese el salto que nos interesa, pero es que estamos tan seguros de que es ese que yo por lo menos no lo pondré (Estoy seguro por que esto es un Crackme, y un salto condicional cerca de un mensaje de error/felicitación y encima apuntando hacia un lugar que esta cerca de un mensaje de error es MUY SOSPECHOSO ).

Bueno cambiamos el JE por JNE (bien seleccionando la línea y dándole al 2º botón y luego assemble o bien haciendo doble clic sobre el código en ASM del salto):

5

Ejecutamos el programa que tenemos cargado en el OLLY con F9 y….

6

Ya hemos vuelto a romper la puerta.

Haciendo una copia de llaves

Volvemos a cargar el programa vamos a las String references y volvemos a hacer doble clic sobre cualquiera de los 2 mensajes, yo volveré a hacer doble clic sobre el de felicitación y si miramos un poco mas arriba veremos la función VbaStrCmp, de la cual he hablado al principio del todo (en la parte inferior de la imagen se puede apreciar el mensaje de felicitación):

7

Así que pondré un BreakPoint sobre ella (Seleccionamos la línea y presionamos F2 o hacemos doble clic sobre la traducción hexadecimal del código ASM).

Ahora ejecutamos el programa con F9 y al meter los datos y darle a comprobar nos saltará el OLLYDBG y si miramos la ventana de los registros y las flags veremos:

8

Vemos que se comparan 2 cadenas de texto, “angel” que es el código que yo metí y “;=>?@AC” que es bastante sospechoso , así que lo probamos y…. (antes de probarlo habrá que quitar el BreakPoint volviendo a hacer doble clic sobre el o pulsando doble clic sobre él o dándole al botón que pone una B y que esta debajo de los menús de file, view y todo eso y que es el 7º empezando por la derecha, y en la nueva ventana elegimos el BreakPoint y le damos a Remove) o sencillamente ejecutamos el programa sin el OLLY, es decir, haciendo doble clic sobre el programa.

9

Creando la llave Maestra

Como tengo una mente curiosa vuelvo a hacer el proceso de la copia de llaves con distintos nombre (o sencillamente si ese proceso os parece muy largo, probad diferentes nombres con el código que hemos sacado antes) y ¿que es lo que veo? Pues veo que el serial no cambia, que es siempre el mismo, es decir, que nos han vendido un Hardcoded camuflado como un Nombre/Serial, o sea, que de Keygen nada por que el serial es siempre el mismo (de ahí la alusión que he hecho al principio del tutorial ). Pues aparentemente nuestro trabajo ha acabado, ya no podemos hacer nada a este Crackme, pero como no nos gustan las mentiras y somos un poco vaguetes vamos a hacerle unas reformas al Crackme.

Reforma número 1

Al abrir el crackme aparece este texto:

Crackme con fines educativos.

###############################

Trate de hayar un número de serie correcto o un KeyGen

Solución en: http://usuarios.lycos.es/sisar

Vamos a borrar de ahí la siguiente parte: “ o un KeyGen” por que es eso no es cierto!

Volvemos a cargar el Crackme y vamos a las referencias de texto y pinchamos sobre la de error o felicitación, yo volveré a pinchar sobre la de felicitación, ahora aparezco sobre el mensaje de felicitación y hago clic con el 2º botón y luego le doy a Follow in dump > Selection y apareceremos en:

10

Nos olvidamos de eso y subimos un poco en el Dump hasta llegar a la posición de memoria 004013D0 en donde vemos lo siguiente:

11

¿Os suena? Es lo que aparecía en el cuadro de texto, ahora seleccionaremos la parte que queremos eliminar:

12

Para hacer la selección pincho sobre el Byte 6F y sin soltar el clic de ratón voy arrastrando hasta llegar a 6E, Luego hago clic con el 2º botón sobre el Dump y elijo Binary > Edit e intento borrar las letras en la sección donde pone ASCII, pero veo que no puedo ¿por que? Vemos que abajo pone Keep Size que es para mantener el tamaño, lo deselecciono y ya si puedo suprimir, lo borro y doy clic en OK y veo que los cambios no se guardan. No Problem aquí entra en juego la observación, vemos que los lugares donde no se guardan datos en el Dump se rellenan con 00 así que en vez de intentar editar la sección ASCII editaremos la sección Hex + XX (pongo XX por que depende de la posición) rellenándola entera de 0’s y teniendo activada la casilla de Keep Size

13

Ahora presiono OK y los cambios si se guardan en el DUMP

Reforma número 2

Me he dado cuanta que es bastante engorroso tener que borrar lo que aparece en las cajetillas de texto del nombre y del codigo, es decir:

Introduzca su nombre

Introduzca el código

Ya podrían haberlo dejado en blanco si arriba ya nos dice que introduzcamos nombre y serial (poniendo el nombre delante del serial)

Como no nos gusta tener que borrarlo por que somos vagos pasaremos a eliminarlo permanentemente, así que vamos al DUMP esta vez en vez de deciros yo la posición de memoria vamos a utilizar la función de Search for > Binary String así que nos dirigimos al DUMP hacemos clic con el 2º botón y nos vamos a Search for > Binary String allí escribimos “Introduzca su nombre”

14

Dejamos entire block seleccionado y en este caso Case sensitive nos da igual (sirve para distinguir entre mayúsculas y minúsculas pero como es un programa pequeño este crackme nos da igual), damos a OK y apareceremos en:

15

Y ya vemos como arriba está también el texto de “Introduzca su código” la palabra código sale un poco extraña (en el DUMP) por que lleva tilde , así que con esto de Introduzca su nombre seleccionado, damos clic con el 2º botón y vamos a Binary > Edit y la sección HEX la rellenamos entera de 0’s, damos a OK y ahora haremos lo mismo con lo de “Introduzca su código” que esta justo arriba, lo seleccionamos y vamos a Binary > Edit y la sección HEX la rellenamos de 0’s, hecho todo esto nos debería de quedar así el DUMP:

16

Para hacer los cambios permanente seleccionamos todos los cambios que hayamos hecho en el DUMP (arrastrando y de esta manera por cojones también tendremos que seleccionar otras cosas que no hemos modificado pero bueno no pasa nada ), pulsamos con el 2º botón en cualquier parte del Dump y elegimos Copy to executable ahora nos saldrá otra nueva ventana de DUMP en donde volveremos a hacer clic con el 2º botón y elegiremos Save file y le ponemos otro nombre para no sobrescribir el crackme original 😉 yo le he puesto Crackme1mod, abrimos el Crackme a ver si ha funcionado la cosa y….

17

Pues vemos que efectivamente funciona.

P.D el siguiente hardcoded será el último de los fáciles.

P.D cuando tenga internet me meteré en la pagina que aparece en este crackme a ver si propone otra solución.

19 de Agosto de 2007

Hardcoded serial

Material

En este primer tutorial emplearemos un crackme con una protección de Hardcoded hecho por RedH@wk para Crackslatinos (concretamente para un curso de Ricardo Narvaja)

Antes de nada veamos unas nociones básicas sobre hardcoded

  • Este sistema de protección utiliza un código que esta dentro del programa

  • A veces os podréis encontrar ese código en las string de referencia, pero no las probéis hasta que no estéis seguros por que algunos programadores ponen códigos falsos que al ingresarlos se ejecuta un código maligno para evitar mentes curiosas

Bueno ya podemos empezar este tutorial, en este tutorial crackearemos el programa de las 2 formas que existen para un hardcoded: Romper la Puerta y Hacer una copia de las llaves.

Antes de nada vamos a ver con que lenguaje esta programado y que compilador se ha usado en este programa, así que abrimos el PEiD y le damos al boton de “…” para cargar el programa y vemos lo siguiente:

0

Vemos que esta programado en ASM y con el compilador MASM32/TASM32, hecho esto ya podemos empezar

Rompiendo la Puerta

Primero abriremos el programa y veremos como se comporta, veremos que hay 2 botones y una caja de texto, metemos un serial cualquiera en la caja de texto y aceptamos y vemos que nos sale lo siguiente:

1

Bueno vemos que nos sale un mensaje de error, ya tenemos algo de lo que tirar para parchear el programa (si no saliese nada tendríamos que usar las API’s), vamos al OLLYDBG (File > Open) y abrimos el programa y en el lugar donde sale el código en ASM hacemos clic con el 2º botón Search for > all referenced text String

2

Y vemos como nos aparece el mensaje de error:

3

Así que pinchamos 2 veces sobre él y nos llevará a:

4

Ahí vemos el mensaje de error que en realidad empieza en la dirección de memoria: 00401074 y vemos que justo debajo esta el mensaje de felicitación, y vemos que en ambos mensajes pone al final algo de MessageBox que es una API que lo que hace es crear el cuadro del mensaje. Y también vemos que encima de los mensaje de error tenemos un salto y una comparación (podemos probar ya a cambiar ese salto pero preferimos estar seguros de que ese es el salto condicional que nos interesa, así que sigamos), para estar seguros de que es ese el CMP que nos interesa vamos a poner un BreakPoint, para ello pulsamos sobre la línea del CMP y pulsamos F2 o bien hacemos doble clic pero sobre la traducción en hexadecimal, en este caso 3BDA, y vemos como se nos pone en rojo la dirección de memoria:

5

Ahora pulsamos F9 o vamos a Debug > Run o bien le damos al botón que tiene forma de Play debajo de los menús ( el 4º empezando por la izquierda), de esta manera se ejecutará el programa (si no lo veis minimizad todo, que este programa no aparece en la barra de tareas) volvemos a poner un serial cualquiera y apretamos Verificar y nos llevará al OLLY (Si no se pone la pantalla del OLLY automáticamente restauradlo desde la barra de tareas) esto quiere decir que ese CMP se lleva acabo al apretar el botón verificar por lo tanto es el responsable de comparar el serial correcto con el falso, así que procederemos a parchearlo, nos ponemos encima de la línea del salto condicional y vemos esto:

6

Vemos que nos dice que si EBX y ECX son iguales el programa saltará (Vemos como se nos muestra una línea que indica la dirección de memoria 00401087 que es donde saltará si se produce ese salto) al mensaje de felicitación, ahora si, vamos a parchearlo, procederemos a cambiar el JE por JNE o JNZ (que ya hemos visto en el manual anterior que es lo mismo), es decir, saltará al mensaje de felicitación si EBX y EDX NO son iguales, así que para parchearlo hay 2 posibilidades, o bien hacemos doble clic sobre el texto (lo que sale en amarillo) y allí hacemos los cambios, o seleccionamos la línea hacemos clic con el 2º botón y elegimos Assemble y ahí hacemos los cambios (Vemos como el 74 se ha cambiado por 75), ahora quitamos el BreakPoint anterior (para ello podemos hacer doble clic de nuevo sobre las instrucciones en hexadecimal o bien hacemos clic sobre el botón B que esta debajo de los menús [el 7º empezando por la derecha] de esta manera se nos mostraran todos los BreakPoint que hemos puesto, elegimos el que queramos quitar hacemos clic con el 2º botón sobre el y elegimos Remove) y ejecutamos de nuevo el programa (F9 o las demas opciones que expliqué antes)

7

Y ya hemos roto la puerta.

Aclaración: En la parte teórica (que fue el manual 1) expliqué que para parchear había 2 formas mas (la de los NOP’s y la de hacer operaciones que dejen el programa como estaba, como por ejemplo las instrucciones INC y DEC), en este caso no podremos hacerlo ¿Por qué? Un programa ejecuta las instrucciones se realizan desde arriba hacia abajo

6

Si en este caso empleásemos ese camino veremos como realiza la comparación, pasaría por los nop’s (o por las instrucciones que dejan el programa como estaba antes) sin hacer nada y llegaría la zona de mensaje de error por lo que no conseguiríamos nuestro objetivo (si el mensaje de felicitación estuviese encima del de error si nos serviría) :latigo:

Ahora para guardar los cambios de forma permanente lo podemos hacer desde un editor hexadecimal o desde el mismo OLLY. En este caso lo haremos desde el OLLY.

Pinchamos sobre cualquier parte de donde se muestra el código ASM, hacemos clic con el 2º botón y elegimos Copy to executable > all modifications (aunque solo hayamos realizado un cambio) en el siguiente cuadro elegimos Copy all y nos aparecerá otra ventana dentro del OLLY en esa ventana hacemos clic con el 2º botón y elegimos Save File y elegimos otro nombre diferente al original para no sobrescribir y guardamos.

Haciendo una copia de llaves

Cargamos de nuevo el Crackme, hacemos lo propio para ver las String referencias (en el lugar donde sale el codigo en ASM hacemos clic con el 2º boton Search for > all referenced text String) y demos doble clic de nuevo sobre el mensaje de error, apareceremos sobre el mensaje de error y si miramos mas arriba vemos otra API que se llama GetDlgTextItemA (esta API sirve para obtener el texto), así que colocaremos un BreakPoint (ya sabéis como hacerlo) por que sospechamos que esa API es la responsable de coger el texto que nosotros metemos para compararlo con el serial correcto.

8

El BreakPoint se puede poner al inicio de la API (como me gusta hacer a mi) o sobre el CALL (que al fin y al cabo ahí es donde empieza realmente la API), una vez puesto el BreakPoint ejecutamos el programa con el F9 (si no veis el programa minimizad todo) metemos un texto cualquiera y le damos a verificar, ahora el programa parará y nos iremos al OLLY y tracearemos un poco (para ello tenemos 2 botones, el F7 si queremos entrar dentro de los CALL’s cuando los haya, o el F8 si no queremos entrar en los CALL’s) y nos vamos fijando en todas las ventanas del OLLY, traceamos un poco saltándonos la call de la API GetDlgItemTextA (con F8) y vemos que debajo hay 2 MOV’s el 1º mueve un valor a EBX y el segundo mueve otro valor a EDX y debajo esta la comparación, así que suponemos que los valores que se mueven a EDX y EBX son los de nuestro serial cualquiera y el del serial correcto.

Vayamos a examinar el primer MOV pulsaremos F7 o F8(para saltarnos el call de la API) y nos colocamos sobre el mov, debajo de donde se muestra el código en ASM y encima del DUMP encontramos esta ventanita (puede ser que la tengáis que hacer mas grande por que a veces al iniciarse el OLLY aparece muy pequeña, casi escondida)

9

Vemos que se mueve el valor 506C6452 a EAX (Esta claro que eso es uno de las 2 serial, ¿pero como sabemos cual es? Hay 2 maneras, una corta y otra larga, pero como es mejor saberlo todo voy a explicar las 2 formas)

Forma larga

Los procesadores Intel usan little endian, así que pone los números hexadecimales al revés, es decir, el numero 506C6452 realmente es: 52646C50, veamos cual es el valor ASCII de este número Hexadecimal, abrimos la calculadora de Windows, vamos al menú Ver > Científica (De esta manera vemos que aparecen mas opciones) a la izquierda del todo, debajo de donde metemos los numero marcad Hex (y vemos como las letras desde la A hasta la F se activan) ya que el número que vamos a introducir es hexadecimal, e introducimos las 2 primeras cifras (en hexadecimal 2 cifras siempre son una letra/símbolo/número en ASCII) que en este caso es 52.

10

Aclaración: Si, si, esta es la calculadora de Windows, lo que pasa que en el campo tengo un Windows modificado y esta calculadora es una versión Plus

A continuación marcamos la opción de Dec (de decimal) y el número se nos transformará a decimal, que es 82, ahora vamos al bloc de notas y mientras apretamos ALT pulsamos las tecla 5 y 2 (el 5 y el 2 no a la vez, mientras tengáis pulsado ALT pulsáis primero 5 y luego 2, si no os va con la numeración de arriba de las letras probad con los números de la derecha del teclado :latigo: ), y vemos que se escribe una “R” si convertimos el siguiente número a hexadecimal que es 64, nos saldrá que en decimal es 100, hacemos lo del ALT y nos escribe “d” (en el código ASCII hay que distinguir entre minúsculas y mayúsculas) y si seguimos así, la siguiente letra será “l” y la siguiente será “P”. Vamos que ese serial es RdlP y como supondréis es el que introduje yo, es decir, el incorrecto, así que sabemos que en EBX se guarda nuestro serial y lógicamente en EDX se guardará el serial correcto.

Nota: El proceso de conversión de hexadecimal a decimal no se tiene que hacer a la fuerza con la calculadora de Windows, puedes usar cualquier otra que permita conversiones entre sistemas numéricos o incluso realizar la conversión a mano, y tampoco hace falta hacer lo del ALT, hay tablas del código ASCII por la red (lo que pasa que en el campo no tengo Internet y no me se la tabla de memoria)

Forma corta

En el lugar donde se nos mostraba los valores que se iban a mover, nos situamos sobre DS:[0040300C]=506C6452 (cuando un numero aparece entre [] significa que es una posición de la memoria y en este caso significa que la posición de memoria [0040300C tiene el valor 506C6452) pulsa sobre él con el 2º botón y elegimos Follow in Dump:

11

Y apareceremos en:

12

Ahí vemos como es efectivamente RdlP.

Ahora pinchamos sobre el 1º mov (si es que no lo estábamos ya) y pulsamos F7 para tracear y llegamos al 2º mov (que como ye hemos deducido es donde se moverá el serial correcto) y miramos nuevamente abajo y vemos lo siguiente:

13

Se moverá la posición de memoria 0040204B que contiene el valor de 38393839 al registro EDX. Y sigamos el camino que sigamos (la conversión manual o 2º botón en DS:[0040204B]=38393839 y luego Follow in Dump) daremos con la misma solución.

P.D Lo cierto es que me ha quedado bastante largo este tutorial, pienso que es por que al ser el primero he explicado con muchos detalles como hacer cosas como poner los BreakPoint’s como ejecutar el programa, como modificar el código ASM, etc.… espero que el próximo sea mas corto.

18 de agosto de 2007