XML - Immagini cifrate?

sabato 02 agosto 2008 - 10.33

xshell Profilo | Newbie

Buongiorno a tutti.

In questi giorni mi è capitato un documento XML sottomano, appartenente a un sistema di gestione forum gratuito, in cui le immagini della skin apparentemente non esistono nella cartella sorgente... ma compaiono una volta iniziato il processo di installazione dalla pagina "install.php". Cercavo le immagini per modificarle nel sorgente e non doverle più modificare ad ogni installazione.
In un certo momento apro un file .xml e, in esso, trovo proprio i nomi delle immagini che cercavo. Ma il codice contenuto nel file XML è un po' strano... simile a questo:

<?xml version="1.0" encoding="ISO-8859-1" ?> <xmlarchive generator="..." created="###"> <fileset> <file> <filename>immagine.png</filename> <content>iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAANbY 1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZ TwAAAA/SURBVHjaYmRgEhjIAIABBATA5EAIICIVggQQEQrBAggohUCBBDR CgECiGiFAAFEtEKAACJaIUAAEa0QIMAAs2IAetPOw3cAAAAASUVORK5CYII= </content> <path /> <binary>1</binary> </file> ...


Mi è venuta l'idea che questo documento potesse contenere le immagini stesse, dichiarate con un linguaggio che non conosco. E' possibile? Posso risalire alle immagini e magari scrivere un codice simile?

Grazie in anticipo per le risposte.

rossimarko Profilo | Guru

Ciao,

da quello che vedo mi sembra una codifica dell'array di byte nel formato base64 (http://it.wikipedia.org/wiki/Base64).

