2011-09-01 5 views
16

Mi chiedevo se fosse possibile accedere a un blocco di memoria diretto utilizzando C/C++ e prendere il valore. Per esempio:Accesso agli indirizzi di memoria diretti e ottenimento dei valori in C++

int i = 15; 
int *p = &i; 
cout << &i; 

Se ho preso il valore stampato qui, che mi avrebbe dato l'indirizzo della variabile i, che contiene il valore 15. Mi limito a dire che stampato 0x0ff9c1 per questo esempio. Se ho un programma separato che dichiara un puntatore in questo modo ...

int *p = 0x0ff9c1; 
cout << *p; 

sarebbe possibile stampare che il 15 che l'altra applicazione collocato nella 0x0ff9c1 blocco di memoria? So che la mia dichiarazione puntatore con l'indirizzo di memoria non è corretto, non sono sicuro di come farlo altrimenti. Ho provato a utilizzare memcopy ma non sono riuscito a farlo funzionare. So che questo è possibile in qualche modo perché ho un programma chiamato Cheat Engine che modifica i valori dell'indirizzo di memoria di gioco per ottenere vantaggi ingiusti. Ho avuto successo nel posizionare la posizione della memoria stampata e ottenere il valore (15) nonostante Cheat Engine. Il mio obiettivo è farlo usando C++. Se questo è troppo confuso, fondamentalmente mi piacerebbe accedere a una variabile che un'altra applicazione memorizza usando il suo indirizzo di memoria e stampare il valore. Sto usando Windows 7 x64 con il compilatore MinGW se questo è importante. Grazie!

PS: posterò un'immagine di ciò che Cheat Engine fa per dare un'idea migliore. enter image description here

+5

+1 per tali esperimenti. – Nawaz

+3

legge un libro sulla memoria virtuale. Come nota aggiuntiva: Linux e alcune nuove versioni di Windows impiegano la randomizzazione dello stack, quindi gli indirizzi delle variabili locali varieranno tra le esecuzioni del programma. – unkulunkulu

+0

Sì, nonostante la sperimentazione l'ho scoperto. Stavo pensando di esportare l'indirizzo attraverso un argomento di esecuzione per il secondo programma. Guarderò nella memoria virtuale, grazie per il suggerimento. – llk

risposta

6

I due processi hanno spazi di indirizzi separati. Un processo non può accedere ad un'altra memoria processses a meno che non sia esplicitamente condivisa memoria.

+0

@Shadowalker Basandosi sulla risposta di Ed, l'indirizzo all'interno del puntatore non è l'indirizzo fisico reale all'interno della RAM, è solo l'indirizzo locale all'applicazione (in un certo senso, un indirizzo virtuale). –

+0

In che modo i debugger e altri programmi come Cheat Engine possono accedervi? Da quanto ho capito, OLLYDbg e Cheat Engine non installano driver del kernel o ganci seri. Potrei sbagliarmi però. – llk

+1

Quale sotto Windows userebbe 'ReadProcessMemory()' e 'WriteProcessMemory()'. – trojanfoe

1

In generale, non è generalmente possibile per un programma modificare la memoria di un altro. Il sistema fa di tutto per garantirlo. Se così non fosse, nessun programma sarebbe sicuro. Questo è particolarmente vero in tutte le varianti di Unix su cui ho lavorato, anche se non su tutti i SO proprietari che ho visto.

noti che nessuna di queste regole si applicano al kernel ...

C'è anche un paradigma di programmazione chiamato memoria condivisa, ma è necessario impostare in modo esplicito che fino.

Risposta breve: di solito non è possibile farlo. I credi al numero che hai menzionato. Non so nulla di Windows, quindi il tuo chilometraggio può variare.

+0

La risposta è focalizzata in modo un po 'errato e rigorosamente non esattamente corretto, perché i sistemi operativi forniscono mezzi per i processi di modificare la memoria l'uno dell'altro. La risposta dovrebbe concentrarsi sul fatto che gli spazi di memoria sono diversi, quindi i puntatori con valori uguali si riferiscono a differenti posizioni di memoria fisica in processi diversi. – unkulunkulu

+0

Non sentivo che una lezione di memoria virtuale completa fosse giustificata anche se forse necessaria. –

5

Non è possibile farlo in modo indipendente dalla piattaforma in C++. Anche se non ho usato questo "cheat engine" in particolare, quasi sicuramente sta usando la stessa API speciale che usa un debugger. Il codice sarà specifico per Windows e sarà necessario un determinato livello di privilegi sul processo in esecuzione.

(Per esempio, se si utilizza Visual Studio ed eseguire un programma da esso in una modalità di debug, Visual Studio può guardare e modificare i valori in quel programma.)

non ho scritto un debugger in un po ', in modo da non so dove un buon posto per iniziare sulle API di debug è, ma è possibile cercare in tutto il web per cose come questo articolo:

http://www.woodmann.com/fravia/iceman1.htm

+0

Nota: come altri sottolineano, l'API del debugger non è l'unica API privilegiata che determinate piattaforme possono offrire per attirare l'attenzione in altri processi. (In effetti, alcuni sistemi embedded non si preoccupano affatto di spazi di indirizzi separati e consentono comunque di compilare sorgenti C e C++, quindi il vostro esempio "ingenuo" potrebbe effettivamente funzionare su quelle piattaforme molto basilari.) Stavo solo indovinando che le probabilità erano l'API di debug era ciò che usava - al contrario degli hook utilizzati da SpyXX o altro. – HostileFork

3

Se si desidera cambiare la memoria utilizzata da un altro processo, un modo sarebbe quello di iniettare il codice nell'altro processo. Da quel punto, puoi fare tutto ciò che vuoi nella memoria dell'altro programma come se fosse il tuo.

Cerca in giro per remote thread creation o hooking. Ci sono più di alcune domande a riguardo qui (e here, per i principianti).

Problemi correlati