
Una Storia Su Come Abbiamo Risolto Il Driver JDBC di Vertica per DBeaver
Quando si connette a un database Vertica tramite un’applicazione DBeaver è stato rilevato un problema (ce-4.2.2). Se si inserisce una porta non standard, ad esempio, 55555, lo strumento tenta comunque di connettersi alla porta predefinita 5433.
Schermata 1
Diagnosi dei Problemi
Sotto la riga “Ragione” si può vedere che non è riuscito a connettersi alla porta 5433, inoltre c’è un rapporto che il client stava tentando di connettersi alla porta 55555.
Tuttavia, inserendo un numero breve (1234), non si verifica tale problema.

Schermata 2
In questo caso, la connessione non è riuscita alla porta specificata 1234.
Resoconto
A quale porta si è tentato davvero di connettersi? È possibile eseguire uno strumento IDA Pro e connettersi a un processo DBeaver.
Per convertire l’Endianness, le applicazioni spesso usano 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 utilizzare le funzioni “htons”.
La versione “WinAPI” della funzione “htons” si trova in “ws2_32.dll”. È necessario trovare l’importazione del modulo “ws2_32.dll” e aprire un elenco delle funzioni.

Schermata 3
Quindi, è necessario impostare un breakpoint sulla chiamata della funzione “htons”.

Schermata 4
Se si imposta la porta 1234 e si clicca su “Test connection”, il debug si fermerà sul breakpoint.

Schermata 5
Per prima cosa, si può notare che la funzione prende il valore tramite lo stack.
00401A42 mov ebp, esp
00401A44 mov eax, [ebp + arg_0]
Queste istruzioni impostano il valore nel registro EAX dalla cima dello stack tramite 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? In teoria, i byte “03” e “D9” dovrebbero essere posizionati in cima allo stack.
È necessario cliccare nuovamente su “Test Connection”, ma con la porta 55555.

Schermata 6
È strano, ma qui abbiamo un numero 5433 nello stack (byte 15 e 39), che è la porta predefinita di DBMS “Vertica”. Si può supporre che il programma imposti subito una porta sbagliata. Dobbiamo capire dove avviene. Per comunicare con DBMS DBeaver utilizza JDBS e carica una versione 6.1.2. per predefinito.

Schermata 7
È possibile provare a decompilare un driver (.jar) ed 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 è adatta una decompilazione standard senza flag.

Schermata 8
Una volta completato, ci saranno file sorgenti decompilati.
È necessario trovare l’uso della porta predefinita “HPE Vertica” in un editor di testo, potrebbe permettere di capire la sostanza del problema con il cambiamento della porta 55555 in 5433.

Schermata 9
C’è un tentativo di convertire il valore della porta in un Short Type in un metodo “loadPreonnectSettings”.
Se non è possibile, verrà utilizzata la porta 5433. Un Short tipo in Java è limitato a un intervallo -32,768 – 32,767, quindi, il valore 55555 sarà un’eccezione. Si scopre che il problema è nel driver jdbc stesso. Proviamo a correggere il suo funzionamento.
Patching dell’Applicazione
Per le patching dei file “class” è possibile utilizzare DirtyJOE. È necessario aprire “VConnection.class” da un archivio jar. C’è un elenco dei metodi di questo oggetto nella scheda “Metodi”.

Schermata 10
Doppio clic sul metodo “loadPreConnectSettings” apre CodeEditor.

Schermata 11
Una chiamata del metodo getShort avviene nella posizione 0000004E, significa che B6 è un codice operazione di un’istruzione, e 003C è un’etichetta operativa. È necessario cambiare un’istruzione in una chiamata getInt per un oggetto Variant.

Schermata 12
C’è un elenco di metodi di classe nella scheda Costant Pool. Un numero 0060 è esattamente il numero di un metodo in decimale.

Schermata 13
È stato trovato un metodo getInt sotto. È necessario tornare a una chiamata getShort e cambiare il comando per getInt.

Schermata 14
Dopo ciò, è necessario salvare la classe e sostituire il file originale nell’archivio jar. Prima del patching, DBeaver si connetteva alla porta 55555 come alla 5433.

Schermata 15
Ora sta usando la porta giusta per la connessione.
Conclusione
Il problema, come si è scoperto, non è nel browser DBeaver stesso, ma nel driver che scarica per la comunicazione con il database Vertica.
Aggiornamento 09.19
DBeaver ha rimosso il download di JDBC nella versione 4.3.0 per Vertica. Significa che l’applicazione non utilizzerà per impostazione predefinita la versione problematica di questo driver.