You are on page 1of 10

Descompilar, parchear e ingeniera inversa en Java

Tcnicas de escucha secreta (Eavesdropping)


Definicin de escucha secreta
Los escritos anteriores han estado enfocados mayoritariamente para trabajar con el
bytecode y los recursos de la aplicacin. Las aplicaciones tipo N-tier (multicapas) son
las que dominan en el lado servidor ofreciendo stas distintos puntos de vista para
realizar ingeniera inversa y hacking. Es una prctica normal desplegar la aplicacin en
capas con procesos separados pero comunicados unos con otros va protocolos de red.
Por ejemplo, un navegador que nos muestra un HTML en un puesto de trabajo de
usuario, utiliza el protocolo de transferencia de hipertexto (HTTP) para comunicarse
con el servidor web. En contrapartida el servidor web normalmente utiliza RMI o IIOP
para comunicarse con la aplicacin servidor. La aplicacin servidor depende de JDBC
para comunicarse con la base de datos. Un diagrama normal de despliegue para una
aplicacin Java distribuida tipo N-tier se muestra en la figura 13.1

Figura 13.1 Diagrama de despliegue de una aplicacin N-tier


En este escrito hablaremos de algunas tcnicas que pueden emplearse para escuchar
secretamente la conversacin entre las distintas capas distribuidas. La escucha secreta
se basa en la interceptacin y exploracin de los mensajes intercambiados entre un
cliente y un servidor. Esto nos puede facilitar el trabajo de localizar problemas o afinar
la ejecucin de un sistema distribuido complejo, as como proporcionarnos la
perspicacia necesaria del diseo de la aplicacin y los principios de comunicacin.

Escucha secreta en http


El primer caso que vamos a estudiar es la escucha secreta en aplicaciones basadas en
web y en servicios web, los cuales utilizan HTTP como protocolo de transporte para
comunicarse con sus clientes. Los mensajes HTTP estn formados por un encabezado y
el contenido que es enviado a travs de la red va TCP/IP. Cada cliente para ser capaz de
hablar con el servidor debe conocer el hostname del servidor o la direccin IP y tambin

el puerto en el cual el servidor est a la escucha. Los mensajes HTTP son enviados en
texto plano, lo cual nos permite leerlos y comprenderlos fcilmente.
La escucha secreta de la comunicacin entre cliente/servidor, debe de interceptar el
intercambio de mensajes. Una forma de realizarlo es colocar un intermediario que
rastree y construya un tnel para capturar los mensajes HTTP entre el cliente y el
servidor. Otra alternativa es controlar la capa de comunicacin de protocolo de la red,
filtrando los mensajes intercambiados por cliente y servidor. Estudiaremos ambas
alternativas en los siguientes prrafos. De nuevo utilizaremos WebCream como
aplicacin lado servidor, ya que proporciona contenido HTML esttico y dinmico va
servlets y pginas JSP.

Utilizar un tunel para capturar el intercambio de mensajes HTTP


