Thursday, September 28, 2006

Il codice offuscato e il senso di sicurezza (presunta...)

Oggi, spinto anche dalla curiosità, mi sono dedicato alla simpatica operazione di hacking di un eseguibile dotnet, perchè?
Semplicemente per scopi accademici, il prodotto in questione di cui non farò nomi, ma che è rilasciato da un importante, molto importante gruppo italiano, serve per "gestire" alcune informazioni presenti in un database di Sql Server.
Al fine di "obbligare" l'utente finale ad usare il prodotto e a non accedere direttamente ai dati su Sql Server alcune informazioni, dicamo quelle cruciali, sono crittografate.
Il prodotto in questione esiste in 2 versioni una stand alone (quella che ho sottomano in questo momento) e una versione nata apposta per l'intergrazione in altre applicazioni, il mio intento era di capire come fare l'integrazione in un'applicazione esistente senza dover necessariamente acquistare la versione ad hoc, il tutto per il semplice fatto che la documentazione dice poco e nulla e di avere una demo non se ne parla neanche...
Bene, il primo obiettivo è stato quindi quello di decifrare le informazioni presenti nel db...
Mi sono armato di reflector e dopo aver scoperto che il codice era offuscato mi sono accontentato di leggere l'MSIL che nonostante sia un po' più ostico ha praticamente rivelato in un tempo direi irrosorio tutte le informazioni che mi servivano, dalle chiavi di crittografia a un paio di trucchetti "subdoli" :-D usati usati per "mischiare" le chiavi, all'algoritmo simmetrico usato e via dicendo... diciamo che nel giro di 30 minuti ho scritto un piccolo tool che estrae e decodifica le informazioni che mi servono...

Ma non contento mi sono detto, ma è proprio necessario sto sbattimento?, leggere il codice IL, capire cosa e come è stato pensato e via dicendo? Ebbene no, assolutamente no :-D
Ho semplicemente creato un progetto console, ho aggiunto una reference all'eseguibile incriminato e via reflection gli faccio fare quello che voglio ottenendo le informazioni che mi servono... tempo totale 5 minuti e 5 (giuro) righe di codice...

Assembly assembly = Assembly.LoadFile( System.IO.Path.Combine( AppDomain.CurrentDomain.BaseDirectory, "NomeEseguibile.exe" ) );
Type t = assembly.GetType( "NameSpace.ClassePrivateCheFaIlLlavoroSporco", false, true );
Object obj = Activator.CreateInstance( t, new object[] { "StringaPerPiccoloTrucchettoScovataNelDB" } );
MethodInfo mi = t.GetMethod( "MetodoPerLaDecodifica" );
String decodedResult = ( String )mi.Invoke( obj, new object[] { "StringaCodificata" } );

Perchè tutto ciò? semplicemente per dire che offuscare il codice vi protegge, forse..., da quelli che cercano di decompilare al fine di copiare ma vi da anche un senso di sicurezza decisamente fasullo... Non ho idea di che offuscatore sia stato usato, quindi non so se ve ne siano di più sofisticati che rendono il lavoro più arduo... e sinceramente la cosa mi tocca molto poco.
Vediamo se il buon Marcello interviene con qualche interessante considerazione. Sottolineo infine 2 cose:
  • Tutto ciò che è fatto dall'uomo è smontabile dall'uomo, è solo una questione di tempo;
  • Tutto è in chiaro, basta saperlo leggere ;-) (cit. l'unico e inimitabile Raffaele);
Meditate gente, meditate :-D
.m

Saturday, September 23, 2006

Verticalizzazioni, no grazie.

In questo periodo mi sto occupando dello sviluppo di un interessante applicazione distribuita, l'applicazione alla fine è il "solito" gestionale quello che lo rende interessante per lo sviluppatore, almeno per lo sviluppatore che c'è in me ;-), sono caratteristiche come:
  • è distribuita, il cliente ha più di una sede;
  • il collegamento tra le sedi non è "garantito", quindi le sedi devono poter lavorare in off-line tra loro e sincronizzarsi;
  • i client devono poter lavorare, in maniera trasparente (sul modello di Outlook 2003 con Cached Exchange Mode), disconnessi e anch'essi sincronizzare le modifiche all'uopo.
  • l'applicazione dovrà integrarsi con un software di contabilità esistente che non offre nessuna soluzione facile all'integrazione.. l'idea è quella di inventarsi una sorta di front-end basato o su Remoting o su Web Services ( e perchè non WCF ) per poter poi dialogare in maniera agevole.
