
Une Histoire sur la Façon Dont Nous Avons Réparé le Pilote JDBC de Vertica pour DBeaver
Lors de la connexion à une base de données Vertica via l’application DBeaver, un problème a été détecté (ce-4.2.2). Si vous entrez un port non standard, par exemple 55555, l’outil essaie de se connecter de toute façon au port par défaut 5433.
Écran 1
Diagnostic des problèmes
Sous la ligne “Raison”, vous pouvez voir qu’il n’a pas pu se connecter au port 5433, et il y avait également un rapport indiquant que le client allait se connecter au port 55555.
Cependant, en entrant un numéro court (1234), il n’y a pas un tel problème.

Écran 2
Dans ce cas, la connexion a échoué sur le port spécifié 1234.
Débriefing
Quel port a-t-il réellement tenté de connecter ? Il est possible d’exécuter un outil IDA Pro et de se connecter à un processus DBeaver.
Pour convertir les endianness, les applications utilisent souvent un ensemble de fonctions “hôte vers réseau TCP/IP” d’une API NetWare. Pour convertir un nombre à deux octets (par exemple, un port TCP), il est possible d’utiliser les fonctions “htons“.
La version “WinAPI” de la fonction “htons” se trouve dans “ws2_32.dll”. Vous devez trouver une importation du module “ws2_32.d” et ouvrir une liste des fonctions.

Écran 3
Ensuite, vous devez poser un point d’arrêt sur l’appel de la fonction “htons”.

Écran 4
Si vous définissez le port 1234 et cliquez sur “Tester la connexion”, le débogage s’arrête sur le point d’arrêt.

Écran 5
Tout d’abord, vous pouvez remarquer que la fonction prend la valeur via la pile.
00401A42 mov ebp, esp
00401A44 mov eax, [ebp + arg_0]
Ces instructions définissent la valeur dans un registre EAX depuis le haut de la pile par décalage vers “arg_0”. Les octets “D2” et “04” au format “Big Endian” sont notre nombre 1234. Mais que se passe-t-il si nous indiquons le nombre 55555 comme port ? En théorie, les octets “03” et “D9” devraient être placés en haut de la pile.
Vous devez cliquer à nouveau sur “Tester la connexion”, mais avec le port 55555.

Écran 6
C’est étrange, mais ici, nous avons le nombre 5433 dans la pile (15 et 39 octets), qui est un port par défaut de DBMS “Vertica”. On peut supposer que le programme définit directement un mauvais port. Nous devons comprendre où cela se produit. Pour communiquer avec DBMS, Dbeaver utilise JDBS et télécharge par défaut la version 6.1.2.

Écran 7
Il est possible d’essayer de décompiler un pilote (.jar) et d’explorer ce qui se passe avant la connexion. Un logiciel “fernflower” est bon pour cette tâche. Il prend en charge de nombreuses options pour la décompilation des applications Java. Pour une analyse simple, une décompilation standard sans drapeaux convient.

Écran 8
Une fois terminé, il y aura des fichiers source décompilés.
Vous devez trouver l’utilisation du port par défaut “HPE Vertica” dans un éditeur de texte, il pourrait être possible de comprendre la substance du problème de conversion du port 55555 en 5433.

Écran 9
Il y a une tentative de convertir la valeur du port en type Short dans une méthode “loadPreonnectSettings”.
Si cela n’est pas possible, alors le port 5433 sera utilisé. Un type Short en Java est limité par une plage de -32 768 à 32 767, donc la valeur 55555 entraînera une exception. Il s’avère que le problème vient du pilote JDBC lui-même. Essayons de corriger son fonctionnement.
Patch de l’application
Pour patcher des fichiers “class”, il est possible d’utiliser DirtyJOE. Vous devez ouvrir “VConnection.class” depuis une archive jar. Il y a une liste des méthodes de cet objet dans l’onglet “Methods”.

Écran 10
Un double clic sur la méthode “loadPreConnectSettings” ouvre le CodeEditor.

Écran 11
Un appel de méthode getShort se produit à la position 0000004E, ce qui signifie que B6 est un code opération de l’instruction, et 003C est une étiquette d’opérande. Il est nécessaire de changer une instruction pour appeler getInt pour un objet Variant.

Écran 12
Il y a une liste des méthodes de classe dans l’onglet Constant Pool. Le numéro 0060 est exactement le numéro d’une méthode en décimal.

Écran 13
Une méthode getLnt a été trouvée ci-dessous. Vous devez revenir à un appel get Short et changer la commande par getInt.

Écran 14
Après cela, vous devez enregistrer la classe et remplacer le fichier original dans une archive jar. Avant le patch, Dbeaver se connectait au port 55555 comme au 5433.

Écran 15
Maintenant, il utilise le bon port pour se connecter.
Conclusion
Le problème, comme il s’est avéré, n’est pas dans le navigateur Dbeaver lui-même, mais dans le pilote qu’il télécharge pour la communication avec une base de données Vertica.
Mise à jour 09.19
Dbeaver a supprimé le téléchargement de JDBC dans la version 4.3.0 pour Vertica. Cela signifie que l’application n’utilisera pas par défaut la version problématique de ce pilote.