Un tunel, dentro de este contexto no es ms que un falso servidor colocado entre el
cliente real y el servidor real para interceptar y rastrear el intercambio de mensajes. Lo
que realiza es en lugar del cliente hablar directamente con el servidor, este es
reconfigurado para que enve los mensajes al tnel; el tnel est configurado para enviar
las peticiones del servidor en nombre del cliente y remitir las respuestas del servidor al
cliente. El tnel registra el intercambio de mensajes en una pantalla o en un archivo,
pudiendo el hacker/cracker o el programador estudiar los detalles de la conversacin. La
naturaleza de HTTP basada en texto plano hace de l una buena eleccin para realizar
un tnel.
Utilizaremos la utilidad TCPMON, distribuida con el proyecto AXIS de Apache, para
realizar un tnel a los requerimientos del servidor Tomcat de WebCream. Apuntemos
que TCPMON no es una aplicacin sofisticada de tunelacin, es gratuita pero en la
mayora de los casos realiza un trabajo estupendo. Descargamos AXIS del sitio web
Apache y si no tienes un script para iniciar TCPMON, copia el que est en el
subdirectorio CovertJava\bin\axis y colcalo en el directorio donde hayas instalado
AXIS. A TCPMON le introducimos tres parmetros por lnea de comandos, el puerto
para escucha, el host y el nmero de puerto del servidor, para construir un tunel para los
requerimientos. Debido a que WebCream ejecuta a Tomcat en el puerto 8040,
ejecutaremos a TCPMON en el puerto 8000 y que remita al puerto 8040 del localhost.
Tambin necesitaremos realizar algunos cambios simples en la configuracin de
WebCream para que soporte el tnel realizado por AXIS. WebCream genera una pgina
form cualificado al 100% para envo de URL, la cual incluye el host y el nmero de
puerto. Como que queremos que todo el trfico vaya a travs de TCPMON, necesitamos
que WebCream siempre enve los forms al puerto 8000 antes que al puerto 8040 que lo
tiene por defecto. Esto lo lograremos aadiendo las dos lneas siguientes a
WebCreamconf\WebCreamDemo.properties (ver la documentacin de WebCream
para ms informacin):
html.docsURL=http://localhost:8040/webcream
html.submitURL=http://localhost:8000/webcream/apps/WebCreamDemo
Iniciamos WebCream Tomcat utilizando WebCream\bin\startServer.bat. Abres tu
navegador web preferido y tecleas lo siguiente en la lnea de direcciones:
http://localhost:8000/webcream/apps/WebCreamDemo

Observa que estamos utilizando el puerto 8000, donde se est ejecutando TCPMON,
mientras que el navegador est apuntando directamente a Tomcat, el cual se ejecuta en
el puerto 8040.
El navegador mostrar la pgina principal demo de WebCream. Cambiemos a
TCPMON y asegurmonos mirando en el panel arriba y a la izquierda que ha
interceptado la solicitud. El TCPMON puede ser lento en detectar todas las solicitudes
transmitidas, as que espera a que el estado del panel superior te muestre Done (hecho).
Vayamos al navegador y hagamos clic en el botn Login Dialog para abrir la siguiente
pgina; entonces introducimos Neo como usuario y Wakeup como contrasea y
hacemos clic en OK. Eres libre de utilizar el nombre y contrasea que t quieras, si
cambiamos a la pantalla de TCPMON, deberemos ver algo similar a la figura 13.2

Figura 13.2 TCPMON mostrando las solicitudes interceptadas.


Ahora podemos examinar las solicitudes y los datos interceptados por TCPMON.
Arriba del panel nos muestra tres mensajes, estos corresponden al nmero de pginas
solicitadas por el navegador. La parte ms interesante de informacin es la mostrada en
los paneles de abajo a la izquierda y de abajo a la derecha. El panel de la izquierda nos
muestra el encabezado y los datos de la solicitud, mientras que en el de la derecha nos
muestra el encabezado y contenido de la respuesta. Mirando los distintos atributos y
contenido de los elementos dados tendremos una idea del intercambio de datos entre el
navegador y el servidor. Por ejemplo, si seleccionamos la tercera solicitud de arriba del
panel y miramos los datos de dicha solicitud, podremos ver los valores actuales del
login (Neo) y la contrasea (Wakeup). En el encabezado, podemos ver una cookie,
JSESSIONID, la cual puede ser explotada para hackear la sesin del usuario.

Utilizar un Network Sniffer para capturar el intercambio de mensajes http


