Differenze tra le versioni di "Nascondere un valore in una Struttura"

Da Gambas-it.org - Wikipedia.
(5 versioni intermedie di uno stesso utente non sono mostrate)
Riga 3: Riga 3:
 
Possiamo ''nascondere'' un valore all'interno di detta area di memoria, scrivendovelo, in modo tale que esso resti ''invisibile'' ed ''illegibile'' alla normale modalità per leggere i valori contenuti dai membri della ''Struttura''.
 
Possiamo ''nascondere'' un valore all'interno di detta area di memoria, scrivendovelo, in modo tale que esso resti ''invisibile'' ed ''illegibile'' alla normale modalità per leggere i valori contenuti dai membri della ''Struttura''.
  
Per fare ciò utilizzeremo i byte dell'area di memoria non occupati dai membri a causa dell'<i>allineamento</i> dei membri.
+
Per fare ciò utilizzeremo i byte dell'area di memoria non occupati dai membri a causa del loro <i>allineamento</i>.
 
 
  
 
Mostriamo un esempio commentato:
 
Mostriamo un esempio commentato:
  Public Struct STRUCTURA
+
  Public Struct STRUTTURA
 
   b As Byte
 
   b As Byte
 
   i As Integer
 
   i As Integer
Riga 15: Riga 14:
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
   
 
   
   Dim r As STRUCTURA
+
   Dim r As STRUTTURA
 
   Dim p, p2 As Pointer
 
   Dim p, p2 As Pointer
 
   Dim st As Stream
 
   Dim st As Stream
 
    
 
    
  With r = New STRUCTURA
+
  With r = New STRUTTURA
    .b = 99
+
    .b = 99
    .i = 9999
+
    .i = 9999
  End With
+
  End With
 
      
 
      
 
  <FONT Color=gray>' ''Vediamo in console i valori contenuti dai membri della "Struttura":''</font>
 
  <FONT Color=gray>' ''Vediamo in console i valori contenuti dai membri della "Struttura":''</font>
  Print "Valori iniziali della Struttura:"
+
  Print "Valori iniziali della Struttura:"
  With r
+
  With r
    Print .b
+
    Print .b
    Print .i
+
    Print .i
  End With
+
  End With  
 
+
 
 
 
  <FONT Color=gray>' ''Nascondiamo (scriviamo) un valore di tipo "Short" nella Struttura:''</font>
 
  <FONT Color=gray>' ''Nascondiamo (scriviamo) un valore di tipo "Short" nella Struttura:''</font>
  p = Object.Address(r)
+
  p = Object.Address(r)
  st = Memory p For Write
+
  st = Memory p For Write
 
  <FONT Color=gray>' ''I valori dell'area di memoria della Struttura, istanziata con la parola chiave "New", cominciano dal 25° byte (indice 24).''
 
  <FONT Color=gray>' ''I valori dell'area di memoria della Struttura, istanziata con la parola chiave "New", cominciano dal 25° byte (indice 24).''
  ' ''In questo caso il byte di indice 24, essendo occupato dal valore del primo membro (di tipo Byte) della Struttura, ci costringe a porre''
+
  ' ''In questo caso il byte di indice 24, essendo occupato dal valore del primo membro (di tipo Byte) della Struttura, ci costringe a porre il valore da nascondere al byte di indice 25 o a quello di indice 26.''</font>
' ''il valore da nascondere al byte di indice 25 o a quello di indice 26.''</font>
+
  Seek #st, 25
  Seek #st, 25
+
  Write #st, 11111 As Short
  Write #st, 11111 As Short
+
  st.Close
  st.Close
 
 
      
 
      
  <FONT Color=gray>' ''Vediamo ora se l'operazione di "nascondimento" (ossia di scrittura all'interno dell'area di memoria della Struttura) del valore di tipo "Short"''
+
  <FONT Color=gray>' ''Vediamo ora se l'operazione di "nascondimento" (ossia di scrittura all'interno dell'area di memoria della Struttura) del valore di tipo "Short" ha procurato un'alterazione ai danni dei valori contenuti dai due membri della Struttura medesima:''</font>
