Nota del autor

Si la entrada que estás leyendo carece de imágenes, no se ve el vídeo que teóricamente lleva incrustado o el código fuente mostrado aparece sin formato, podéis conocer los motivos aquí. Poco a poco iré restableciendo la normalidad en el blog.
Este blog es un archivo de los artículos situados previamente en Lobosoft.es y ha dejado de ser actualizado. Las nuevas entradas pueden encontrarse en www.lobosoft.es. Un saludo,
Lobosoft.

jueves, 20 de mayo de 2010

Primeros pasos con Reflexil (2)

En la entrada anterior veíamos cómo era posible utilizar Reflexil como plugin de Reflector para modificar el valor de una variable, en concreto la que comprobaba nuestra aplicación de ejemplo para permitir el acceso del usuario a la misma. Hoy veremos cómo es posible incluir código propio en un ensamblado .NET para modificar el funcionamiento de la aplicación (inyección de código).

Deseamos que, cuando el usuario haya accedido al programa “crackeado” este realice una serie de acciones; en el ejemplo consistirá únicamente en mostrar un mensaje en pantalla pero podría tratarse de cualquier tipo de comportamiento inesperado. Para ello, creamos una DLL que contiene el siguiente código, la compilamos y la llevamos a la carpeta donde tenemos nuestra aplicación “ContaConta”.

[csharp]
namespace EjemploReflexil
{
public class Sorpresa
{
public static void Infectar()
{
MessageBox.Show("¡Pardillo!", "Sorpresa",
MessageBoxButtons.AbortRetryIgnore,
MessageBoxIcon.Exclamation);
}
}
}
[/csharp]

Partiremos del ejecutable que obtuvimos en la entrada anterior tras sustituir el valor de la contraseña por una cadena vacía (ContaConta.Patched.exe), incluyéndolo en Reflector. El usuario ahora espera utilizar el programa modificado para no tener que introducir contraseña alguna. Cuando el usuario introduce la palabra esperada (ninguna en este caso), la aplicación ejecuta un método que muestra un mensaje de bienvenida. Vamos a insertar una llamada a nuestro método Infectar() de la clase Sorpresa justo cuando esto ocurra.

Lo primero que debemos hacer es incluir una referencia a nuestro ensamblado (Sorpresa.dll).


Damos simplemente el nombre del ensamblado que, recordemos, se encuentra en la misma carpeta que nuestra aplicación:


Reflexil nos avisa de que los cambios que realizamos sobre el código no son visibles de inmediato en las ventanas de Reflector, así que debemos salvar los cambios y proceder a recargar la DLL. Podemos hacerlo desde el menú contextual o en las opciones que habrán aparecido en la zona de trabajo del plugin.


Tras recargar la DLL vemos que el ensamblado aparece ahora referenciado:



Abrimos el código del método Hola(System.String) para proceder a incluir en él la llamada a Sorpresa.Infectar(). Nos situamos sobre la primera instrucción y seleccionamos la opción de crear una nueva operación. Será una llamada (MSIL call) al método que deseamos, de modo que configuramos en el cuadro de diálogo el tipo de operación y de operando.


Seleccionamos, dentro del ensamblado Sorpresa, el método que deseamos llamar


y guardamos los cambios indicando que inserte la operación antes de la que teníamos seleccionada para que esta nueva sea la primera que se ejecute. Ahora guardamos los cambios y ejecutamos la aplicación con el nuevo parche.


Tras pulsar cualquier botón terminaría la ejecución del código inyectado, por lo que la aplicación prosigue con la del código preexistente:


En próximas entradas veremos cómo podemos reemplazar por completo el código fuente de una determinada clase del ensamblado directamente en C# o Visual Basic.NET mediante la opción “Replace all with code...

Primeros pasos con Reflexil (1)

Una de las ventajas de los compiladores que generan código intermedio es que las aplicaciones resultantes (ejecutables y librerías dinámicas) pueden desensamblarse con facilidad, reconstruyendo el código en su lenguaje original. Con .NET Framework esto es posible, incluso, obteniendo el código fuente descompilado al cualquier lenguaje de la CLI (Common Language Infrastructure), como bien sabréis, así que realizar un ejercicio de ingeniería inversa sobre sus ensamblados es algo, a priori (y sin ofuscador mediante), bastante ilustrativo.

