Difficoltà:  
3 / 5
Il
controllo FBI Spy Memory consente di monitorare il contenuto
di un'area di memoria indicata da un puntatore oppure da un puntatore ad
un altro puntatore, per l'ampiezza desiderata. I dati possono essere restituiti
sia in modalità raw che formattati in esadecimale. Il controllo è
particolarmente studiato per l'analisi di stringhe.
Proprietà 
Utilizzabile in fase di progettazione |
Accessibile in lettura in fase di esecuzione |
Accessibile in scrittura in fase di esecuzione |
- Address As Long
 
Restituisce o imposta l'indirizzo puntato.
Rappresenta il puntatore all'area dati da esaminare.
- Length As Long
  
Restituisce o imposta la lunghezza dell'area dati da restituire.
Quando la proprietà RelativeLength indica il valore
False, Length indicherà semplicemente l'ampiezza
dei dati dati da controllare e restituire. Quando la proprietà
RelativeLength indica il valore True, Length sarà
utilizzata come offset (relativo alla proprietà Address)
all'area contenente l'ampiezza dei dati. Vedi
note (2).
- RefreshSpeed As Integer
  
Restituisce o imposta la velocità di aggiornamento.
- RelativeLength As Boolean
  
Determina se il valore specificato nella proprietà Length è relativo
alla locazione di memoria puntata (offset).
Determina il comportamento della proprietà Length. Quando
assume il valore False, l'ampiezza dell'area dati da controllare
sarà un numero assoluto; in caso contrario la proprietà
Length sarà utilizzata come posizione relativa alla proprietà
Address. Vedi note (2).
- UsePointer As Boolean
  
Restituisce o imposta un valore che determina se l'area di memoria contiene
un puntatore ad un'altra area di memoria.
Determina se la proprietà Address conterrà l'indirizzo
dei dati da controllare oppure sarà un riferimento ad un'altra
area dati. Vedi note (1).
- UseTimer As Boolean
  
Restituisce o imposta un valore che determina se debba essere utilizzato
un timer che genera l'evento Refresh ad ogni intervallo indicato dalla
proprietà RefreshSpeed.
Consente di attivare un timer automatico che ad ogni intervallo
indicato dalla proprietà RefreshSpeed lanci l'evento Refresh.
Metodi 
- AbouBox
Tipo di metodo: |
Sub |
Parametri richiesti: |
(nessuno) |
Definizione: |
Sub AboutBox() |
Mostra le informazioni di copyright del controllo.
- Content
Tipo di metodo: |
Function |
Parametri richiesti: |
(nessuno) |
Definizione: |
Function Content() As Variant |
Restituisce il contenuto dell'area di memoria puntata.
Il valore di ritorno sarà un Variant contenente una matrice
di bytes.
- FormatHex
Tipo di metodo: |
Function |
Parametri richiesti: |
(nessuno) |
Definizione: |
Function FormatHex() As String |
Restituisce un dump formattato dell'area di memoria puntata.
- SpyMemory
Tipo di metodo: |
Function |
Parametri richiesti: |
newAddress As Long
newLength As Long |
Definizione: |
Function SpyMemory(ByVal
newAddress As Long, ByVal newLength As Long) As Variant |
Assegna in un'unica operazione i valori alle proprietà Address e
Length e restituisce il contenuto dell'area di memoria indicata.
Eventi 
- Error
Parametri richiesti: |
ByVal lngPtr As Long
ByVal lngLength As Long |
Definizione: |
Event Error(ByVal lngPtr
As Long, ByVal lngLength As Long) |
Viene generato in caso di errore, ovvero quando la lunghezza dei
dati è un valore minore di 0 oppure maggiore di 8192.
È generato dalla funzione Content nel momento in cui viene
valutata l'ampiezza dei dati da controllare, sia da dimensione fissa,
sia da lunghezza relativa.
- Refresh
Parametri richiesti: |
(nessuno) |
Definizione: |
Event Refresh() |
Viene generato ad ogni intervallo specificato dalla proprietà RefreshSpeed,
se la proprietà UseTimer è impostata su True.
Note
Esistono fondamentalmente due modalità di
funzionamento: con puntatore diretto o con puntatore relativo ad un altro
puntatore. La prima modalità si rivela utile per verificare dati
di volta in volta, senza riutilizzare variabili o indirizzi per molte
istruzioni. La seconda modalità è utile per analizzare variabili
globali, delle quali può cambiare il contenuto ma non la posizione.
Il comportamento delle due modalità è regolato dalla proprietà
UsePointer: il valore False indica di non utilizzare
un puntatore indiretto ma fare riferimento direttamente all'indirizzo
indicato dalla proprietà Address; il valore True
indica invece che la proprietà Address contiene l'indirizzo di
un altro puntatore che l'analisi dovrà utilizzare per recuperare
l'indirizzo finale.
Nel caso di una variabile stringa, ad esempio potremmo puntare il suo
valore assegnando alla proprietà Address il valore restituito
da StrPtr(stringa), con la proprietà UsePointer impostata
su False. Al cambio di valore della stringa, probabilmente corrisponderà
un cambiamento dell'area dati, rendendo quindi il riferimento non più
valido. Assegnando invece alla proprietà Address il valore
di VarPtr(stringa) ed impostando la proprietà UsePointer
su True, indicheremmo sempre l'area dati corretta, poiché all'indirizzo
VarPtr(stringa) si trova il puntatore corrispondente a StrPtr(stringa).
Anche la proprietà Length può
assumere due differenti significati in ragione del valore della proprietà
RelativeLength: nel caso che quest'ultima sia False,
la proprietà Length indicherà la lunghezza in bytes dell'area
di memoria da esaminare; ad esempio 2 per una variabile di tipo Integer
o 4 per una di tipo Long.
Quando la proprietà RelativeLength contiene il valore True,
allora la proprietà Length indicherà la posizione
in cui si trova la dimensione dell'area da esaminare. Tale posizione è
relativa alla proprietà Address; un valore positivo indica
che la lunghezza si trova dopo il puntatore indicato dalla proprietà
Address, mentre un valore negativo indica che la lunghezza si trova
prima dell'area puntata. Una stringa, ad
esempio, contiene la sua lunghezza 4 bytes prima dell'indirizzo dei dati;
in tal caso assegneremmo alla proprietà RelativeLength il
valore True ed alla proprietà Length il valore -4.
Si rivela particolarmente comoda per quei dati come le stringhe la cui
dimensione varia costantemente in funzione della loro lunghezza.

Figura 1
Nell'esempio dimostrativo e mostrato nella Figura 1, la lunghezza della
stringa analizzata (Specifica un valore per la variabile strTesto)
non è determinato direttamente dal form utilizzatore del controllo
ma dal riferimento relativo alla lunghezza e dal puntatore a puntatore.
Poiché il controllo lavora direttamente con i dati dalla memoria,
un utilizzo errato può comportare malfunzionamenti
del programma, fino al blocco totale del computer. Si raccomanda quindi
di utilizzare il controllo con la massima cura, verificando che i valori
delle proprietà Address, Length e RelativeLength
siano corretti.
|