Uno degli obiettivi principi è la "modularità", in questo senso uno dei primi ostacoli che abbiamo trovato è stata nella gestione dei "listini" (intesi come listini di vendita), il cliente ha una serie di prodotti commercializzati e una produzione propria, nonostante i prodotti siano fondamentalmente della stessa categoria sono però radicalmente diversi dal punto di vista della gestione.
La prima proposta è stata naturalmente:
"Be' dove sta il problema verticalizziamo, spieghiamo al ns sistema come funziona ogni singolo prodotto e andiamo avanti..."
Sarà..., ma a me il termine verticalizzazione già da solo mi fa venire l'orticaria, se poi lo associo al fatto che la conseguenza sono le mani legate di fronte a futuri sviluppi l'orticaria si trasforma in orch*te :-D
Quindi mi sono armato di santa pazienza e mi sono impuntato, dicendo no.
Ho passato qualche giorno con il naso all'insù a ragionare su una architettura che risolvesse elegantemente il problema senza rendermi conto che ce l'ho sotto il naso ormai da qualche anno...

Ebbens si "Visual Studio" e la gestione dei Component(s)/Control(s), Visual Studio è in grado di gestire un Control non tanto perchè conosce nello specifico quel particolare control ma bensì perchè conosce la sua firma di base (quella di System.Windows.Forms.Control) e sa che quel determinato controllo potrebbe implementare delle interfaccie o essere marcato con attributi che ad esempio spiegano come invocare partiolari Designer o particolari TypeConverter, e chi più ne ha più ne metta.
Questo sofisticato meccanismo è quello che ci permette di sviluppare i ns controlli custom, aggiungerli alla Tool Bar di Visual Studio e vedere che miracolosamente questi vengono gestiti come i controlli builtin del framework, con la possibilità di essere draggati, configurati e manipolati sul designer...

Mi sono "armato" di carta e penna e ho disegnato il mio bel modello mettendo da una parte del muro il ns gestionale e dall'altra i "prodotti", alla fine ho realizzato un prototipo del sistema che funziona egregiamente (già adesso sia in ambiente Web che Windows Forms).
E' quindi possibile comportarsi esattamente come ci si comporta con Visual Studio, è possibile scegliere un Assembly, visualizzare tutti i Prodotti definiti nell'assembly caricato e aggiungere una reference al prodotto scelto, da quel momento in poi l'applicazione è in grado di dialogare alla perfezione con il nuovo prodotto grazie ad una serie di "designer" e "configurator", proprio come farebbe Visual Studio attraverso la property grid e le sue estensioni.
Il modello è decisamente "semplice", cuore del sistema sono le classi:
  • "Product" (abstract) la classe base per ogni prodotto;
  • "Settings" la classe base per gestire (e in particolare persistere) i settaggi di ogni singolo prodotto;
  • "Settings.ExtendedData" (abstract) da cui i prodotti specializzati possono derivare per aggiungere propri settings specifici, l'unico requisito è la serializzabilità del dato;
  • "ProductDesignerProvider" la classe con cui l'applicazione è in grado di interagire per invocare i designer per i prodotti specializzati;
  • "ProductDesigner" il designer vero e proprio, nel caso di un'applicazione Windows Forms ad esempio uno UserControl, che verrà invocato dal suo "ProductDesignerProvider";
