martedì 31 luglio 2007

Pillole di incompetenza Javascript pt1

Rispetto al post precedente, per ora abbiamo deciso di aggirare il tutto ed affrontare il problema nientemeno che con python e interfaccia COM per pilotare Exploder. La ditta è decisamente refrattaria alle mie insistenze di OpenSource, ma vabbè.

Partendo dal fatto che il sito in questione è di una azienda le cui bollette sono note a tutti e che si parla di un sottodominio di pubblicazione dei dati dei consumi aziendali, vi cito delle ottime parti di codice javascript, presenti nella pagina che sto cercando di navigare automaticamente per arrivare a scaricare i dati dei consumi.

In un form compaiono e scompaiono dei campi in base alla selezione di un radio button, il cui valore viene salvato nella variabile n.

// x Netscape non vi e` la gestione campi a scomparsa
if (!document.all)
return;

Prima cazzata, se non sai come fare una cosa almeno cerca su internet e lascia perdere questi assiomi, soprattutto se poi il sito non è assolutamente comprensibile sotto altri browser.
In base al valore di del radio button si vanno a nascondere e visualizzare alcuni campi:

if (n==1)
{
document.download2.gg1.style.display="";
document.download2.mm1.style.display="";
document.download2.aa1.style.display="";
document.download2.aa2.style.display="none";
document.download2.mm2.style.display="none";
document.download2.aa3.style.display="none";
document.download2.mm3.style.display="none";
document.download2.ss3.style.display="none";
return;
}

Ovviamente il codice prosegue con tanti altri if sul valore di n in base al quale si nascondono o visualizzano diversi campi. Il tutto programmato con la regola del copia-incolla. Molto più intuitivo e meno dispendioso in termini di byte sarebbe stato inizializzare il display di tutti a "none" (ma anche visibility hidden, se proprio siamo persone serie e sappiamo come far scomparire le cose in netscape) e poi con l'if si vanno cambiare due o tre property. Sicuramente più leggibile. E poi il colpo di genio: gestione delle date, si vuole avere il giorno precedente ad oggi, quindi controllando se devo scalare di mese, per cui devo sapere quanti giorni ha il mese precedente

gg = 31; <-- giorno corrente, stampato nella pagina da jsp
mm = 6 + 1; <-- mese corrente, stampato 0-based da jsp, incrementato per averlo 1 based
yy = 2007;

