Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET] Nascondere file in immagine
Forum - C# / VB.NET - [VB.NET] Nascondere file in immagine

Avatar
Pinnolo (Normal User)
Rookie


Messaggi: 28
Iscritto: 15/03/2008

Segnala al moderatore
Postato alle 20:10
Domenica, 07/09/2008
Questo topic è stato chiuso dal moderatore

Ciao a tutti, chiedo il vostro aiuto, a voi che siete più esperti di me, in quanto mi sono bloccato in un punto.

Sto scrivendo un applicazione che mi permetta di nascondere un qualsiasi file in una immagine (il tutto protetto con password).

Fin qui tutto a posto. Il problema è nell' operazione inversa, ovvero riestrarre il file una volta nascosto.

Tralasciando il discorso password che è semplicissimo, volevo chiedervi come possa risolvere il problema dato che non so da dove cominciare.

Per aiutare me e voi vi posto il codice per nascondere un file in una immagine con la speranza che possiate darmi una mano.
Codice sorgente - presumibilmente VB.NET

  1. Try
  2.  
  3.             Dim buffer1(4096) As Byte
  4.             Dim readByte As Integer
  5.             Dim us As FileStream
  6.             Dim os As FileStream
  7.  
  8.             Try
  9.                 File.Copy(TextBox1.Text, TextBox4.Text)
  10.                 us = New FileStream(TextBox2.Text, FileMode.Open)
  11.                 os = New FileStream(TextBox4.Text, FileMode.Append)
  12.                 Do While True
  13.                     readByte = us.Read(buffer1, 0, buffer1.Length)
  14.                     If readByte = 0 Then Exit Do
  15.                     os.Write(buffer1, 0, readByte)
  16.                 Loop
  17.             Catch ex As IOException
  18.                 'Inserire qui la gestione degli errori di IO
  19.             Catch ex As Exception
  20.                 'Inserire qui la gestione degli altri errori
  21.             Finally
  22.             End Try
  23.             If Not (os Is Nothing) Then os.Close()
  24.             If Not (us Is Nothing) Then us.Close()
  25.         Catch ex As Exception
  26.             MsgBox("Errore nell' applicazione", MsgBoxStyle.Critical)
  27.         End Try


dove la textbox1 racchiude la directory dell' immagine, la textbox2 quella del file (od archivio) e la textbox4 racchiude la directory del file di output, poi c'è una textbox3 con la password (ma tralasciamola).

Spero di essere stato chiaro così come spero che possiate aiutarmi a risolvere questo brutto problema.

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:58
Lunedì, 08/09/2008
Di solito i file immagine hanno un codice che indica la fine del file. Ad esempio, i JPEG hanno la sequenza di byte FF FB (ossia 255 251): durante la lettura, se incontri questi byte, significa che l'immagine è finita e inizia il testo steganografato. Per ulteriori informazioni, guarda la mia guida al capitolo B8.

PM
Avatar
Pinnolo (Normal User)
Rookie


Messaggi: 28
Iscritto: 15/03/2008

Segnala al moderatore
Postato alle 13:32
Lunedì, 08/09/2008
Testo quotato

Postato originariamente da Il Totem:

Di solito i file immagine hanno un codice che indica la fine del file. Ad esempio, i JPEG hanno la sequenza di byte FF FB (ossia 255 251): durante la lettura, se incontri questi byte, significa che l'immagine è finita e inizia il testo steganografato. Per ulteriori informazioni, guarda la mia guida al capitolo B8.

Ciao totem, ti ringrazio per l' interessamento, però forse non mi hai capito:

i file in questione non sono file testuali, tantomeno si tratta di testo digitato.

I file a cui mi riferisco sono file .exe o .zip o anche .txt, insomma ogni sorta di file.

Con il codice che ho scritto sopra sono riuscito a fare tutto ciò, il problema è che non riesco poi a "riestrarlo", ovvero a dividere nuovamente l' immagine ed il file, riportando tutto allo stato iniziale.

Come hai detto tu, bisogna utilizzare la sequenza finale del file immagine, ma il problema è che non so come procedere nè da dove iniziare.


Per quanto riguarda la steganografia, quello è un discorso a parte, in quanto lo sto usando per nascondere la password e so benissimo come procedere e cosa fare.

L' unico problema (non certo piccolo!) e quello che vi (ti) ho descritto sopra.

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 18:43
Lunedì, 08/09/2008
Il testo è dato comunque de una sequenza di bytes, quindi dire testo o dire zip è la stessa cosa. Inoltre questo è uno dei modi di fare steganografia, quindi il termine non è improprio.

Io proporrei di aggirare il problema, nel vero senso della parola. Anziché iniziare dall'inizio, inizi a leggere dalla fine del file. Qui, nei DATI nascosti poni un header proprietario, in cui i primi bytes servano da riconoscimento e quelli successivi indichino la dimensione dei dati da leggere.
Quindi un file potrebbe terminare con questi bytes, ad esempio:
Codice sorgente - presumibilmente Plain Text

  1. 10 00 00 00 FC FD FE FF


che, letti al contrario, diventano:
Codice sorgente - presumibilmente Plain Text

  1. FF FE FD FC 00 00 00 10


Consideriamo i primi quattro bytes come header dei dati nascosti, poiché è molto improbabile che un file qualsiasi termini con quattro byte in successione. Dopo questo, vengono quattro bytes che codificano un Integer (intero a 4 bytes), il cui valore è 16. Questo significa che il programma deve leggere 16 bytes da quel punto retrocedendo nello stream. Ignenioso, vero?

