2012-04-28 11 views
5

Consente di dire che l'indirizzo di memoria 0A7F03E4 memorizza un valore 124. Come cambiarlo in 300 usando python? Esiste un modulo fornito per questo tipo di attività?Come modificare il valore memorizzato nell'indirizzo di memoria?

+1

Potrebbe essere necessario occuparsi della protezione della memoria. Se questo è codice o leggi solo dati, non sarai in grado di scrivere su quell'indirizzo. –

+0

Stai parlando di un indirizzo di memoria virtuale o di una memoria fisica? –

risposta

8
>>> import ctypes 
>>> memfield = (ctypes.c_char).from_address(0x0A7F03E4) 

Ora si può leggere memfield, assegnare ad esso, fare quello che vuoi. Finché hai accesso a quella posizione di memoria, ovviamente.

è anche possibile ottenere un memarray con

>>> memarray = (ctypes.c_char*memoryfieldlen).from_address(0x0A7F03E4) 

che vi dà un elenco di memfields.

Aggiornamento: ho appena letto che si desidera recuperare un numero intero. in questo caso, usa ctypes.c_int, ovviamente. In generale: utilizzare il ctype appropriata;)

+0

Questo non ti darebbe l'indirizzo di memoria virtuale del processo python piuttosto che l'indirizzo fisico? Quest'ultimo sarebbe probabilmente inaccessibile a seconda del sistema operativo e dei privilegi di processo. –

+0

quando si desidera accedere a un campo non-dati oa un campo al di fuori della memoria raggiungibile, si otterrà ovviamente un segfault. – ch3ka

1

Hai provato il modulo incorporato in ctypes? Fornisce una funzione memset che dovrebbe darti quello che ti serve.

1

Su UNIX, si può provare a open() il dispositivo /dev/mem di accedere alla memoria fisica, e quindi utilizzare il metodo dell'oggetto fileseek() impostare il puntatore del file al posto giusto. Quindi utilizzare il metodo write() per modificare il valore. Non dimenticare di codificare il numero come una stringa grezza!

Generalmente, solo l'utente root ha accesso a questo dispositivo, tuttavia.

Problemi correlati