// calcolo giorno precedente
gg = gg - 1;
if (gg == 0) <-- Se ero al primo giorno, devo andare all'ultimo del mese precedente
{
if (mm == 1)
{
gg = 31;
mm = 12;
yy = yy - 1;
}
if (mm == 2)
{
gg = 31;
mm = 1;
}
if (mm == 3)
{
if ((yy % 4) > 0)
gg = 28;
else
gg = 29;
mm = 2;
}
if (mm == 4)
{
gg = 31;
mm = 3;
}

[.. e così fino a 12]

Ora, quanto ci vuole a fare dei controlli con un "or" sui mesi da 31 e su quelli da 30? Oppure una cosa più simpatica ma abbastanza fine a se stessa di un array di 12 valori, uno per ogni mese? e non puoi fare un generico mm--; ad inizio di tutta questa puttanata? Ma soprattutto, non hai mai sentito la parola ELSE???

lunedì 30 luglio 2007

Google e i tanti corsi

Stavo cazzeggiando alla grande su internet. Ad un certo punto metto nella parte della barra degli strumenti di iceweasel dedicata a google la frase:
corso di

e guardo i suggerimenti, che suppongo vengano dettati dal frequente utilizzo da parte degli utenti. Ed ecco in ordine:
corso di spagnolo
corso di inglese
corso di italiano
corso di fiori (??)
corso di chitarra
corso di bestemmie
...

Ma la gente non ha proprio un cazzo da fare? :D

mercoledì 18 luglio 2007

Java Applet Hacking

Mentre rido ancora per l'ultima barzelletta trovata pochi minuti fa in rete, vi racconto di un problema che ho dovuto affrontare ieri. Partiamo con ordine: scenario è un sistema di autenticazione online a cui è iscritta una ditta per cui lavoro; esso fornisce una comune applet java per autenticarsi sul server, per poi accedere sul dominio principale nelle aree di pubblicazione dei dati. Dall'applet si fa un comune POST su https con upload di file di certificato + inserimento password. Il server risponde con alcuni cookies di sessione grazie ai quali si riesce ad accedere ai dati.

Ora: l'idea era di accedere all'area protetta con un script, che salva i dati, li formatta in un modo più intelligente per poi usarli all'interno delle nostre applicazioni. Ovviamente, essendo clienti, si potrebbe cercare di contattare la ditta e chiedere della API per accedere in modo diverso; questo in teoria, ma in pratica le persone preposte sono allegramente in vacanza, per cui si cercano strade alternative sicuramente più stimolanti.

Ovviamente si parte dal decompilatore java JAD. L'applet è decisamente complessa, formata da diversi package ed il tutto è "offuscato". Per cui mi trovo a dover capire cos'è la classe a dentro il package j. Davvero una rottura, tanto più che il decompilato è ben lontanto dall'essere perfetto, e si hanno diversi errori, per cui non posso neanche cercare di sistemare un po' i nomi da eclipse con il refactor, perchè il progetto non compila. E la cosa si fa lunga.

Il POST viene effettutato dall'applet su https, quindi non mi sono d'aiuto nè HTTPLiveHeader (vediamo solo la riposta del server, che setta alcuni cookie) nè wireshark (perchè tutto crittato) . Devo quindi passare da java.

La prima idea è di cercare di sostituire a runtime la classe che gestisce le connessioni https, e redirigere lo stream anche su file o su stdout, in modo da vedere nella javaconsole del browser cosa cazzo sta inviando l'applet, per cercare poi di replicarlo in uno script.
Il problema è che dovremmo capire bene come viene lanciata la console e inserire lì dentro il codice per caricare le nostre classi. Allora io ed il mio collega compagno di tante avventure decidiamo di sostituire direttamente la classe che gestisce https nella libreria ufficiale di sun. Cerchiamo il jar, lo scompattiamo, prendiamo la classe (appartentente al package sun.net.www , quindi proprietario) e la decompiliamo con JAD. Il risultato è sicuramente migliore che con l'applet, ed il codice è leggibile e compilabile.

Aggiungiamo un paio di brutali System.out e via. Ricompiliamo, rimettiamo nel jar e riavviamo firefox. Questo procedimento è stato eseguito diverse volte su diverse classi, ma alla fine ce l'abbiamo fatta: ecco sulla java console comparire un po' di dati interessanti. Per capire che.. il tutto è crittato anche a livello applicativo! Ovviamente la trasformazione di quello che spedisce è presente nel codice del decompilato, per cui magari appena ho tempo cerco di reversare il tutto..

giovedì 12 luglio 2007

Nintendo ds lite + DS Browser

Premessa:negli ultimi due mesi ho dato una mano ad un mio amico per alcuni lavori. Quando mi ha dato dei soldi per questo, mi sono detto "questi soldi finiscono in cazzate".

E così è stato.

Prima cosa che ho preso: nintendo ds lite con Brain Training, ottimo compagno di viaggio per la mia condizione di pendolare. In treno aprire un portatile è un po' problematico. Aprire un fottuto ds decisamente no. E poi speravo di poterlo usare per leggere i pdf, ma non è così, almeno per ora. Poi ieri capita che mi lascio prendere da un pallino che avevo da tempo: il ds browser. Cazzo, costa un botto, però ci metto un secondo ad accedere ad internet, senza accendere nessun pc, ma solo l'access point. Detto fatto.. torno a casa, preparo tutto e lo provo subito: non va.

Error code 51300

Credo che lassù in alto si ricorderanno ancora per un pezzo delle cose che ho detto in quel momento.. di sicuro mi staranno aspettando, ma vabbè. La sera stessa vado dalla donna. Il ds non vede neanche la sua rete wireless. Oggi in università: si connette. Cazzo allora non è un pacco come pensavo.. forse si riesce ancora a sistemare. Finito in università vado al lavoro. E lì non funziona. Altre frasi a dir poco ingiuriose, ma vabbè. Torno a casa e capisco che: alla nintendo ignorano l'esistenza di utenti un minimo preparati sul funzionamento di una wireless. Cazzo, che problema c'è a fare un elenco delle impostazioni?! Ma dico io, siete proprio degli infami.

Così si usa il vecchio metodo da smanettoni: via a tentativi. Ed il risultato è stranamente positivo :)

In questo momento sono sul sito mawk con il ds (chissà cosa si vede nelle statistiche.. riguardo al browser e SO.. ) e sull'access point ho le seguenti impostazioni:

Essid attivo, dhcp attivo, solo 802.11b, data rate 2M (credo sia questo il motivo principale del malfunzionamento di ieri), IAPP disabled, sul canale 6 (ma chi se ne frega di questo..sarebbe meglio non andare sul 14) e nessuna WEP (la sala macchine è in taverna.. non c'è bisogno di proteggerla, tanto più che non prendo neanche al piano terra)

L'ap è un vecchio digicom, che ha qualche malfunzionamento in caso di impostazioni troppo pesanti.. però almeno funziona :)