Une histoire sur la façon dont nous avons corrigé le pilote JDBC 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 au port par défaut 5433 de toute façon.
Écran 1
Diagnostic des problèmes
Sous une ligne « Raison », vous pouvez voir qu’il a échoué à se connecter au port 5433, il y avait également un rapport indiquant que le client allait se connecter au port 55555.
Cependant, en entrant un petit numéro (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
A quel port la tentative de connexion a-t-elle été faite en réalité ? Il est possible d’exécuter un outil IDA Pro et se connecter à un processus DBeaver.
Pour convertir l’endianness, les applications utilisent souvent un ensemble de fonctions « hôte vers réseau TCP/IP » à partir d’une API NetWare. Pour convertir un nombre de 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 placer 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 », alors 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 à partir du haut de la pile par décalage vers « arg_0 ». Les octets « D2 » et « 04 » dans le format « Big Endian » représentent notre numéro 1234. Mais que se passe-t-il si nous indiquons le numéro 55555 comme port ? En théorie, les octets « 03 » et « D9 » devraient être placés en haut de la pile.
Il vous faut cliquer de nouveau sur « Tester la connexion » mais avec le port 55555.
Écran 6
C’est étrange mais ici nous avons un numéro 5433 dans la pile (octets 15 et 39), qui est le port par défaut du SGDB « Vertica ». On peut supposer que le programme définit incorrectement le port dès le début. Nous devons déterminer où cela se produit. Pour communiquer avec le SGDB, DBeaver utilise JDBC 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 bien adapté à 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é, vous disposerez de 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 capable de comprendre la substance du problème avec le changement 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, par conséquent, la valeur 55555 générera une exception. Il s’avère que le problème réside dans le pilote jdbc lui-même. Essayons de corriger son fonctionnement.
Patching de l’application
Pour patcher les fichiers « class », il est possible d’utiliser DirtyJOE. Vous devez ouvrir « VConnection.class » à partir d’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 à la méthode getShort se produit à la position 0000004E, ce qui signifie que B6 est un code d’opération d’instruction, et 003C est une étiquette d’opérande. Il est nécessaire de changer une instruction pour un appel getInt pour un objet Variant.
Écran 12
Il y a une liste des méthodes de la 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 getInt a été trouvée ci-dessous. Vous devez revenir à un appel getShort 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 de patcher, DBeaver se connectait au port 55555 comme au 5433.
Écran 15
Il utilise maintenant le bon port pour se connecter.
Conclusion
Le problème, comme il s’est avéré, ne réside 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.