L'applicazione è in grado di capire quali "designer" e quali "designer provider" utilizare grazie ad una serie di attributi con cui sono marcate le classi specializzate dei prodotti.
Il lavoro da fare è ancora molto, ma quello realizzato sino ad ora è decisamente soddisfacente. Ho appena cominciato ad abbozzare i "ProductConfigurator" che sul modello dei ProductDesigner permetteranno all'utente di selezionare un prodotto configurarlo per le sue necessità e inserirlo in un'offerta, o in un ordine o in una commessa pronta per la produzione
Il passaggio successivo sarà quello di realizzare dei "renderer" finalizzati a renderizzare il "listino" e quindi i singoli prodotti su una superficie, sia essa il video o la carta di una stampante... in questa direzione mi alletta molto WPF ma sia i tempi stretti che la curva di apprendimento di WPF mi fanno propendere per una soluzione "tradizionale".
Il vero pregio di questo modello? Semplicemente che consente di aggiungere a "caldo" nuovi prodotti senza preoccuparsi di dover redistribuire l'applicazione, ma non solo permette a chiunque, con la dovuta documentazione alla mano, di sviluppare un nuovo prodotto, proprio come si farebbe con un controllo per Visual Studio.
Stay tuned ;-)
.m

Tuesday, September 19, 2006

Windows Vista e i Junction Point

per diletto e uso personale ho sviluppato un piccolo (ormai mica troppo piccolo) software per sincronizzare il contenuto di 2 o più cartelle tra PC diversi, siano essi in rete locale o ad esempio accessibili via FTP o chi più ne ha più ne metta :-D, facendo qualche test su Windows Vista per verificarne la compatibilità mi sono imbattuto nei Junction Point, in breve i Junction Point sono delle sorte di place holder per garantire la compatibilità con le applicazini legacy, la necessità nasce dal fatto che in Vista la pozione di molte cartelle di sistema è cambiata, ad esempio i profili utente non sono più in "%SystemDrive%\Documents & Settings" ma ora sono in "%SystemDrive%\Users" oppure le cartelle "My Pictures" e "My Music" non sono più all'interno di "My Documents" ma ora sono direttamente figlie della cartella del profilo utente.
I Junction Point risolvono questo problema permettendo alle applicazioni che si aspettano di trovare un certo "Path" di continuare ad attraversarlo accedendo però alla risorsa nella nuova posizione. Ho sottolinato attraversare perchè di default nelle ACL di un Junction Point i permessi per Everyone sono Deny Read inoltre sembra che l'unica possibilità per un'applicazione sia quella di avere i permessi per "Traverse Folder", quindi non dovrebbe essere possibile enumerare il contenuto di un junction point.
Da notare quindi che per led applicazioni legacy i permessi devono essere comunque esplicitamente abilitati.
In effetti questo è proprio il problema in cui mi sono imbattuto, il sistema per distinguere se l'oggetto che abbiamo in mano è un junction point è verificare che negli attributi sia marcato come ReparsePoint e System (in contemporanea), programmaticamente la cosa è molto semplice, un esempio semplice semplice è il seguente:
foreach( DirectoryInfo sd in myDir.GetDirectories() )
{
    Boolean isReparsePoint = ( sd.Attributes & FileAttributes.ReparsePoint ) == FileAttributes.ReparsePoint;
    Boolean isSystem = ( sd.Attributes & FileAttributes.System ) == FileAttributes.System;

    if( !isReparsePoint && !isSystem )
    {
        //Access granted...
    }
}

.m

Windows Vista, la User Experience e le finezze grafiche