Realizar un tnel es una forma simple y efectiva de ver lo que en el momento se est
transmitiendo entre el cliente y el servidor. Es una buena forma para depurar y estudiar
las aplicaciones basadas en Web, pero tiene el inconveniente de que hay que realizar
una reconfiguracin del cliente (y posiblemente tambin el servidor, como tuvimos que
hacer con WebCream) para enviar la solicitud al tnel en lugar de hacerlo directamente
al servidor. La segunda tcnica que vamos a aprender, es realizar la escucha secreta
directamente al nivel de protocolo de la red, con lo cual no tenemos limitaciones para
realizar un tnel.
Todas las comunicaciones distribuidas se hacen a travs de la capa de protocolos
soportados por la JVM, sistema operativo y el driver de red. Los protocolos son
apilados uno encima del otro, esto significa que los protocolos de nivel superior
dependen de los protocolos de nivel inferior para ejecutar las tareas ms bsicas. As ,
HTTP depende del TCP, que depende a su vez de la IP. Un simple mensaje HTTP
puede ser representado por varios paquetes IP de nivel inferior, y el trabajo de las capas
de red es desensamblar y reensamblar los paquetes. La mayora de redes fsicas estn
compuestas por interconexiones de segmentos Ethernet y estaciones de trabajo. Dentro
de un segmento, los paquetes desde un nodo son transmitidos a todos los otros nodos
aunque la direccin de los nodos no sea el objetivo. Para comunicar con una
computadora fuera del segmento, los routers redireccionan los paquetes a otros
segmentos. En resumen estas lneas es para saber lo que ocurre cuando una aplicacin
se comunica con un host de una aplicacin remota con distinto host, lo que ocurre es
que los paquetes del protocolo tienen que cruzar varios host de red antes de llegar al
objetivo. La monitorizacin y el sniffing de red se aprovechan de este principio para
espiar las comunicaciones. Normalmente, un nodo de red slo acepta los paquetes que
estn marcados para l e ignora los dems paquetes. Sin embargo un nodo puede
ejecutarse en modo promiscuo , de esta forma acepta todos los paquetes sea la que sea
la direccin de destino. De esta manera un cracker o hacker puede examinar los
paquetes y sus contenidos para saber que pasa en las comunicaciones de la aplicacin.
Trabajar con el nivel de protocolo es difcil y exige mucho tiempo. Debido a que HTTP
es un protocolo comn, existen muchos productos para simplificar las escuchas secretas
en las comunicaciones HTTP. Vamos a ver el HTTP Sniffer de EffeTech, el cual es una
aplicacin shareware basada en Windows. Realizaremos tambin la interceptacin de la
comunicacin entre el navegador y el Tomcat de WebCream y veremos si obtenemos un
resultado distinto del obtenido con TCPMON. Uno de los inconvenientes de utilizar un
sniffer de red, es que no funciona cuando el cliente y el servidor estn ejecutndose en
el mismo host. Ya que ningn paquete es pasado al driver de red, de esa manera el
sniffer es incapaz de capturar las solicitudes y respuestas del protocolo. As pues para
seguir necesitamos asegurarnos de que el servidor Tomcat est en ejecucin en un host
de red distinto al del navegador. Si no tienes otra mquina, puedes usar el sitio web de
WebCream.
Descarga e instala HTTP Sniffer de EffeTech. Instala WinPcap, es una biblioteca de
captura de paquetes que se aade como un driver a Windows para capturar raw data de
la tarjeta de red. Debido a que WebCream ejecuta Tomcat en el puerto 8040,
necesitamos aadir a este puerto un filtro sniffer, utilizando el elemento Filter del men
de Sniffer. Podra ser posible que tuviramos que conmutar el adaptador de red actual

en el sniffer, si la grabacin no produce ningn resultado, pero de momentos lo dejamos


por defecto. Iniciamos Tomcat en el servidor remoto y entonces iniciamos el navegador.
Observa que el sniffer puede ejecutarse en la misma mquina como el navegador, en la
misma mquina como el servidor web o en cualquier mquina conectada al mismo
segmento de Ethernet como el navegador o el servidor de hosts. Inicia la grabacin
utilizando el men de Sniffer o la barra de herramientas y teclea la URL del servidor en
el navegador. Verifiquemos con WebCream, abre la pantalla principal, clic en Login y
vamos a la siguiente pgina, introduce Neo como usuario y Wakeup como contrasea; y
entonces clic en OK. Despus paramos la grabacin en HTTP Sniffer, tendremos que
ver una pantalla como la de la figura 13.3

Figura 13.3 Sniffer mostrando las peticiones interceptadas


