Sunday, October 6, 2013

Deshacer las .apk para obtener el "source code" de una aplicación Android

¡Buenas de nuevo! (Y perdón por todo el tiempo sin posts, tengo un tiempo muy limitado para escribir).

Hoy voy a hablaros de como obtener el código fuente (o como se conoce más comúnmente, el source code) de una .apk. A veces, yo, como desarrollador de aplicaciones, me gusta "espiar" (sí queréis el término que yo uso, es "mirar el trabajo de los otros para aprender y aplicarlo al mío propio", pero que vamos, viene a ser lo mismo) el trabajo de los demás. Pero hay una barrera, que se llama .apk. Que yo sepa, no existe ningún editor de código que pueda leer los .apk y abrirlos como si fuera un source code, para poder leerlos, y por eso, tenemos que usar técnicas un poco más "oscuras" y deshacer esos .apk para convertirlos en source code.

Bien, demasiada explicación aburrida, vayamos manos a la obra.
¿Qué vamos a necesitar?

  • Un programa que se llama apktool (¿original, eh?). La copia que os doy es una preparada por mí :).
  • Otro programa para leer el source code (Yo usaré Eclipse configurado con el ADT de Android (o si queréis ahorraros todo el paso de intalar el JDK, y las ADT y todo, usad el ADT-Bundle de Android)). Vosotros podéis usar Netbeans o lo que queráis.
  • Descargar el .apk que queramos descomprimir.
  • Otro programa para leer .jar y descomprimir las clases. Yo uso el JD-GUI.
Bien, empecemos instalando el apk tool. Ya que es un poco "complicado", os voy a enseñar cómo se hace. 
  1. Nos descargamos el archivo que he preparado (este).
  2. Lo descomprimimos y ponemos la carpeta en C:\Windows.
  3. Y ya está. No era tan complicado, ¿eh? ;).
Vamos a usarlo. Os he dejado dos archivos preparados. Uno que se llama cmd.lnk y otro que se llama Procedure.txt. Procedures es por sí alguna vez tenemos alguna duda de lo que debemos hacer.

Os voy a explicar como funciona. Voy a usar una app propia que hice para un amigo que se llama Drama Button y que podéis descargar, si queréis, aquí (es una tontería realmente, pero es divertida). Empecemos.

  1. Ejecutamos el cmd.lnk como administradores (Click derecho -> Ejecutar como administrador).
  2. Os debería salir una línea de código que ponga C:\Windows\apktool1.5.2>. Si no os sale, escribís "cd C:\Windows\apktool1.5.2" y le dais a enter. 
  3. Una vez aquí, es útil copiar y pegar el archivo que queremos descomprimir dentro de la misma carpeta del apktool. Cuando lo tenemos dentro, escribimos apktool d NombreDelArchivo.apk. Como ya os he dicho, en mi caso estoy usando una app que se llama DramaButton.apk, así que se vería así: 
    CMD en el paso 3
    CMD en el paso 3.
  4. Ejecutamos y obtenemos una carpeta:
  5. CMD y Carpeta nueva en el paso 4
    CMD y Carpeta nueva en el paso 4
  6. Ahora vamos a ejecutar el siguiente comando para obtener las clases de la app. Escribimos jar xvf NombreDelArchivo.apk classes.dex y se nos creará un archivo que se llamará classes.dex 
    CMD y classes.dex en el paso 5
    CMD y classes.dex en el paso 5
  7. Es raro que alguien conozca que es el archivo .dex, así que vamos a pasarlo a .jar para poder pasarlo al JD-GUI y poder leer las clases. Escribimos dex2jar classes.dex y se nos crea un archivo que se llama classes_dex2jar.jar. 
    CMD y classes_dex2jar.jar en el paso 6
    CMD y classes_dex2jar.jar en el paso 6
  8. Abrimos el JD-GUI y arrastramos el archivo classes_dex2jar.jar al programa. Veremos esto: 
    JD-GUI
    JD-GUI
  9. Damos doble click en "MainActivity" y se nos abre. Ahora si queremos llevarlo a Eclipse para unirlo con los res, le damos a "File->Save All Souces" y lo guardamos cómo y donde queramos. Lo descomprimimos y vamos a la carpeta que se nos ha creado en el paso 4 (C:\Windows\apktool1.5.2\NombreDelArchivo) y creamos una carpeta que se llame src. Copiamos y pegamos las carpetas del zip que nos ha creado el JD-GUI. 
  10. Ahora simplemente, abrimos Eclipse, le damos a "File->Import" y se nos abre una ventana. Vamos a la carpeta Android y le damos a "Existing Android Code Into Workspace". Clicamos en next, y como root directory pondremos el de la aplicación extraída, es decir: C:\Windows\apktool1.5.2\NombreDelArchivo. Se nos creará un project nuevo y tendremos ahí los res y el código. 
  11. Nota final: Muchas veces hay errores de compatibilidad o de archivos que faltan o lo que sea. El apktool no es perfecto. Yo recomiendo leer los archivos de java desde el JD-GUI, ya que es lo mismo y es más cómodo. Pero esto ya, a vuestra elección.
