Come si potrebbe fare per leggere la memoria da un processo? È diverso dal sistema operativo?


11

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

Sono curioso di sapere come si potrebbe persino iniziare a cercare un blocco di memoria e quindi a leggerlo (ad esempio, leggere il timer in una partita a miniere)? È diverso dalla versione OS / OS?

Risposte:


14

Questa è una domanda un po 'complicata e persino complessa, nel senso che puoi approfondire. Ma per semplificare un po 'le cose:

Considerando il tuo esempio di " leggere il timer in una partita a mine ":

Il primo passo è trovare l'indirizzo di memoria . Questo di solito viene fatto con uno strumento chiamato editor di memoria (in alcuni casi farebbe anche un debugger) che può usare vari metodi per trovare la posizione di una variabile nella memoria di processo . Il modo comune è cercare un certo valore (ad esempio il valore del timer) nello spazio di memoria del processo target, quindi modificare il valore target (ad es. Far avanzare il timer) e cercare nuovamente le corrispondenze. Questo processo fissa i candidati su ogni iterazione fino a quando rimane solo la variabile esatta. Prendere l'indirizzo di quella variabile nello spazio di memoria del processo è solo questione di un clic del mouse con un editor di memoria.

Il secondo passo è modificare i dati in quel particolare indirizzo . Come ciò dipende dal sistema operativo. Con Windows , esiste una chiamata WinAPI denominata WriteProcessMemoryche può essere utilizzata per scrivere dati predefiniti in un determinato indirizzo all'interno dello spazio di memoria del processo di destinazione. Nel nostro esempio, useresti questa funzione per sovrascrivere la variabile timer nel processo target con il tuo valore desiderato, cambiando efficacemente il timer nel gioco.

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


La posizione della variabile sarà la stessa ogni volta che il processo viene eseguito?
brunoqc,

1
@brunoqc No, quasi sicuramente no.
Dan,

2

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

Ecco come farlo su Linux: /unix/6301/how-do-i-read-from-proc-pid-mem-under-linux


quale sistema operativo non lo consentirebbe? Sembra che tu possa farlo almeno su Linux e Windows
Eva,

@Evan Ogni sistema operativo deve consentire (limitato, per motivi di sicurezza) la modifica della memoria di processo remota a scopo di debug. Tuttavia, si noti che ad esempio la mancata corrispondenza dei privilegi per motivi di sicurezza potrebbe impedirne la lettura / scrittura della memoria di processo di un processo con privilegi più elevati. Un buon esempio di ciò sarebbe quello di non consentire a un processo con privilegi di utente guest di leggere / scrivere la memoria di un processo con diritti di amministratore, in quanto ciò potrebbe potenzialmente compromettere l'intero sistema ed essere un modo diretto per un utente guest di ottenere i privilegi di amministratore su il sistema.
zxcdw,

1

Un'applicazione riceve un intervallo di memoria dal sistema operativo. Generalmente, l'applicazione deve richiedere la memoria ma quella funzionalità può essere oscurata al programmatore a causa della lingua.

Lingue come C consentono richieste di blocco per dimensioni specifiche, mentre altre lingue come C ++, C # e Java consentono richieste mediante l'uso di parole chiave come new. Ogni lingua ha diversi modi per allocare memoria, quindi questa è solo una breve panoramica. Il rilascio della memoria al sistema operativo può essere eseguito in modo esplicito o tramite un Garbage Collector.

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

Il più delle volte, non devi preoccuparti dell'accesso specifico alla memoria all'interno del tuo programma. I costrutti del linguaggio e il sistema operativo oscurano effettivamente quella preoccupazione per te.

Il tuo esempio di timer in un gioco è un ottimo esempio di dove non dovresti preoccuparti dell'allocazione di memoria sottostante. Avrai una variabile che rappresenta il timer e leggerai semplicemente dalla variabile.

La mia risposta è rilevante per quando si sta scrivendo l'applicazione, mentre la risposta di zxcdw è rilevante per l'accesso alla memoria che appartiene a un'altra applicazione. I termini LMGTFY sarebbero "debugging" e "reverse engineering" per approfondire ulteriormente tale argomento.

Qualche lettura aggiuntiva:

  • L'articolo di Wikipedia sulla memoria del computer ti darà una panoramica decente delle cose.
  • Quindi, consulta l'articolo di Wikipedia sull'I / O mappato in memoria per comprendere meglio le macchinazioni che si verificano.
  • Infine, guarda l'articolo sulla memoria virtuale per ottenere una risposta migliore su come ciascun sistema operativo gestirà la mappatura della memoria in modo leggermente diverso rispetto agli altri.

risposta eccellente, anche se sì, in questo caso sono più interessato a leggere la memoria da un'applicazione che non ho scritto da solo. Valuterò non appena avrò 15 rappresentanti;)
Eva

@Evan - allora sicuramente leggi l'articolo sulla memoria virtuale. Ciò ti darà una migliore comprensione della mappatura che continua. Devi capire la mappatura per separare un'app. La maggior parte dei debugger ti consentirà di collegarti a un processo in esecuzione che ti permetterà di vedere le istruzioni e la memoria dell'applicazione.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.