Pitagora (Member)
Expert
Messaggi: 367
Iscritto: 12/06/2010
|
Avendo un indirizzo di memoria per esempio
Codice sorgente - presumibilmente C/C++ |
int *p = (unsinged int *) 0x00F;
|
È possibile vedere che byte ci sono, in quell'indirizzo, nel formato esadecimale?
|
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
Postato originariamente da Pitagora:
Avendo un indirizzo di memoria per esempio
Codice sorgente - presumibilmente C/C++ |
int *p = (unsinged int *) 0x00F;
|
È possibile vedere che byte ci sono, in quell'indirizzo, nel formato esadecimale? |
certo... però vedi solo i byte dell'address space del tuo processo. Non puoi leggere i byte di indirizzi di memoria appartenenti allo spazio di un altro processo (almeno non in modo semplice). |
|
Pitagora (Member)
Expert
Messaggi: 367
Iscritto: 12/06/2010
|
come è possibile vederli. Mi fai un esempio?
|
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
Codice sorgente - presumibilmente C++ |
/* visualizziamo 3 byte a caso */ unsigned char a,b,c; char *p = (unsigned char *)0xBADC0DE; a = p[0]; b = p[1]; c = p[2]; printf("a = %x\n", a); printf("b = %x\n", b); printf("c = %x\n", c);
|
Ultima modifica effettuata da TheKaneB il 30/10/2010 alle 22:56 |
|
Pitagora (Member)
Expert
Messaggi: 367
Iscritto: 12/06/2010
|
Compilando ho un:
Codice sorgente - presumibilmente Plain Text |
Perchè non mi fa accedere a quell'indirizzo di memoria perchè è preso a "cavolo"?
Ultima modifica effettuata da Pitagora il 31/10/2010 alle 14:21 |
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
Postato originariamente da Pitagora:
Compilando ho un:
Codice sorgente - presumibilmente Plain Text |
Perchè non mi fa accedere a quell'indirizzo di memoria? Quanti bytes ci sono in un indirizzo di memoria? |
è quantomeno "ovvio" che non ti faccia accedere! Il tuo processo non possiede i diritti per accedere a qualsiasi indirizzo preso a caso... devi allocare dello spazio con malloc e poi accedervi con quel codice.
L'indirizzo messo brutalmente nel codice va benissimo quando programmi dentro il kernel, oppure se programmi su una piattaforma con un OS permissivo (o meglio senza nessun OS). Su windows e linux ti attacchi al tram... per fortuna, direi!
PS: ogni indirizzo identifica un singolo byte. Ultima modifica effettuata da TheKaneB il 31/10/2010 alle 14:21 |
|
Pitagora (Member)
Expert
Messaggi: 367
Iscritto: 12/06/2010
|
mmmmm quindi
p[0] corrisponde al byte dell'indirizzo 0xBADC0DE
p[1] corrisponde al byte dell'indirizzo 0XBADCODE1
p[2] corrisponde al byte dell'indirizzo 0xBADC0DE2
giusto?
|
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
Postato originariamente da Pitagora:
mmmmm quindi
p[0] corrisponde al byte dell'indirizzo 0xBADC0DE
p[1] corrisponde al byte dell'indirizzo 0XBADCODE1
p[2] corrisponde al byte dell'indirizzo 0xBADC0DE2
giusto? |
esattamente :-) |
|
Pitagora (Member)
Expert
Messaggi: 367
Iscritto: 12/06/2010
|
Postato originariamente da TheKaneB:
Codice sorgente - presumibilmente C++ |
/* visualizziamo 3 byte a caso */ unsigned char a,b,c; char *p = (unsigned char *)0xBADC0DE; a = p[0]; b = p[1]; c = p[2]; printf("a = %x\n", a); printf("b = %x\n", b); printf("c = %x\n", c);
|
|
Il commento è inappropriato. È molto meglio così:
Codice sorgente - presumibilmente C++ |
/* visualizziamo i primi 3 byte a partire dall'indirizzo 0xBADC0DE */ unsigned char a,b,c; char *p = (unsigned char *)0xBADC0DE; a = p[0]; b = p[1]; c = p[2]; printf("a = %x\n", a); printf("b = %x\n", b); printf("c = %x\n", c);
|
Non per niente, ma è quello che mi ha fatto confondere le idee. |
|