En unos 5 minutos si somos lentos y vamos leyendo y haciendo poco a poco, hemos obtenido el source code de cualquier aplicación que queramos ver. 

A mí me ha ayudado muchas veces para ver cómo la gente programa las cosas y espero que os sea útil a vosotros también.

Muchas gracias por leerme un día más.

¡Saludos a todos!
finish(); ;)

Saturday, September 14, 2013

Seguimiento de links mediante cookies

Supongo que a veces habréis entrado en un Tumblr y os habrá empezado a sonar música. Muchas veces es música preciosa, y los creadores de la página tienen una lista de reproducción entera de música que escucharíamos horas y horas. Normalmente, estas playlists son creadas con un pluggin llamado SCM Music Player.
*Voy a usar un blog, pero no os voy a dar la URL por privacidad :). 

Reproductor y playlist
Aquí podemos ver el reproductor y la playlist.
El otro día me pasó a mí y quise descargarme la música que tenía puesto ese blog. Así que empecé a buscar.
Mi primer intento fue dar clic derecho al elemento de la playlist y guardar como, pero con esto solo conseguía bajarme el source code de la web(el source code es todo el código que forma una web. Usando Chrome, podéis darle a Control + U para verlo, o bien ir al botón de arriba a la derecha (que son como tres barritas horizontales), poner el ratón encima de "Herramientas" y clicar en "Ver código fuente").

Como este primer intento no funcionó, decidí buscar en el código ese elemento de la playlist, a ver si encontraba un link hacia el archivo de sonido. Para buscar un elemento determinado del código, Chrome nos permite "Inspeccionar Elemento", así que le daremos clic derecho al elemento de la playlist y clicaremos en "Inspeccionar elemento". Se nos abrirá el inspector y encontramos esto:

Código de los elementos de la playlist
Observamos en el código cada elemento de la playlist (separado en un rectángulo rojo)
No había link. Me llevé una pequeña decepción al ver que me iba a costar un poco más desenterrar esa tan deseada canción. Os voy a guiar un poco en lo que pone en el código: 
<li class="item focus odd" data-bind="
visible:isValid(),
click:$root.play,
css:{focus:on, even:$index()%2==1, odd:$index()%2==0}
">
<span class="title" data-bind="text:title">.</span>&nbsp;
</li>

 Tenemos un <li> que define una lista (li viene de "list"). Dentro, llama a una clase (item focus odd), y básicamente dice que es visible (visible:isValid()) y que si se clica, que se reproduzca (click:$root.play).
Luego tenemos un <span>, que define un espacio a rellenar en el código, aquí el de un título (<span class="title" data-bind="text:title">.</span>. Entre > y < encontramos . . Este es el título que se le puso a la canción para que se viera en la playlist.)

De aquí me di cuenta de que probablemente el link estuviera oculto, así que me puse a pensar un poco. Si os fijáis hay una pestaña en el inspector que se llama "Network". Esto básicamente son todas las entradas y salidas solicitadas a la web, así que podemos monitorizarlas, y ver a donde manda la petición el código cuando le damos al play (¿Tiene sentido, no? Es decir, estamos pidiendo que reproduzca algo, ¿pero el qué? Este qué es lo que pide la web a otra web para reporducir, y lo que nosotros podemos controlar a través de la pestaña "Network").

Si le damos al play veremos que en la pestaña empiezan a aparecer cosas.
Pestaña "Network"
La pestaña "Network" y los datos que nos proporciona.
Si clicamos en ese "Path", nos encontraremos con un montón de datos, pero no os asustéis, nosotros solo buscamos dos: el "Request URL" y el "Request Method". 
Request URL y Request Method, dentro de Network
Request URL y Request Method resaltados para que los veáis mejor.
Primero nos fijaremos en el Request Method. Ahí pone GET, lo que quiere decir que está pidiendo algo y lo está obteniendo. ¿Qué está pidiendo? La URL que sale arriba.