Decisamente raffinato dal punto di vista grafico, nulla a che vedere col caramelloso (IMHO) tema luna di XP e molto più "MacOS X like", a ben guardare sembra che a Redmond abbiano mutuato motle delle funzionaltà e molto della User Interface Experience di casa Apple (almeno questa è la mia impressione da parziale fruitore di un sistema MacOS X.
Veramente belli gli effetti che explorer produce quando le icone vengono visualizzate con una dimensione da Tiles in su, ad esempio nella cartella "Pictures" le cartelle mostrano una preview del loro reale contenuto come ben si evince dall'immagine qui sotto.

La grafica precisa e comunicativa contribuisce a rendere l'esperienza dell'utente migliore e l'interazione con il sistema decisamente più intuitiva:

Ad esempio tutte le operazioni che invocheranno il sistema di UAC sono contrassegnate da un piccolo scudo dando un immediato feedback all'utente.
.m

Sempre su Windows Vista

Ci sono molte altre cose che mi piacciono molto, e faccio fatica a trovare cose che piacciono poco.
il motore di ricerca
I sistemi di ricerca sono stati desisamente migliorati, a dire il vero tutta l'interfaccia di Explorer è notevolmente più fruibile e personalizzabile, di tutto quello che il sistema di ricerca permette di fare la cosa che più mi piace è la possibilità di cercare all'interno del menù start, aprendolo la prima voce in basso è proprio una bella casella di testo in cui, senza neanche portarci il focus, è possibile digitare il nome, o parte di esso, del software che stiamo cercando e il menù start farà vedere una vista filtrata secondo il criterio di ricerca inserito.
Per chi, come me ha sempre un menù start decisamente affollato, direi molto utile ;-)
explorer
Molto utile la possibilità di personalizzare la nuova barra dei links di Explorer inserendo le "links" alle proprie cartelle.
Altrettanto piacevole è la presenza di quella "tool strip" orizzontale sensibile al contesto in cui di volta in volta appaiono scompaioni i comandi diposbili in base alla selezione corrente.
Sempre di Explorer adoro la nuova barra degli indirizzi composta anche questa da una serie di bottoni che permettono di navigare in maniera decisamente intuitiva all'interno della struttura delle cartelle.



Questa funzionalità mi ha permesso di abbandonare in maniera indolore l'uso del Task Pane con l'albero delle cartelle perchè cliccando sulle freccette presenti tra un bottone e l'altro viene visualizzato l'elenco delle sottocartelle presenti.
fast user switching
Finalmente è possibile usare la funzionalità multi utente (fast user switching) anche se la workstation è in un dominio active directory, funzionalità che veniva automaticamente disattivata su XP all'atto del Join su AD.
Da sottolineare che sia "hibernate" che "standby" funzionano a meraviglia anche con più di un utente loggato, cosa che su Windows 2003 usando Remote Desktop in loopback dava, almeno a me, non pochi grattacapi.

.m

Windows Vista, alcune impressioni

Come Lorenzo sto usando Vista (RC1 Build 5600) ormai da qualche tempo, facendolo diventare il mio sistema principale, lo uso ormai da qualche settimana come sistema di produzione, va che è una meraviglia.
Per ora sono risuciuto a installarci di tutto da Visual Studio 2003/2005 a Sql Server 2k/2500, Office 2007 Beta2 Tech Refresh etc. etc., qualche problema che non ho ancora risolto con Virtual Server che si installa alla perfezione ma poi va poco d'accordo con il dirver della scheda di rete WiFi rendendo un po' macchinosa la connessione in rete delle VM...
Ho avuto una grossa magagna con i driver della scheda video (NVidia) che Vista ha correttamente riconosciuto durante il setup ma che poi ha disgraziatamente aggiornato da Windows Update creandomi mille problemi... la rimozione manuale è stata un delirio (il tentativo di rollback produceva inesorabilmente un BSOD) ma alla fine ce l'ho fatta... curioso è notare che l'aggiornamento è sparito da Windows Update, che si siano accorti che il driver nuovo era un po' troppo bacato? :-D
Come Lorenzo apprezzo moltissimo il UAC, devo dire che è abbastanza noiso se usate la macchina come Administrator, o comunque con un account con poteri amministrativi, perchè UAC si limita ad una dialog in cui chiede conferma dell'operazione... mi ricorda molto quella degli ActiveX... il rischio è quindi quello di vedere la gente che clicca indiscriminatamente su continua...se  non addirttura di vedere il fiorire di utility che lo fanno al posto vostro...
[Update]
Lorenzo, nei commenti, mi fa notare che il messaggio dell'UAC sta in un desktop diverso da quello corrente quindi risulterebbe impossibile scrivere una utility che clicchi al posto nostro.. meglio, molto meglio ;-)
[/Update]
Molto bello è invece il supporto che UAC da agli "utenti infimi", se usate la macchina come semplici User (lo fate tutti vero?) UAC interviene ogni volta che è necessario chiedendovi le credenziali di un utente abilitato a fare l'operazione richiesta, questo risulta estremamente utile perchè permette di fare praticamente tutto senza dover cambiare utente, bello perchè le stesse operazioni in XP/2003 sono in alcuni casi più macchinose se non addirittura impossibili. Ben fatto!
Piccola nota a margine, a parte i problemi con la scheda video avuti all'inizio non è ancora crashato una volta, veramente notevole e le performance sono più che buone.
Una seconda nota, seguendo questo post di Alessandro Perilli ho deciso di non metterci l'odiato Antivirus, in particolare sulla scorta degli ultimi 2 anni come "User infimo" in cui non è mai intervenuto una volta... prevenzione, pochi privilegi e attenzione sono la chiave ;-), meditate gente, meditate :-D
.m

