Una Historia Sobre Cómo Arreglamos el Controlador JDBC de Vertica para DBeaver
Al conectar a una base de datos Vertica a través de una aplicación DBeaver se detectó un problema (ce-4.2.2). Si ingresas un puerto no estándar, por ejemplo, 55555, la herramienta intenta conectarse al puerto predeterminado 5433 de todas formas.
Pantalla 1
Diagnóstico de los problemas
Bajo la línea de “Razón” puedes ver que falló al conectarse al puerto 5433, además hubo un informe de que el cliente iba a conectarse al puerto 55555.
Sin embargo, al ingresar un número corto (1234), no hay tal problema.
Pantalla 2
En este caso, la conexión falló en el puerto especificado 1234.
Informe Post-Acción
¿A qué puerto se intentó conectar realmente? Es posible ejecutar una herramienta IDA Pro y conectarse a un proceso de DBeaver.
Para convertir Endianness, las aplicaciones a menudo usan un conjunto de funciones “host a red TCP/IP” de una API NetWare. Para convertir un número de dos bytes (por ejemplo, un puerto TCP) es posible usar funciones “htons“.
La versión “WinAPI” de la función “htons” está en “ws2_32.dll”. Necesitas encontrar una importación del módulo “ws2_32.d” y abrir una lista de las funciones.
Pantalla 3
Luego, necesitas establecer un punto de interrupción en la llamada a la función “htons”.
Pantalla 4
Si configuras el puerto 1234 y haces clic en “Probar conexión”, entonces la depuración se detiene en el punto de interrupción.
Pantalla 5
Primero, puedes notar que la función toma el valor vía pila.
00401A42 mov ebp, esp
00401A44 mov eax, [ebp + arg_0]
Estas instrucciones establecen el valor en un registro EAX desde la parte superior de la pila por desplazamiento a “arg_0”. Los bytes “D2” y “04” en el formato “Big Endian” son nuestro número 1234. Pero, ¿qué pasa si indicamos el número 55555 como puerto? En teoría, los bytes “03” y “D9” deberían colocarse en la parte superior de la pila.
Necesitas hacer clic en “Probar Conexión” nuevamente, pero con el puerto 55555.
Pantalla 6
Eso es extraño, pero aquí tenemos el número 5433 en la pila (bytes 15 y 39), que es el puerto predeterminado de DBMS “Vertica”. Puede asumirse que el programa establece un puerto incorrecto de inmediato. Necesitamos averiguar dónde sucede eso. Para comunicarse con DBMS, Dbeaver usa JDBC y carga una versión 6.1.2 por defecto.
Pantalla 7
Es posible intentar descompilar un controlador (.jar) y explorar lo que ocurre antes de la conexión. Un software “fernflower” es bueno para esta tarea. Soporta muchas opciones para descompilar aplicaciones Java. Para un análisis simple, una descompilación estándar sin banderas es adecuada.
Pantalla 8
Una vez completado, habrá archivos fuente descompilados.
Necesitas encontrar el uso de un puerto predeterminado “HPE Vertica” en un editor de texto, podría ser capaz de entender la esencia del problema con el cambio del puerto 55555 al 5433.
Pantalla 9
Hay un intento de convertir el valor del puerto a un Tipo Short en un método “loadPreConnectSettings”.
Si no es posible, se usará el puerto 5433. Un tipo Short en Java está limitado por un rango de -32,768 a 32,767, por lo tanto, el valor 55555 será una excepción lanzada. Resulta que el problema está en el controlador jdbc en sí. Vamos a intentar arreglar su funcionamiento.
Parche de la Aplicación
Para parchear los archivos “class” es posible usar DirtyJOE. Necesitas abrir “VConnection.class” desde un archivo jar. Hay una lista de los métodos de este objeto en la pestaña “Methods”.
Pantalla 10
Hacer doble clic en el método “loadPreConnectSettings” abre el CodeEditor.
Pantalla 11
Una llamada al método getShort ocurre en la posición 0000004E, lo que significa que B6 es un código de operación de una instrucción, y 003С es una etiqueta de operando. Es necesario cambiar una instrucción para llamar a getInt para un objeto Variant.
Pantalla 12
Hay una lista de métodos de clase en la pestaña Constant Pool. El número 0060 es exactamente el número de un método en decimal.
Pantalla 13
Se encontró un método getInt abajo. Necesitas volver a la llamada getShort y cambiar el comando por getInt.
Pantalla 14
Después de eso, necesitas guardar la clase y reemplazar el archivo original en un archivo jar. Antes de parchear, Dbeaver se conectaba al puerto 55555 como si fuera el 5433.
Pantalla 15
Ahora está utilizando el puerto correcto para la conexión.
Conclusión
El problema, como resultó, no está en el propio navegador Dbeaver, sino en el controlador que descarga para la comunicación con una base de datos Vertica.
Actualización 09.19
Dbeaver eliminó la descarga de JDBC en la versión 4.3.0 para Vertica. Esto significa que la aplicación no utilizará por defecto la versión problemática de este controlador.
Siguiente