Ahora, si intentáramos reproducir la URL que sale, no podríamos, porque nosotros cuando vemos un vídeo pedimos ver el vídeo, así que, por mucho que copiemos y peguemos el link en la barra del navegador, no nos va a llevar a ningún sitio, ya que estamos pidiendo un request, y no un vídeo.  Pero, sí que vemos que es un vídeo de Youtube, lo cual nos facilita todo el proceso de encontrar el vídeo.

Los vídeos de Youtube funcionan con una ID propia para cada vídeo, que se asigna al mismo en el momento en el que se sube a la página. Si os paráis un segundo a mirar el link vemos que la ID está ahí.

http://s.youtube.com/stream_204?event=streamingstats&ns=yt&bh=2841.063:50.023&scoville=1&ei=f3Y0UvzjDIW_8QPp5IHQCQ&el=embedded&docid=h2MPBdBNU9A&vps=2841.063:PL&df=2841.063:156&fmt=134&bwm=2841.063:2084316.000:5.095&cpn=ezfA4A00VP2RdULh
También, si alguna vez os habéis parado a mirar como funcionan las URLs de Youtube veréis que siempre son así :
https://www.youtube.com/watch?v=[ID]
 Así que, ya pude ver mi canción en Youtube. Y estaba super feliz. Pero... luego me quedé pensando y, la verdad, no podía ser que fuera tan difícil. Es decir, SCM Player te obliga a poner el link de las canciones en el código. Así que... corrí a la web, le dí a Ctrl + U y luego busqué (Ctrl + F) "SCM Music Player", para ir a la parte del código donde empieza el pluggin. Y, efectivamente, tampoco era tan difícil.
Precioso fail por mi parte.
Precioso mi fail, ¿eh?
La conclusión que saco de esto es que primero debería examinar bien el código fuente antes de ponerme a hacer cosas raras.

De todos modos aprendí a hacer seguimiento de requests mediante cookies, que nunca está de más, ¿no?

¡Saludos a todos!



¡Abrimos blog!

#include <stdio.h>
   int main(void){
      printf ("¡Hola Mundo!");
   }
¿Nunca se hace viejo el empezar un blog de informática con el típico "Hola Mundo" en C, verdad?
Bueno, os presento un poco qué va a ser esto y quién soy yo.


  • ¿Qué va a ser esto?

No pretendo escribir ningún blog sobre algo en concreto, sino que tocaré cualquier cosa que haya descubierto o vea interesante. Esto significa que puedo escribir un día sobre... qué se yo, cookies básicas, o como "tracear" cookies (ahora que lo pienso, un pequeño diccionario de palabras que se usan por estos lares también estaría bien), y otro día puedo escribir sobre como añadir RAM a tu ordenador. Intentaré hacer todos los posts  al alcance de todo el mundo, es decir, que cualquier persona, sin importar los conocimientos de informática que tenga, pueda entenderlo.
También voy a escribir sobre algo en concreto si alguien me hace una petición especial :D.


  • ¿Quién soy yo?

Si cotilleáis un poco en mis sitios web veréis que soy un estudiante de matemáticas (actualmente), y que empecé a tocar ordenadores a los doce años. Aprendí sobretodo programación web (HTML, CSS y un poco de Javascript), y luego me pasé al diseño gráfico. La verdad es que nunca me he estado quieto en un area, y mientras aprendía javascript, también aprendía a modelar en 3D.
Todos estos años de toquetear me han dado una base suficiente para poder empezar a explicar cosas a los demás (y seguir avanzando en mi propio aprendizaje).

Curiosidades sobre mí:
 - Probablemente estudie un doble grado Ingeniería informática / Matemáticas.
 - Me gusta dibujar (hace mucho que no lo hago, pero).
 - Actualmente se programar en Java y C, pero estoy aprendiendo C++ y Python.
 - Mi habilidad como programador se basa en desarrollo de software (general), motores gráficos (OpenGL) y programas de cauce matemático.



Y... supongo que esto es todo. Si tenéis alguna duda tenéis mi twitter por ahí arriba para contactar conmigo.
Muchas gracias ¡y disfrutad del blog!