La forma en que se nos muestra la informacin y el tipo de informacin interceptada es
casi igual que en TCPMON. Adems de tener una interfaz de usuario clara, HTTP
Sniffer muestra otros recursos del servidor obtenidos por el navegador, tales como
archivos GIF y JavaScript. Una vez ms mirando los datos de la solicitud podemos
obtener los valores de los parmetros como usuario y contrasea. Lo bonito de esta
tcnica es que no tuvimos que realizar nada a la aplicacin objetivo, pero hemos
obtenido un registro completo de la comunicacin entre cliente y servidor.

Proteger las aplicaciones web de la escucha secreta.


En poco tiempo, has aprendido como realizar una escucha secreta en interfaces de
usuario basadas en un navegador. La facilidad con que podemos obtener valores de
parmetros potencialmente peligrosos es un tanto alarmante. Veamos algunas
precauciones para hacer el trabajo de hackear una aplicacin web ms difcil. La ms
simple y efectiva forma de proteger la integridad de los datos y la seguridad de la

comunicacin entre cliente/servidor es utilizando el Hypertext Transfer Protocol


Secure (HTTPS). Este protocolo ordena al cliente que establezca un canal seguro con
el servidor, utilizando Secure Sockets Layer (SSL) antes de enviar cualquier dato
HTTP. Una vez establecido este canal, el intercambio de mensajes se realiza como con
HTTP.El beneficio de HTTPS es que todos los datos son codificados, y si an as
alguien intercepta algn paquete de red, la descodificacin es virtualmente imposible.
SSL tiene un gasto de recursos que puede disminuir la velocidad del servidor, con lo
cual realizar todas las comunicaciones va HTTPS no sera factible. Una forma lgica
sera utilizar HTTPS selectivamente o continuar utilizando HTTP pero encriptando el
contenido peligroso del hilo de la aplicacin. Si la interfaz del usuario es un navegador
Web, las funciones JavaScript pueden utilizarse para realizar la encriptacin y la
desencriptacin en el lado cliente.

Escucha secreta en el protocolo RMI


El Java Remote Method Invocation (JRMI) es utilizado especficamente en Java, por
Java Remote Method Protocol (JRMP) o por Internet Inter-Orb Protocol (IIOP),
para enviar mensajes binarios a hosts remotos. JRMP y IIOP dependen de
Transmission Control Protocol e Internet Protocol (TCP/IP) para transportar los
mensajes a travs de la red, lo cual hace que el canal de comunicacin sea propicio para
realizar sniffing de red. Tericamente, puedes programar un tnel que reciba y registre
los mensajes antes de que se pasen al receptor real, pero esto sera una faena tediosa.
Llegamos a la conclusin de que dependeramos de un sniffing de red para poder
realizar una escucha secreta en RMI. Desafortunadamente no tenemos ninguna
herramienta nativa que soporte los protocolos de nivel superior de Java, similar al
soporte que tiene HTTP Sniffer con HTTP. Esto significa que tendremos que trabajar
con protocolo de nivel inferior, estudiando TCP y los paquetes IP que representen a
todas o partes de las llamadas RMI. Realizaremos esta prctica espiando la
conversacin entre dos usuarios de la aplicacin Chat.

El protocolo de transporte en RMI


RMI utiliza un concepto de sucesin para representar el formato de lnea de llegada.
Internamente, la comunicacin tiene dos sucesiones asociadas; una sucesin de salida y
una sucesin de entrada. Las sucesiones son mapeadas en el correspondiente socket de
sucesiones y es utilizado para enviar y reconocer los mensajes. La secuencia de salida
est formada por un encabezado seguido de una secuencia de mensajes. Si se utiliza
HTTP, la secuencia de salida es adjuntada en un mensaje HTTP. El encabezado
contiene el protocolo de identificacin y los atributos describiendo el tipo de protocolo
utilizado. La esencia de una llamada RMI se encuentra en la seccin del mensaje. Los
mensajes de salida consisten en llamadas de mtodos, ping remoto o trfico de datos
basura; los mensajes de entrada pueden ser el retorno de un resultado, de una llamada o
un reconocimiento de un ping.
Para ejecutar una llamada remota RMI se utiliza el protocolo Java Object Serialization
para formatear el nombre del mtodo y los valores de parmetros en una estructura
binria que se enva a travs de la lnea de entrada. Por lo tanto todas las llamadas
remotas siguen el mismo formato de nivel binario. El conocimiento especfico del
transporte no es necesario para realizar una escucha secreta en RMI, pero si quieres ms
informacin, ves a http://java.sun.com/j2se/1.4.2/docs/guide/rmi/spec/rmiTOC.html.
Para nuestros propsitos, es suficiente saber que cuando dos aplicaciones Java utilizan

