DataSunrise sponsorise AWS re:Invent 2024 à Las Vegas, veuillez nous rendre visite au stand n°2158 de DataSunrise

Une histoire sur la façon dont nous avons corrigé le pilote JDBC Vertica pour DBeaver

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.

example

É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.

example

É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.

example

Écran 3

Ensuite, vous devez placer un point d’arrêt sur l’appel de la fonction « htons ».

example

É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.

example

É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.

example

É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.

example

É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.

example

É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.

example

É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 ».

example

Écran 10

Un double-clic sur la méthode « loadPreConnectSettings » ouvre le CodeEditor.

example

É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.

example

É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.

example

Écran 13

Une méthode getInt a été trouvée ci-dessous. Vous devez revenir à un appel getShort et changer la commande par getInt.

example

É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.

example

É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.

Suivant

DataSunrise Sécurité de la Base de Données sur Amazon AWS Big Data Blog

DataSunrise Sécurité de la Base de Données sur Amazon AWS Big Data Blog

En savoir plus

Besoin de l'aide de notre équipe de support ?

Nos experts seront ravis de répondre à vos questions.

Informations générales :
[email protected]
Service clientèle et support technique :
support.datasunrise.com
Demandes de partenariat et d'alliance :
[email protected]