Se vuoi trasformare la stringa in un array di byte puoi usare la funzione Convert.FromBase64String (http://msdn.microsoft.com/en-us/library/system.convert.frombase64string.aspx)

Il processo inverso (da byte a stringa) si fa con il metodo Convert.ToBase64String (http://msdn.microsoft.com/en-us/library/dhx0d524.aspx).

-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

xshell Profilo | Newbie

Ti ringrazio per la risposta.

Ho guardato la codifica Base64, ma non sembrerebbe essere questa. Infatti, per fare una prova, ho aperto l'immagine generata dallo script con un editor esadecimale e il risultato è il seguente:

89504E470D0A1A0A0000000D494844520000000A0000000A08060 000008D32CFBD0000000467414D410000D6D8D44F583200000019 74455874536F6674776172650041646F626520496D616765526561 647971C9653C0000003F4944415478DA6264606048632002000410 1303910020808856081040442B040820A215020410D10A01028868 85000144B4428000225A21400011AD1020C000B362007AD3CEC377 0000000049454E44AE426082

Che tradotto in ASCII verrebbe:
.PNG........IHDR..............2......gAMA.....OX2.... tEXtSoftware.Adobe ImageReadyq.e<...?IDATx.bd``Hc ... ..... ..V..@D+.. ..........h...D.B.."Z!@.... ...b.z...w....IEND.B`.

Ricavando il codice esadecimale esatto dell'immagine, potrei rigenerarla? Non capisco perché l'abbiano codificata... il programma è gratuito e l'immagine viene comunque generata ed è disponibile...

Le informazioni che mi vengono fornite dal codice esadecimale sono, a prima vista due: è un'immagine PNG (ma questo lo sapevo già) e che è stata creata utilizzando Adobe ImageReady (ma a quanto pare non esiste più il programma perché si è fuso con Photoshop e Fireworks).

Vorrei esaminare le prime lettere: ".PNG" del codice non codificato... il simbolo del "punto" come è codificato con l'algoritmo Base64? Leggendo vari articoli, sembrerebbe che non esiste la codifica del punto. (Forse è una domanda stupida... però non sono esperto di questa codifica).

Ho provato a compilare i codici che sono su Wikipedia per creare programmi di conversione, ma non li compila.

rossimarko Profilo | Guru

Puoi allegare un file xml di esempio?
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

xshell Profilo | Newbie

Tutti i gestori di forum utilizzano questo strano sistema. Ti allego il file XML dell'interfaccia di Invision Power Board. Ma non ti aspettare più codice di quel che ti ho scritto... contiene solo i file immagine (penso) sottoforma di testo. Probabilmente c'è qualche file che opera la codifica... bisognerebbe cercarlo. Io non sono capace e sarebbe illegale postare tutto il gestore. Ti dico comunque che basta scaricare anche PHPBB da www.phpbb.com ed è pieno di questi file.

Una cosa che ti faccio notare: alcune immagini hanno la parte iniziale del codice identica (ad esempio: iVBOR). Se possono servirti, la prossima volta posto anche le prime immagini .png... magari, anzi sicuramente, esiste un meccanismo che le collega.

Ti ringrazio ancora per l'aiuto che mi stai dando. Ciao.

rossimarko Profilo | Guru

Ciao,

ho fatto un paio di prove con l'xml che mi hai girato e ti confermo che è un base64. Ho scritto una piccola applicazione di test che fa la seguente cosa:
XmlDocument xml = new XmlDocument(); xml.Load(@"D:\temp\file.xml"); //Seleziono il primo nodo per fare una prova XmlNode el = xml.SelectSingleNode("xmlarchive/fileset/file/content"); if (el != null) { byte[] arr = Convert.FromBase64String(el.InnerXml); File.WriteAllBytes(@"d:\temp\image.gif", arr); }

E il file che vado a creare si visualizza correttamente. Ovviamente dovrai perfezionarlo, ad esempio il nome del file è da leggere dall'xml.
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

xshell Profilo | Newbie

Grandioso!

Ho due ultime domande: il linguaggio che hai utilizzato è ActionScript, C++ oppure un altro linguaggio? Perché l'ActionScript non lo conosco... e in C++ non ho mai visto funzioni del tipo xml.load()...

Comunque ho provato utilizzando un convertitore online e la stringa risultante è la seguente:

‰PNG  IHDR 2ϽgAMAÖØÔOX2tEXtSoftwareAdobe ImageReadyqÉe<?IDATxÚbd``Hc ‘ €ˆV@D+ ¢Ñ ˆh…D´B€"Z!@­ À³bzÓÎÃwIEND®B`‚

Che non corrisponde con la stringa che ti avevo mostrato... come mai?

rossimarko Profilo | Guru

Ciao,

ho usato c# e il framework 2.0. Tu cosa stai utilizzando? C++ .net?
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

xshell Profilo | Newbie

No, veramente di tecnologia NET conosco solamente ASP.Net... ma di norma non creo applicazioni web e utilizzo C++ oppure Assembly x86. Come mai il codice convertito non coincide?

Un convertitore scritto in C/C++ è quello che ho trovato in Wikipedia:

union conv { unsigned int l; struct bytes { char b1; char b2; char b3; char b4; } b; }; char convert (char c) { if (c == 63) return 47; else if (c == 62) return 43; else if (c >= 52) return c - 4; else if (c >= 26) return c + 71; else return c + 65; } unsigned int toBase64(char b1, char b2, char b3) { conv src, dest; src.b.b1 = b3; src.b.b2 = b2; src.b.b3 = b1; src.b.b4 = 0; //conv.l == b4 b3 b2 b1 dest.b.b1 = convert(src.b.b1 & 0x3f); src.l = src.l >> 6; dest.b.b2 = convert(src.b.b1 & 0x3f); src.l = src.l >> 6; dest.b.b3 = convert(src.b.b1 & 0x3f); src.l = src.l >> 6; dest.b.b4 = convert(src.b.b1 & 0x3f); return dest.l; }

rossimarko Profilo | Guru

Ma in che tecnologia devi fare questa implementazione? Perchè se è asp.net il codice può essere o quello che ti ho postato oppure va tradotto in vb.net o un'altro dei linguaggi del framework
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

xshell Profilo | Newbie

L'ho appena creato in JavaScript (ho ritenuto sia il modo più semplice alla fine). Convertitore Base64 a ASCII Esadecimale, così non mi confondo con le lettere strane. Adesso basterà modificare le immagini, prelevare il codice esadecimale, convertirlo in Base64 e riscriverlo nel file .xml. Quando avrò tempo cercherò di capire quale file fa la decodifica vera e propria e lo modificherò. (Il C# non lo sò usare... uso VB.Net... ecco perché l'ho riscritto in JavaScript seguendo le indicazioni che mi ha suggerito il link che mi hai dato di Wikipedia).

xshell Profilo | Newbie

Guarda un po' che ho trovato: http://www.codeproject.com/KB/GDI-plus/image-base-64-converter.aspx

rossimarko Profilo | Guru

>Guarda un po' che ho trovato: http://www.codeproject.com/KB/GDI-plus/image-base-64-converter.aspx

E' l'operazione inversa rispetto a quanto riportato prima. Occhio che comunque anche questa è in c#..
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

xshell Profilo | Newbie

Ho deciso: imparerò il C# per il prossimo anno. Ma che cosa ha il C# di così innovativo e potente rispetto al C++? Serve anche per scrivere applicazioni Linux e Mac? (Adesso qui scatta il ban... ho sempre pensato che, chi usa il NET.Framework, odia in maniera morbosa tutti gli altri sistemi operativi che non siano Windows.)

rossimarko Profilo | Guru

Semplicemente c# è uno dei linguaggi del framework, insieme a VB.NET e c++.

Se ti serve qualche webcast per imparare asp.net qui ne puoi trovare alcuni: http://msdn.microsoft.com/it-it/cc299396.aspx

Però se vuoi imparare .net ti consiglio di prendere qualche libro a riguardo per iniziare.
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

xshell Profilo | Newbie

Quale libro mi consigli per iniziare a studiare C#? (Asp.net e VB.net li conosco a livello medio-elementare...)

rossimarko Profilo | Guru

io prima inizierei a studiare
>il framework.net e ti consiglio questo libro
>di jeff richter
>http://www.amazon.com/CLR-via-Second-Pro-Developer/dp/0735621632
>Una volta capito bene .net puoi passare a studiare i linguaggi
>e anche asp.net

Ottima segnalazione, è un libro veramente ben fatto
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

xshell Profilo | Newbie

Grazie a tutti voi per la disponibilità. Ciao e a buon rendere.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5