Una Storia su Come Abbiamo Risolto il Driver JDBC di Vertica per DBeaver
Durante la connessione a un database Vertica tramite l’applicazione DBeaver, è stato rilevato un problema (ce-4.2.2). Se si inserisce una porta non standard, per esempio 55555, lo strumento tenta comunque di connettersi alla porta predefinita 5433.
Schermata 1
Diagnosi dei problemi
Sotto una linea “Motivo” si può vedere che non è riuscito a connettersi alla porta 5433, inoltre c’era un rapporto che il client stava per connettersi alla porta 55555.
Tuttavia, inserendo un numero corto (1234), non c’è alcun problema.
Schermata 2
In questo caso, la connessione non è riuscita sulla porta specificata 1234.
Debriefing
A quale porta è stato tentato di connettersi, realmente? È possibile eseguire uno strumento IDA Pro e connettersi a un processo DBeaver.
Per convertire Endianness, le applicazioni usano spesso un set di funzioni “host to TCP/IP network” da un’API NetWare. Per convertire un numero a due byte (ad esempio, una porta TCP) è possibile usare le funzioni “htons”.
La versione “WinAPI” della funzione “htons” si trova in “ws2_32.dll”. È necessario trovare un’importazione del modulo “ws2_32.dll” e aprire un elenco delle funzioni.
Schermata 3
Poi, è necessario impostare un breakpoint sulla chiamata della funzione “htons”.
Schermata 4
Se si imposta la porta 1234 e si clicca su “Test connection”, allora il debug si ferma sul breakpoint.
Schermata 5
Prima, si può notare che la funzione prende il valore tramite stack.
00401A42 mov ebp, esp
00401A44 mov eax, [ebp + arg_0]
Queste istruzioni impostano il valore in un registro EAX dalla cima dello stack per offset a “arg_0”. I byte “D2” e “04” nel formato “Big Endian” sono il nostro numero 1234. Ma cosa succede se indichiamo il numero 55555 come porta? Teoricamente, i byte “03” e “D9” dovrebbero essere posizionati in cima allo stack.
È necessario cliccare di nuovo “Test Connection”, ma con la porta 55555.
Schermata 6
È strano, ma qui abbiamo un numero 5433 nello stack (15 e 39 byte), che è una porta predefinita di DBMS “Vertica”. Si può supporre che il programma imposti subito una porta sbagliata. Bisogna capire dove succede. Per comunicare con DBMS Dbeaver usa JDBC e carica una versione 6.1.2. per impostazione predefinita.
Schermata 7
È possibile provare a decompilare un driver (.jar) e esplorare cosa succede prima della connessione. Un software “fernflower” è buono per questo compito. Supporta molte opzioni per la decompilazione di applicazioni Java. Per un’analisi semplice, una decompilazione standard senza flag è adatta.
Schermata 8
Una volta completata, ci saranno i file sorgenti decompilati.
È necessario trovare l’uso della porta predefinita “HPE Vertica” in un editor di testo, può essere in grado di capire la sostanza del problema con il cambio della porta 55555 in 5433.
Schermata 9
C’è un tentativo di convertire il valore della porta in un tipo Short nel metodo “loadPreonnectSettings”.
Se non è possibile allora verrà utilizzata la porta 5433. Un tipo Short in Java è limitato da un intervallo -32,768 – 32,767, quindi il valore 55555 sarà un’eccezione throw. Si scopre che il problema è nel driver jdbc stesso. Proviamo a risolvere il suo funzionamento.
Patch dell’applicazione
Per patchare i file “class” è possibile usare DirtyJOE. Bisogna aprire “VConnection.class” da un archivio jar. C’è un elenco dei metodi di questo oggetto nella scheda “Methods”.
Schermata 10
Fare doppio clic sul metodo “loadPreConnectSettings” apre il CodeEditor.
Schermata 11
Una chiamata del metodo getShort avviene in posizione 0000004E, significa che B6 è un codice operativo di un’istruzione, e 003C è un’etichetta di operando. È necessario cambiare un’istruzione per la chiamata getInt per un oggetto Variant.
Schermata 12
C’è un elenco di metodi di classe nella scheda Constant Pool. Il numero 0060 è esattamente il numero di un metodo in decimale.
Schermata 13
Un metodo getInt è stato trovato in basso. È necessario tornare alla chiamata getShort e cambiare il comando con getInt.
Schermata 14
Dopo, è necessario salvare la classe e sostituire il file originale in un archivio jar. Prima di patchare, Dbeaver si connetteva alla porta 55555 come alla 5433.
Schermata 15
Ora sta usando la porta giusta per connettersi.
Conclusione
Il problema, come si è scoperto, non è nel browser Dbeaver stesso, ma nel driver che scarica per comunicare con un database Vertica.
Aggiornamento 09.19
Dbeaver ha rimosso il download JDBC nella release 4.3.0 per Vertica. Significa che l’applicazione non userà la versione problematica di questo driver per impostazione predefinita.