PM
Avatar
Pinnolo (Normal User)
Rookie


Messaggi: 28
Iscritto: 15/03/2008

Segnala al moderatore
Postato alle 21:18
Lunedì, 08/09/2008
Allora ti dico come (prima che mi consigliassi quest' altra procedura) avevo fatto. Questo perchè mi hai dato tu lo spunto quando hai usato la parola "steganografia", poi mi hai detto di considerare un qualsiasi file come testo, così ho pensato di "leggere", subito dopo aver trovato le sequenze FF D9 (ovviamente sto considerando una immagine .jpg con un file nascosto al suo interno) che codifica la fine del file, i bytes nascosti e di aggiungerli in un array.

Poi ho pensato che attraverso la funzione write avrai potuto scrivere in un nuovo file l' array di bytes nascosti nel file .jpg.

Questo è il codice:
Codice sorgente - presumibilmente VB.NET

  1. Try
  2.             Dim Buffer() As Byte = IO.File.ReadAllBytes(TextBox1.Text)
  3.             Dim EOF As Boolean = False
  4.             Dim Bytesnascosti As New List(Of Byte)
  5.             For I As Int64 = 0 To Buffer.Length - 1
  6.                 If EOF Then
  7.                     Bytesnascosti.Add(Buffer(I))
  8.                     Continue For
  9.                 End If
  10.                
  11.                 If I = Buffer.Length - 1 Then
  12.                     Exit Sub
  13.                 End If
  14.  
  15.                 If Buffer(I) = 255 And Buffer(I + 1) = 217 Then
  16.                    
  17.                     EOF = True
  18.                    
  19.                     I += 1
  20.                 End If
  21.             Next
  22.  
  23.             Dim Bytes(Bytesnascosti.Count - 1) As Byte
  24.             Bytesnascosti.CopyTo(Bytes)
  25.  
  26.             Dim filenascosto As New FileStream(TextBox2.Text, FileMode.CreateNew)
  27.  
  28.             filenascosto.Write(Bytes, 0, Bytesnascosti.Count - 1)
  29.  
  30.             If Not (filenascosto Is Nothing) Then filenascosto.Close()
  31.         Catch ex As Exception
  32.             MsgBox(ex.ToString, MsgBoxStyle.Critical)
  33.         End Try



Il risultato di output?
Mi ritrovo un file identico a quello nascosto (con la stessa icona, la stessa dimensione, etc...)
ma corrotto, in quanto nel momento in cui lo voglio eseguire mi dà un errore dicendomi che non si tratta di una applicazione win32 valida.

Probabilmente ci sarà un errore stupido, ma purtroppo queste sono le mie conoscenze e\o le mie esperienze, per cui proprio non riesco a capacitarmi.....

Inoltre se pur abbia perfettamente capito quanto tu mi hai consigliato nel thread precedente, non so come metterlo in pratica, quindi ti sarei molto grato se mi aiutassi

Ultima modifica effettuata da Pinnolo il 08/09/2008 alle 22:22
PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:27
Martedì, 09/09/2008
Il codice di lettura sembra giusto, è quello del capitolo sull'input/output di file binari. Forse bisognerebbe controllare il codici che scrive i dati e, soprattutto, controllare i dati scritti con un hex editor, almeno all'inizio e alla fine.

Poi, se hai capito quello che ti ho suggerito, converrai che è inutile farlo se usi solo file jpeg, di cui conosci perfettamente la fine.
Tuttavia, se vuoi implementarlo, questo codice ti potrebbe essere utile:
Codice sorgente - presumibilmente VB.NET

  1. Function GetData(ByVal File As String) As Byte()
  2.         Dim Bytes() As Byte = IO.File.ReadAllBytes(File)
  3.         Dim Null As Byte() = New Byte() {}
  4.  
  5.         If Bytes.Length < 8 Then Return Null
  6.  
  7.         Dim LEnd As Int32 = Bytes.Length - 1
  8.         Dim HeaderFound As Boolean = True
  9.  
  10.         For I As Int32 = LEnd To LEnd - 3 Step -1
  11.             If Not Bytes(I) = 255 - (LEnd - I) Then
  12.                 HeaderFound = False
  13.                 Exit For
  14.             End If
  15.         Next
  16.  
  17.         If HeaderFound = False Then Return Null
  18.  
  19.         Dim SizeBytes(3) As Byte
  20.         Dim Size As Int32 = 0
  21.         Dim DataBytes() As Byte
  22.  
  23.         Array.ConstrainedCopy(Bytes, Bytes.Length - 8, SizeBytes, 0, 4)
  24.  
  25.         For I As SByte = 3 To 0 Step -1
  26.             Size += SizeBytes(I) * 2 ^ (I * 8)
  27.         Next
  28.  
  29.         ReDim DataBytes(Size - 1)
  30.         Array.ConstrainedCopy(Bytes, Bytes.Length - 8 - Size, DataBytes, 0, Size)
  31.  
  32.         Return DataBytes
  33.     End Function


PM
Avatar
Pinnolo (Normal User)
Rookie


Messaggi: 28
Iscritto: 15/03/2008

Segnala al moderatore
Postato alle 15:01
Martedì, 09/09/2008
Ho risolto potete chiudere e\o cancellare

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 17:24
Martedì, 09/09/2008
Chiudo.

PM