JavaSnoop – Debugging aplicaciones Java

Recientemente hemos utilizado una herramienta muy interesante para analizar applets Java: JavaSnoop, desarrollada para la BlackHat USA de 2010 por Arshan Dabirsiaghi. A grandes rasgos, la herramienta nos permite adherirnos (attach) a un proceso Java o arrancarlo e interceptar las llamadas que se realizan. Además de interceptar estas llamadas y ver su contenido, nos permitirá modificar los argumentos de los métodos que estamos interceptando y modificar el valor de retorno de la función.

A continuación, veamos cómo interceptar un método de un applet Java:

1. Descargamos la última versión de la aplicación: http://code.google.com/p/javasnoop/downloads/list

Nota: Se recomienda dejar la aplicación en un directorio que no contenga espacios en sistemas Windows (ej. C:\JavaSnoop).

2. Descargamos la última versión de Java SDK (se requiere reinicio tras la instalación).

3. Fijar la ubicación del binario JAD en “Settings > Manage JAD > Set jad path”. Descargarlo del sitio web del autor. Esto nos permitirá decompilar las clases.

4. Nos aseguramos que esté creada la variable de entorno JAVA_HOME para nuestro usuario.

5. Para que no tengamos problemas con los permisos, JavaSnoop a la hora de realizar la inyección (hooks) nos ofrece en la carpeta Resources el fichero unsafe.policy. Copiaremos este fichero a %USERPROFILE%\.java.policy. En este directorio deberá encontrarse un fichero .java.policy. Tras nuestro análisis es recomendable restablecer la configuración inicial siempre.

6. Es aconsejable activar el Debug en la consola de Java y que esté siempre activa para ver los mensajes.

7. Es muy importante el orden en el que se arranca JavaSnoop y la aplicación java. Con algunos applets es estrictamente necesario que JavaSnoop esté arrancado antes de lanzar el navegador.

8. Una vez arrancado JavaSnoop utilizaremos la funcionalidad “An exisiting process”. En este caso vemos el PID 184 que es un applet que hemos arrancado en Internet Explorer. Pulsamos en el botón de Attach para adherirnos al proceso 184:

9. Una vez nos hemos adherido al proceso, vamos a configurar un “New hook” para ello pulsaremos (o haremos clic) en el botón “Add new hook”. Si no sabemos aún con que clase y qué método queremos hacerle el hook, nos dirigimos a browse (hacemos clic en Browse) y nos abrirá una nueva ventana en la podremos seleccionar la clase que queramos.

A continuación seleccionamos el método que nos interesa:

Una vez seleccionados, la clase y el método, volveremos la pantalla principal:

En esta pantalla de la aplicación, si hemos seleccionamos el método (punto 1) podremos parametrizar las acciones que va a realizar JavaSnoop. Así pues le podemos decir que en tiempo de ejecución nos imprima los parámetros cuando se vaya a invocar el método, que nos imprima el contenido de la pila, que podamos modificar los parámetros que se le pasan a la función y los valores de retorno. (puntos 2 y 3).

10. También podemos ver características del proceso al que nos hemos adherido (attach) en el menu Actions.

Con estos pasos ya estamos preparados para interceptar cualquier aplicación Java de una manera sencilla y rápida.

Comments

  1. Interesante.

    Yo hace poco he tenido que hacer algo parecido, mediante la técnica LDW (Load Time Weaving) y aspectos, para interceptar la ejecución de cualquier método / constructor o solamente los interesados, mediante la definición del punto de corte. ;)

  2. Buenas Nedim,

    Le pegaré un vistazo a la técnica LDW.

    Gracias ;-)