Saturday, September 16, 2006

La "Grande Punto"

Da ieri sono in possesso della mia nuova macchina :-D, una Fiat Grande Punto, di quelle con il tastino "Windows" sul volante, ebbene si aprendo il cassettino porta oggetti in bella vista c'è uno "scatolotto" nero su cui campeggia la scritta "Windows Mobile", evitiamo battute inutili del tipo "ma quante volte premi ctrl+alt+canc prima di risucire ad accenderla?"
Semplicemente eccezzionale, il sistema in fiat si chiama Blue&Me e permette di controllare la stragrande maggioranza delle funzionalità di entertainment della vettura, permette inoltre di controllare in tutto e per tutto un telefono cellulare connesso via bluetooth, ho poi appena installato un aggiornamento che mi consente di far leggere alla macchina, ebbene si parla, gli sms in arrivo con tanto di capacità di interpretare le abbreviazioni e gli "smile".
La cosa più bella, soprattutto in ralzione alla sicurezza di marcia, è che tutti i comandi possono essere impartiti vocalmente alla macchina, che a sua volta risponde. E' quindi possibile dire in sequenza: Telefono --> Chiama --> Nome in rubrica per far si che venga avviata una chimata al numero scelto, se la rubrica è di quelle evolute, come ormai lo sono tutte, e qundi offre la possibilità di inserire più numeri per uno stesso contatto la macchina chiederà quale dei numeri presenti usare...
Allo stesso modo è possibile accedere alla lista delle chiamate effettuate, ricevute o perse...

Il sistema che monta è "Windows Mobile for Automotive 5.3", purtroppo mi sarebbe piaciuto trovare qualche info per sviluppatori, volete mettre il piacere di fare debug sulla propria macchina o di vederla miseramente crashare perchè avete scritto una minch**ta ;-), ma una prima ricerca su internet non ha dato gli esiti sperati.
.m

Tuesday, September 5, 2006

SourceControl