RMI para intercambiarse mensajes, es creada y utilizada una conexin de nivel inferior
TCP/IP con salida y entrada de sucesiones de datos.

Utilizar un Sniffer de red para interceptar mensajes RMI


Una de las herramientas ms populares para sniffing de red es Ethereal (Wireshark-s).
Es gratuita y tiene puertos para Unix y Windows. Puede analizar cualquier tipo de
protocolo concebible excepto RMI. Ethereal depende de WinPcap, la misma librera de
HTTP Sniffer que utiliza para capturar los paquetes de red. Descarga, instala y ejecuta
Ethereal (Wireshark-s). Empieza a registrar el trfico de red tan slo para que tengas
una idea sobre el tipo de informacin que puede capturar. Abre el navegador y visita
varios sitios web; entonces para la grabacin y mira los elementos mostrados arriba del
panel. Veras varios paquetes. Nuestra primera tarea ser configurar la herramienta para
que muestre solamente la informacin que nos interese ver.
Iniciemos abriendo el men Capture, y una vez desplegado seleccionamos Start de
dicho men. En el mismo men Capture seleccionamos Options y en la ventana
deseleccionamos Capture Packets in Promiscuous Mode y una vez deseleccionado
nos aseguramos de hacer Stop en el men Capture. Como que el sniffing de red
necesita ejecutar un cliente y un servidor en distintos hosts, ejecutaremos Chat en dos
mquinas. Clic OK para confirmar las opciones de captura e iniciamos la grabacin.
Entonces cambiamos a Chat y enviamos un mensaje, Hola Alex, al otro host. Enva otro
mensaje ms y recuerda el texto (el segundo mensaje IT esto es aburrido); lo
necesitars ms tarde. Ahora volvemos a cambiar a Wireshark-s y paramos la captura.
Hemos capturado un lote de paquetes y vemos la conversacin de Chat, necesitamos
una forma de filtrar los paquetes que contengan partes del texto de los mensajes
enviados por los usuarios. Podemos empezar buscando un paquete que contenga la
cadena que nosotros sabemos que hemos enviado durante la grabacin. Seleccionamos
del men Edit la opcin Find packet y nos aparece una caja de dilogos de busqueda.
Tecleamos la cadena que buscamos en este caso (Hola Alex) y asegrate de seleccionar
la opcin String. De esta manera Wireshark buscar la cadena en cualquiera de los
paquetes. Clic OK y el paquete que contiene la cadena quedar seleccionado. En los
paneles inferiores debers ver el contenido del paquete, que debe incluir tu cadena
buscada entre el contenido binrio. Como que una llamada RMI puede ser dividida en
mltiples mensajes TCP/IP, para ayudarnos a realizar el seguimiento de la sucesin
TCP, tiene la caracterstica de reunir toda la sucesin y mostrarla unida en una ventana
separada. Hacemos clic derecho en el paquete seleccionado y seleccionamos Follow
TCP Stream.
En este momento, veremos una versin binria de un paquete RMI. Est un poco
codificado pero con un poco de paciencia podemos reconocer nuestra salida. Empieza
con el encabezado JRMI, el cual indica que el protocolo JRMI es utilizado como
transporte de RMI. A continuacin est la direccin IP del host de origen, el ID del
servidor y una mezcla de informacin basura (DGC). El contenido del mensaje est casi
al final. En nuestro caso podemos ver la cadena Hola Alex seguido por
covertjava.chat.MessageInfo, que suponemos que ser el nombre de la clase de
mensajes. Contina con otros parmetros del mensaje como el nombre de host y el
nombre de usuario.

