Come si fa a leggere la memoria da un processo? È diverso dal sistema operativo?

11

Come sviluppatore web esperto, ma un programmatore principiante di "basso livello", questa roba è ancora una specie di voodoo per me.

Sono curioso di sapere come iniziare a cercare un blocco di memoria e poi a leggerlo (ad esempio, leggere il timer in un gioco di mine)? È diverso dalla versione OS / OS?

    
posta Eva 24.10.2012 - 14:42
fonte

3 risposte

13

Questa è una domanda un po 'complicata e persino complessa, nel senso che puoi andare abbastanza in profondità con questo. Ma per semplificare un po 'le cose:

Considerando il tuo esempio di " lettura del timer in un gioco di mine ":

Il primo passo è trovare l'indirizzo di memoria . Questo di solito è fatto con uno strumento chiamato editor di memoria (farebbe anche un debugger, in alcuni casi) che può utilizzare vari metodi per trovare la posizione di una variabile nella memoria di elaborazione . Un modo comune è quello di cercare un determinato valore (ad esempio il valore del timer) nello spazio di memoria del processo di destinazione, quindi modificare il valore target (ad esempio, far avanzare il timer) e cercare di nuovo le corrispondenze. Questo processo mette a nudo i candidati ogni iterazione finché non rimane solo la variabile esatta. Prendendo l'indirizzo di quella variabile all'interno del processo 'lo spazio di memoria è solo questione di un clic del mouse con un editor di memoria.

Il secondo passaggio consiste nel modificare i dati in quel particolare indirizzo . Il modo in cui questo viene fatto dipende dal sistema operativo. Con Windows , c'è una chiamata WinAPI chiamata WriteProcessMemory che può essere utilizzata per scrivere dati predefiniti su un dato indirizzo all'interno dello spazio di memoria del processo di destinazione. Nel nostro esempio, useresti questa funzione per sovrascrivere la variabile del timer nel processo di destinazione con il tuo valore desiderato, cambiando efficacemente il timer nel gioco.

In pratica dovresti trovare il processo di destinazione ID di processo , e quindi allegare il tuo processo illecito al processo di destinazione per ottenere la possibilità di modificare la sua memoria spazio. Questo è un compito abbastanza banale, ma non contribuisce a rispondere alla domanda, quindi l'ho lasciato come un esercizio per il lettore. ;)

    
risposta data 24.10.2012 - 14:54
fonte
2

È completamente diverso dal sistema operativo. Alcuni non ti permetteranno di farlo affatto, e devi avere alcuni mezzi per sapere dove si trovano i dati che desideri nello spazio di memoria del bersaglio.

Ecco come farlo su Linux: link

    
risposta data 24.10.2012 - 14:48
fonte
1

Un'applicazione riceve un intervallo di memoria dal sistema operativo. In genere, l'applicazione deve richiedere la memoria, ma tale funzionalità potrebbe essere oscurata dal programmatore a causa della lingua.

Lingue come C consentono richieste di blocco per dimensioni specifiche, mentre altri linguaggi come C ++, C # e Java consentono richieste tramite l'uso di parole chiave come new . Ogni lingua ha un numero di modi per allocare memoria, quindi questa è solo una breve panoramica. Rilasciando la memoria sul sistema operativo può essere fatto esplicitamente o attraverso un garbage collector.

L'accesso alla memoria all'interno dell'applicazione dipende da come è stato allocato. C e C ++ sono i più noti per usare il concetto di puntatori per indicare / tracciare dove si trova la memoria. Altrimenti, l'accesso alla memoria viene gestito tramite la classe o la variabile che è stata creata.

La maggior parte delle volte, non devi preoccuparti dell'accesso specifico alla memoria all'interno del tuo programma. I costrutti e il sistema operativo del linguaggio oscurano in modo efficace questa preoccupazione per te.

Il tuo esempio di un timer in un gioco è un ottimo esempio di dove non ti devi preoccupare dell'allocazione di memoria sottostante. Avrai una variabile che rappresenta il timer e ti basta leggere dalla variabile.

La mia risposta è rilevante per quando si scrive l'applicazione, mentre la risposta di zxcdw è rilevante per accedere alla memoria che appartiene ad un'altra applicazione. I tuoi termini LMGTFY sarebbero "debugging" e "reverse-engineering" per approfondire ulteriormente l'argomento.

Alcune letture aggiuntive:

  • L'articolo di Wikipedia su Memoria del computer ti fornirà una decente panoramica delle cose.
  • Quindi guarda l'articolo di Wikipedia su I / O mappato in memoria per ottenere una comprensione più profonda di le macchinazioni che succedono.
  • Infine, guarda l'articolo su Memoria virtuale per ottenere una risposta migliore su come ciascun sistema operativo gestirà il mapping della memoria a un po 'diverso dagli altri.
risposta data 24.10.2012 - 15:55
fonte

Leggi altre domande sui tag