Ho da poco cambiato il sistema di SourceControl che uso per i miei progetti passando dal CVS (in versione CVSNT per Windows) a Vault di SourceGear.
Il motivo è molto semplice su Windows 2003 il plugin che usavo con Visual Studio 2005 (PushOk SCC Plugin) non si comportava molto bene, mentre non avevo problemi con Visual Studio 2003, lasciando spesso bloccati i suoi stessi file di supporto, ho provato a contattare il supporto tecnico che mi ha gentilmente risposto che era un problema noto (definito BUG proprio da loro) che era stato risolto nella nuova versione ma che la mia licenza non consentiva l'upgrade, dovevo semplicemente comperare una nuova licenza...non è tanto per i 19$ della licenza ma quanto per il principio!, ho abbandonato il CVS.
Il primo tentativo è andato verso SubVersion ma la "curva" anche per la sola installazione e configurazione del server sotto windows è semplicemente assurda, ci manca solo che debba perdere un pomeriggio, se non di più, per risuscire a farlo funzionare... folle!
Quindi mi sono ricordato di un post di Igor in cui diceva di aver installato Vault di SourceGear e ho deciso di provare.
Bene, dopo aver eseguito il download di tutto il necessario, ho installato e configurato la parte server (usando come repository una istanza di SqlExpress) in qualcosa come 15 minuti, non di più, sul client mi è bastato installare la parte client per l'integrazione con VisualStudio sia 2003 che 2005 e anche qui non ci ho messo più di 10 minuti.
Sicuramente un po' più ostico è stato spostare i progetti dal CVS al nuovo server, in particolare quelli in versione 7/7.1 cioè quelli costruiti con VisualStudio 2003/2002 che digerisce decisamente male la modifica del SourceControl provider, mi è toccato quindi editare a manina sia i file delle solution che quelli dei progetti.
Ho infine "installato", seguendo il consiglio del ns presidente, questo piccolo tool che permette di gestire al meglio i vari provider installati soprattutto con VisualStudio 2003.
Le prime impressioni su Vault dopo circa un mese di utilizzo abbastanza intenso sono ottime, le performance, soprattutto via internet sono abissalmente superiori a quelle del CVS, se poi ci mettiamo che sfrutta HTTP non dobbiamo neanche toccare la configurazione dei firewall per aprire porte appositamente. L'altra cosa molto bella è che il server espone tutta la sua API attraverso comodissimi Web Services è quindi possibile interfacciarsi (non ho ne provato ne letto la documentazione a corredo per ora) direttamente con il server da una propria applicazione.
L'unica pecca che ho trovato fino ad ora, se di pecca si può parlare, è che manca un client integrato con la shell di windows sul modello di TortoiseCVS che è veramente comodissimo, ma vista l'architettura non credo sia poi così ostico scriverselo... potrei anche provarci ;-)
.m

Monday, September 4, 2006

Windows Server 2003... e il DEP

Dunque... sul portatile uso Windows Server 2003 in versione standard e sviluppo ormai da parecchio tempo come semplice (o infimo come lo definisco io) User (cosa che dovreste fare tutti.), succede una cosa veramente strana, in maniera apparentemente casuale durante la preparazione per l'hybernate il tutto si blocca e windows "riappare" senza nessun messaggio di errore e senza nulla nei log di sistema, la cosa peggiore è che da quel momento li in avanti l'hybernate non è più disponibile fino al riavvio del sistema.
Dopo svariate analisi ho scoperto che la casua del tutto è il DEP (Data Exceution Prevention) che, bada ben, blocca Explorer.exe (:-|) durante la fase di preparazione all'hybernate "inpastrocchiando su" tutto...
La cosa peggiore è che i messaggi di errore del DEP non vengono visualizzati se non si è amministratori della macchina quindi in questo specifico caso il blocco era totalmente silente...
Una volta modificate le impostazioni del DEP dicendogli di escludere Explorer.exe il tutto ha ripreso a funzionare a meraviglia come un orologio svizzero.
.m

DELL, la mia esperienza

Circa tre mesi ho acquistato un nuovo portatile, un DELL Latitude D820, una vera bomba, Centrino CoreDuo, 2Gb di DDR un'ottima scheda video etc etc.. mi hanno regalato pure la seconda batteria con la quale arrivo a quasi 8 ore di autonomia!
Settimana scorsa ero da un potenziale cliente per una presentazione monto tutto attacco l'alimentatore e "puff" l'alimentatore schiatta...
Problemi non ne ho avuti avevo entrambe le batterie cariche. Intanto che finisco di montare chiamo l'assistenza e la mattina dopo senza battere ciglio UPS mi consegna un alimentatore nuovo!
Ma non solo già che c'ero ho esposto al tecnico un problema che avevo con la tastiera che sembrava leggermente incurvata in un punto rendendola un po' troppo flessibile, anche qui basito insieme all'alimentatore è arrivata una bella tastiera nuova che ha risolto il problema al volo e non solo probabilmente essendo un modello più recente ha anche un feeling decisamente migliore della precedente!
Be che dire davvero un customer care che si rispetti, per ora tra server dei clienti, mio server, portatile etc etc non mi hanno mai deluso!
Ciao
.m