Despus de examinar la sucesin TCP/IP representando el mensaje RMI enviado por


Chat, podemos imaginar que los siguientes mensajes tendrn el mismo formato. En
otras palabras, aunque el texto de mensaje podra cambiar, el ttulo y el formato del
mensaje ser el mismo. Si la suposicin es correcta, deberemos ser capaces de buscar
los mensajes de Chat basados en una subcadena del encabezado o formato del mensaje.
Para verificar esta teora, haremos una bsqueda en toda la estructura de
covertjava.chat.MessageInfo utilizando Find Frame. Si el filtro de cadenas est
habilitado arriba de la pantalla, resetea el filtro. Entonces ves hasta la primera estructura
y ejecuta la bsqueda. En la primera estructura ha encontrado la cadena Hola Alex, y en
la siguiente estructura, ha encontrado el contenido IT esto es aburrido. Esto demuestra
nuestra suposicin con respecto a Chat, y que nos permite seguir la conversacin entre
los usuarios.
El mismo acercamiento se puede realizar con otras aplicaciones. Wireshark trabaja a un
nivel muy inferior, pero con diligencia y un poco de anlisis de los bits, podemos
realizar una escucha secreta de una comunicacin de la red entre aplicaciones.

Proteger aplicaciones RMI de escuchas secretas


Basndonos en lo que hemos aprendido respecto al sniffing de red, podemos concluir
que no podemos prevenir la escucha secreta de una comunicacin de red. Al final del
camino, los datos han viajado a travs de la lnea y a travs de varios nodos de la red, lo
cual hace posible su intercepcin. Slo hay una forma de proteger los datos y es
encriptndolos. SSL es el estndar que ofrece caractersticas de seguridad para los
canales de red, y puede utilizarse en la comunicacin RMI. Java Secure Sockets
Extension (JSSE) es un conjunto de APIS que habilitan a las aplicaciones Java para
poder utilizar SSL para encriptar los datos, autentificacin e integridad del mensaje.
RMI habilita en las aplicaciones la creacin de sockets para exportar objetos utilizados
en ausencia de los sockets por defecto TCP/IP. Utilizar por defecto los sockets creados
JSSE SSL, para conectar a cliente y servidor, aseguran efectivamente el canal. Un
ejemplo de unin entre RMI y SSL se proporciona en el sitio web JavaSotf:
http://java.sun.com/j2se/1.4.1/docs/guide/rmi/socketfactory/SSLInfo.html
La comunicacin SSL consume recursos generales, que pueden ser innecesarios para
todos los intercambios de datos cliente/servidor. La mejor opcin sera utilizar la
codificacin JSSE, slo para los datos peligrosos.

Escucha secreta en el driver JDBC y declaraciones SQL


La mayora de aplicaciones servidor utiliza una base de datos para guardar y devolver
datos. La utilizacin del conocimiento de la interaccin de las aplicaciones con las bases
de datos y las declaraciones SQL , puede ser de una ayuda excelente para la realizacin
de ingeniera inversa. Actualmente se utiliza la tecnologa JDBC. Para utilizar JDBC,
una aplicacin debe identificar y cargar un driver, obtener una conexin y ejecutar
declaraciones para ejecutar actualizaciones y preguntas. La lgica ms interesante desde
el punto de vista de la ingeniera inversa es la estructura y los parmetros de las
declaraciones SQL. Est reconocido que la efectividad de ejecucin de las bases de
datos SQL dependen mucho de las declaraciones utilizadas. Analizar los tiempos de
ejecucin de SQL puede mejorar la aplicacin, la base de datos o ambas.

En teora, puedes navegar a travs del cdigo fuente o bytecode de la aplicacin,