' ''ha procurato un'alterazione ai danni dei valori contenuti dai due membri della Struttura medesima:''</font>
+
  Print "\nValori della Struttura successivamente al nascondimento del valore di tipo 'Short' nella Strututra:"
  Print "\nValori della Struttura successivamente al nascondimento del valore di tipo 'Short' nella Strututra:"
+
  With r
  With r
+
    Print .b
    Print .b
+
    Print .i
    Print .i
+
  End With    
  End With
+
     
+
  <FONT Color=gray>' ''Ora andiamo a trovare il valore "nascosto" all'interno della Struttura. Utilizziamo una variabile di tipo "Puntatore" diversa da quella precedentemente usata, al fine di evitare qualsiasi dubbio di interferenza dei dati, scritti nel primo "Puntatore", con l'operazione di nascondimento, e di mostrare che puntando all'indirizzo dell'area di memoria della "Struttura", è possibile ottenere qualunque valore - anche a livello di singoli byte - in essa contenuto:''</font>
   
 
  <FONT Color=gray>' ''Ora andiamo a trovare il valore "nascosto" all'interno della Struttura.''
 
' ''Utilizziamo una variabile di tipo "Puntatore" diversa da quella precedentemente usata, al fine di mostrare che puntando all'indirizzo dell'area di memoria''
 
' ''della "Struttura", è possibile ottenere qualunque valore - anche a livello di singoli byte - in essa contenuto: </font>
 
 
   p2 = Object.Address(r)
 
   p2 = Object.Address(r)
  p2 = p2 + 25
+
   Print "\x0A\x0AIl valore nascosto è:  \e[31m", Short@(p2 + 25)
   Print "\x0A\x0AIl valore è:  ";; Short@(p2)
 
 
    
 
    
 
  '''End'''
 
  '''End'''

Versione delle 23:53, 10 ott 2022

Sappiamo che è possibile leggere e scrivere all'interno dell'area di memoria occupata da una Struttura.

Possiamo nascondere un valore all'interno di detta area di memoria, scrivendovelo, in modo tale que esso resti invisibile ed illegibile alla normale modalità per leggere i valori contenuti dai membri della Struttura.

Per fare ciò utilizzeremo i byte dell'area di memoria non occupati dai membri a causa del loro allineamento.

Mostriamo un esempio commentato:

Public Struct STRUTTURA
  b As Byte
  i As Integer
End Struct


Public Sub Main()

 Dim r As STRUTTURA
 Dim p, p2 As Pointer
 Dim st As Stream
 
 With r = New STRUTTURA
   .b = 99
   .i = 9999
 End With
   
' Vediamo in console i valori contenuti dai membri della "Struttura":
 Print "Valori iniziali della Struttura:"
 With r
   Print .b
   Print .i
 End With 

' Nascondiamo (scriviamo) un valore di tipo "Short" nella Struttura:
 p = Object.Address(r)
 st = Memory p For Write
' I valori dell'area di memoria della Struttura, istanziata con la parola chiave "New", cominciano dal 25° byte (indice 24).
' In questo caso il byte di indice 24, essendo occupato dal valore del primo membro (di tipo Byte) della Struttura, ci costringe a porre il valore da nascondere al byte di indice 25 o a quello di indice 26.
 Seek #st, 25
 Write #st, 11111 As Short
 st.Close
   
' Vediamo ora se l'operazione di "nascondimento" (ossia di scrittura all'interno dell'area di memoria della Struttura) del valore di tipo "Short" ha procurato un'alterazione ai danni dei valori contenuti dai due membri della Struttura medesima:
 Print "\nValori della Struttura successivamente al nascondimento del valore di tipo 'Short' nella Strututra:"
 With r
   Print .b
   Print .i
 End With     

' Ora andiamo a trovare il valore "nascosto" all'interno della Struttura. Utilizziamo una variabile di tipo "Puntatore" diversa da quella precedentemente usata, al fine di evitare qualsiasi dubbio di interferenza dei dati, scritti nel primo "Puntatore", con l'operazione di nascondimento, e di mostrare che puntando all'indirizzo dell'area di memoria della "Struttura", è possibile ottenere qualunque valore - anche a livello di singoli byte - in essa contenuto:
  p2 = Object.Address(r)
  Print "\x0A\x0AIl valore nascosto è:  \e[31m", Short@(p2 + 25)
  
End