Utilizando una de las herramientas que no puede faltar en la particular mochila virtual de cualquier desarrollador .NET, Reflector, es posible no solo descompilar el ensamblado sino incluso reconstruir un proyecto de Visual Studio que permita editarlo y volver a reconstruirlo. Sin embargo, podemos llegar más allá. Es posible, además, editar desde el propio Reflector un determinado ensamblado y modificar su funcionalidad utilizando el plugin Reflexil. Desarrollado por Sébastien Lebreton, se trata de un proyecto de código abierto que podemos incluir como dentro de los add-in de Reflector para extender su funcionalidad permitiéndonos alterar la funcionalidad de un determinado componente de la correspondiente aplicación ya sea inyectando código (en MSIL, C# o Visual Basic.NET) o modificando alguna de sus propiedades. He estado “jugando” un poco con el plugin y me ha gustado tanto que he decidido traerlo al blog aunque sea, de momento, con una introducción muy básica a algunas de las características que podemos encontrar en él.

Partimos de una aplicación realmente básica que simula un formulario de autenticación de usuarios que permitiría acceder a la misma. En nuestro ejemplo simplemente mostrará un mensaje indicando si el usuario introdujo la contraseña correcta o no. El sistema de protección es realmente rudimentario pero nos servirá a título de ejemplo para comenzar a familiarizarnos con Reflexil.


Si no lo hemos hecho antes, deberíamos bajarnos la última versión del plugin de su página oficial e instalarlo (simplemente descomprimirlo y agregarlo a Reflector a través de su menú View->Add-Ins).


Agregamos el ejecutable (o DLL) que deseamos analizar y modificar; en nuestro caso, ContaConta.exe. Si activamos el plugin (Tools->Reflexil vx.y ) veremos cómo, al acceder a un determinado método, campo o propiedad, aparecen diversas opciones que permiten modificar su tipo, los argumentos recibidos e, incluso, su comportamiento.



Por ejemplo, nuestra aplicación comprobaba simplemente si el usuario introducía el texto necesario para permitirle el paso. Una posible modificación sería eliminar esta palabra de paso. Si nos fijamos en las instrucciones en IL del método que se encarga de hacer la comprobación (el propio delegado que se suscribe al evento del clic de ratón sobre el botón Acceder) veremos que comienza situando en la pila de evaluación una referencia al objeto System.String que contiene la cadena a comparar (operación ldstr) para, a continuación, recuperar el valor que contiene el cuadro de texto donde el usuario introduce la contraseña y realizar una comparación entre ambas. Vamos a editar la cadena para sustituirla por una vacía. Para ello, accedemos al menú contextual de la primera instrucción pulsando de ella con el botón derecho del ratón y accedemos a la opción Edit. Veremos un pequeño cuadro de diálogo desde el que es posible editar el tipo de operación a realizar así como los argumentos con los que es llamada. Borramos de aquí el texto del argumento y aceptamos.


Tras ver cómo ha sido eliminado el valor del parámetro en la lista de argumentos, si queremos comprobar que el cambio ha tenido éxito debemos guardar el ensamblado. Para ello, en el árbol de ensamblados de Reflector pulsamos con el botón derecho sobre ContaConta para acceder al menú Reflexil->Save As… y le dejamos el valor predeterminado (ContaConta.Patched.exe).


Si ejecutamos ahora la aplicación y pulsamos simplemente en el botón de acceso veremos cómo nos deja pasar.


En la siguiente entrada veremos cómo inyectar código propio en un ensamblado .NET existente.

martes, 18 de mayo de 2010

Inserción de vídeos en WordPress MU

Hace unos días estuve haciendo unas pruebas para migrar Lobosoft a un sistema WordPress MU (la versión multiblog de WordPress que, además, fue con la que comencé la andadura de Lobosoft en un principio para pasar con posterioridad a la que utilizo ahora). Finalmente no me será necesario usarla, pero durante el proceso de configuración de la misma tuve que recordar viejos conocimientos además de ampliar la configuración de WordPress MU para permitir la inclusión del código HTML necesario para que la importación de las entradas que incluyen algún vídeo finalizase con éxito. De no hacerlo así, WordPress limpiaba literalmente el HTML de la entrada eliminando cualquier posibilidad de incluir vídeos de servicios como YouTube o Google Vídeo, por ejemplo.


WordPress lleva a cabo un análisis del HTML que incluimos en una determinada entrada a través de la variable $allowedposttags, un array incluido en el archivo kses.php dentro de del directorio wp-includes de nuestra instalación de WordPress (o WordPress MU, como es el caso del ejemplo). Dicho array contiene, como su nombre indica, las etiquetas HTML permitidas dentro de las entradas del blog. El formato de dicho array (que, a su vez, contiene a otros) es “nombre de etiqueta” => valor, siendo el valor un array sin contenido cuando la etiqueta es un atributo HTML y un array con valores cuando se trata de una etiqueta HTML con atributos. En resumen, se forma una colección de estructuras arbóreas que representan la estructura de un tag HTML. A buen seguro con un ejemplo queda todo más claro. Veamos cómo es definida en $allowedposttags la etiqueta del enlace (anchor):


[php]
'a' => array(
'class' => array (),
'href' => array (),
'id' => array (),
'title' => array (),
'rel' => array (),
'rev' => array (),
'name' => array (),
'target' => array()
)
[/php]


Resulta sencillo ver aquí la estructura de la etiqueta para un link, así como comprobar que no se permite el uso de mapas de imágenes en las entradas de WordPress (a menos que nosotros nos encarguemos de extender el array, por supuesto).


Así, para permitir la inclusión de vídeos en las entradas simplemente tenemos que ampliar el array principal definido para la variable $allowedposttags con el código siguiente:


[php]
'embed' => array (
'id' => array (),
'type' => array (),
'style' => array (),
'height' => array (),
'width' => array (),
'wmode' => array (),
'src' => array (),
'object' => array (
'height' => array (),
'width' => array ()
),
'param' => array (
'name' => array (),
'value' => array ()
),
)
[/php]


Sencillo, ¿verdad?

lunes, 10 de mayo de 2010

!301

Quienes conocéis el blog desde hace un tiempo os habréis dado cuenta de la bajada que se ha producido en la cantidad y calidad de las entradas que lo componen. Lobosoft nació casi sin querer, fruto de un nombre que había usado desde antes de comenzar incluso a estudiar informática de manera formal y que adopté cuando los ciudadanos pudimos contratar dominios “.es” (anteriormente el acceso era exclusivo para las empresas y la administración). Como un proyecto inesperado, tuvo un tímido arranque seguido por un crecimiento, creo, bastante notable. Subió de PageRank en unos meses, y durante un verano el ritmo de las entradas llegó a ser frenético, de un par o tres al día. Sin embargo, tal vez por esto, quizás por mi propia efusividad y, en los últimos tiempos, sin duda por la falta de tiempo y algo de desidia, las entradas comenzaron a tocar temas inesperados o ciertamente muy limitados en el tiempo, como vídeos curiosos, enlaces a entradas que me parecían interesantes o noticias que tienen una temporalidad muy marcada. De este modo, el blog sobre desarrollo y seguridad informática fue convirtiéndose en un cajón de sastre (y un tanto desastre) donde todo tenía cabida.


Durante los últimos meses el ritmo de las entradas ha bajado a una al mes y, generalmente, se trataba de algún vídeo que en ese momento me llamaba la atención. Algunos de ellos, lo habréis visto, hacen referencia a los que siempre cité como mis orígenes en la informática, que no son otros que los de muchos de vosotros: los 8 bits y, en particular, nuestro querido Spectrum. A día de hoy, llamadme nostálgico, me apasiona seguir aprendiendo sobre y con estos ordenadores que, creo, tanto tienen que enseñar. Sin embargo, mostrar vídeos no ha sido nunca la intención del blog ni me parece una experiencia especialmente enriquecedora por sí sola.


A todo lo anterior podríamos sumarle que en este tiempo otros dos blogs han venido a sumarse a mi colección (me gusta escribir y no solo de informática, claro) y, sobre todo, que este año he emprendido una nueva aventura comenzando a estudiar, simultaneando con el trabajo, una nueva carrera universitaria, lo que ha restado tiempo y sumado obligaciones a mi ya de por sí escaso tiempo de ocio, lo que ha repercutido negativamente en el blog.


Por último, cabría decir que, modestamente, el blog se ha portado bien en mi ausencia. El ritmo de visitas no ha bajado de las 150 ó 200 diarias, pero claro, este es uno de los problemas que he encontrado en Lobosoft hasta hoy. Salvando a algunos lectores habituales, los que tanto habéis enriquecido al mismo (y a mí mismo) con vuestros comentarios, Lobosoft ha sido estos años un blog destino de “paracaidistas”, de personas que llegaban a través de los buscadores intentando localizar una solución a alguno de sus problemas, la encontraban (o no) y se marchaban tan en silencio como habían llegado. Escribo en el blog con ese ánimo, el de ayudar (y ayudarme a mí mismo, constituye un respaldo magnífico para la memoria), pero creo –y esto me lo han confirmado los otros blogs que mencionaba más arriba- que lo que más pone en valor a un blog son sus lectores y las aportaciones que hacen al mismo. Por eso, me habría gustado que Lobosoft hubiera sido un poco más el proyecto de muchos, más que de mí mismo.


¿Es esto una despedida? La verdad es que no. Aunque se me pasó por la cabeza incluso cerrar el blog o trasladarlo a un servidor gratuito, poniendo el dominio en parking (la afición me cuesta unos cuantos euros al año) finalmente he decidido no hacerlo, de momento. Es posible que durante este año el blog muestre la publicidad que nunca he deseado incluir a menos que pueda retomar un ritmo de escritura adecuado. ¿Por qué? Si sigue abierto únicamente para ofrecer los contenidos del pasado lo que espero, al menos, es que no constituya una carga económica (no sé si llegará a sustentarse con publicidad pero sí espero, al menos, que se reduzca un poco el coste de mantenerlo). Si consigo mantenerlo como merece no lo haría pero porque entiendo que me está ofreciendo otras satisfacciones, de índole personal y profesional, que lo compensan con creces.


En cierto modo, esta entrada constituye un antes y un después en la historia del blog. Me consta que en otros momentos ha habido editoriales similares, con la intención de "obligarme" a seguir en la brecha y que no han constituido finalmente el motor necesario para conseguirlo. Tal vez ahora sea distinto. Posiblemente a día de hoy sean Lobosoft y la vuelta al pasado que barruntan mis últimas entradas en él un intento de aferrarme a esta afición que terminó por constituirse en mi labor profesional y que, ciertamente, tanto me ha aportado en lo personal.


Si estáis ahí, bienvenidos a esta, a un tiempo, conocida y nueva aventura.

sábado, 8 de mayo de 2010

Ciencia y brujería


I think, fundamentally, open source does tend to be more stable software. It’s the right way to do things. I compare it to science vs. witchcraft.


In science, the whole system builds on people looking at other people results and building on top of them.In witchcraft, somebody had a small secret and guarded it but never allowed others to really understand it and build on it. Traditional software is likewitchcraft. In history, witchcraft just died out.


The same will happen in software. When problems get serious enough, you can’t have one person or one company guarding their secrets. You have to haveeverybody share in knowledge.


Linus Torvalds.

jueves, 6 de mayo de 2010

Una de música retro

Siguiendo en la línea de las últimas entradas frikies, una de música: la ZX Spectrum Orchestra y algún otro clip más disponible en la red. ¡Que lo disfrutéis!















Para terminar con la música de los maravillosos Fairlight creados por el desarrollador sueco Bo Jangeborg:





lunes, 3 de mayo de 2010

Vídeo en el Spectrum

Buscando información sobre la última versión disponible de BASin (un IDE para desarrollar aplicaciones para Spectrum (en BASIC, que no hay que perder los buenos gotos) desde plataformas Windows que me encanta por su sencillez y flexibilidad) me he encontrado con una demostración de la capacidad de nuestro pequeño gran ordenador y lo que puede lograrse con unos recursos limitados y mucho ingenio: vídeo streaming en tiempo real, con sonido y a pantalla completa leyéndolo desde una tarjeta SD gracias al potente interfaz divIDE que me ha dejado completamente pasmado:




Más información en la web oficial: http://divideo.zxdemo.org/