recoger todas las declaraciones SQL y guardarlas como cadenas. Esto, por supuesto,
puede ser problemtico en aplicaciones que contengan dinmicamente, un gran nmero
de declaraciones o forms SQL, adems tambin puede depender de la propia base de
datos que proporciona el registro de las declaraciones SQL. Y aunque esto es
claramente una opcin mejor que el mismo cdigo de la aplicacin, se requiere
privilegios administrativos para la base de datos y esto no es fcil si mltiples
aplicaciones comparten la misma base de datos.
Las API JDBC proporcionan un mtodo de registro de las operaciones de la base de
datos a nivel driver, gracias al mtodo setLogWriter de DriverManager. Esto nos
proporciona la informacin de salida, como el registro de drivers, URLs utilizadas para
crear las conexiones de la base de datos y la conexin a la clase names. El problema con
el registro del administrador de drivers es que no nos proporciona la mayor parte de la
informacin importante, como pueden ser las declaraciones SQL y los valores pasados a
la base de datos. Tenemos que redireccionar el registro del driver JDBC a System.out y
verificarlo con un simple programa que registre un driver, obtendremos una conexin de
base de datos, y ejecutaremos algunas declaraciones con parmetros tipo SELECT.
Examinemos la salida de registro del driver en el listado 13.1. No se muestra ningn
rastro de las declaraciones SELECT del programa ejecutado.
LISTADO 13.1 Registro de salidas de driver JDBC
DriverManager.initialize: jdbc.drivers = null
JDBC DriverManager initialized
registerDriver: driver[className=com.sybase.jdbc2.jdbc.SybDriver...]
registerDriver: driver[className=com.sybase.jdbc2.jdbc.SybDriver...]
DriverManager.deregisterDriver: com.sybase.jdbc2.jdbc.SybDriver@1d4c61c
registerDriver: driver[className=com.sybase.jdbc2.jdbc.SybDriver...]
DriverManager.getConnection(jdbc:sybase:Tds:he1unx142:2075/pslwrkdb1)
trying driver[className=com.sybase.jdbc2.jdbc.SybDriver...]
getConnection returning driver[className=
com.sybase.jdbc2.jdbc.SybDriver...]
Para proporcionarnos una forma confiable de escucha secreta de las llamadas a una
base de datos, debemos reemplazar el driver JDBC por una envoltura que registre la
declaracin y delegarlo al driver real. Existe una aplicacin P6Spy, la cual
utilizaremos para el registro de JDBC. En menos de 10 minutos y con un mnimo
cambio de configuracin, nos habilitar el registro de las llamadas a la base de datos de
las aplicaciones ejecutndose sin ningn cambio en el cdigo. P6Spy es gratuito, es una
aplicacin de cdigo abierto que puede descargarse de SourceForge.
Una vez descargada e instalada, los archivos p6spy.jar y spy.properties deben de
colocarse en el CLASSPATH de la aplicacin objetivo. Para activar el spy, la clase del
driver real de la aplicacin habr que colocarla con la clase del driver de spy. El nombre
del driver real habr que configurarlo en spy.properties de esta forma spy puede
delegarlo. El resto de la configuracin de la base de datos para la aplicacin no hay que
modificarla. Por ejemplo si la aplicacin se conecta a una base de datos Oracle
utilizando un driver estandar, el nombre de la clase del driver real es
oracle.jdbc.driver.OracleDriver. Para activar el spy, este nombre debe cambiarse en
el archivo de configuracin de la aplicacin y en spy.properties por

com.p6spy.engine.spy.p6SpyDriver , y el driver real habr que configurarse como


sigue:
realdriver=Oracle.jdbc.driver.OracleDriver
El reiniciado de la aplicacin nos proporciona un registro el cual contiene las llamadas
interceptadas a la base de datos. Por ejemplo, despus de configurar P6Spy con la
aplicacin demo en el JDK estandar, TableExample y teclear algunas declaraciones
SELECT en la tabla, conseguimos el siguiente registro:
1066073757578|16|0|statement||SELECT * FROM TAB
1066073780718|0|0|statement||SELECT * FROM TAB where tname=Alex
P6Spy utiliza Log4J el cual es muy adaptable a las especificaciones deseadas. Para ms
informacin sobre ello leerse la documentacin del producto.

Performance Bigundill@