PDA

Visualizza la versione completa : WIN32 - Trasferire contenuti da un processo all'altro


XWolverineX
17-12-2008, 20:03
Stavo pensando a un quesito

"Se ho 2 miei processi in esecuzione, come posso fare che l'uno possa cambiare le variabili dell'altro?"

Che poi si è formalizzato in

Avendo 2 processi, di cui 1 sicuramente ha una variabile x, come posso fare che un altro processo ne legga il valore, lo incrementi di 1 e lo riscriva?

Ho pensato ovviamente a Read e WriteProcess Memory, dandomi però alcuni dubbi

[list=a]
Per poter usare Read e Write process memory, un processo deve essere aperto usando gli adeguati flags. Ciò vuol dire che CHIUNQUE può scrivere memoria su un altro processo. Non è forse questa l'origine di molti bug ed exploit? Perchè fornire una funzionalità così potenzialmente pericolosa? Perchè non eliminarla, o almeno permetterla per concessione di un processo, non per una pretesa?
Esiste un modo per proteggere l'area di memoria di un processo?
Anche se fosse, dovrei sapere l'indirizzo di memoria di x. Come averlo? Banalmente avevo pensato di scriverlo su file e poi leggerlo, ma penso che l'indirizzo sia relativo allo spazio di memoria virtuale assegnato al processo stesso, quindi sarebbe un indirizzo non valido se usato in un altro processo. Il qualificatore volatile può aiutare in questi casi?
Esistono altri metodi per permettere la modifica di classi, variabili, strutture e quant'altro tra processi diversi? Ovviamente evitiamo la scrittura dei dati su file,quello è "ovvio"
[/list=a]

Grazie e scusate le eventuali sciocchezze dette.

Vincenzo1968
18-12-2008, 16:02
Il metodo più semplice per far comunicare due processi, è quello di utilizzare il messaggio WM_COPYDATA (http://msdn.microsoft.com/en-us/library/ms649011(VS.85).aspx).
Qui c'è un esempio:

http://msdn.microsoft.com/en-us/library/ms649009(VS.85).aspx

Esistono altri metodi, un po' più complicati, come i Memory Mapped Files o le Named Pipes. Con queste ultime puoi far comunicare due processi anche su due macchine diverse.

MItaly
18-12-2008, 16:24
a. Non è vero che chiunque può usare Read/WriteProcessMemory; per usarla il processo deve essere aperto con i flag PROCESS_VM_WRITE/READ e PROCESS_VM_OPERATION, il che richiede il possesso del privilegio SeDebugPrivilege e la sua esplicita abilitazione; questo privilegio è dato di default solo agli utenti amministratori (come è giusto che sia), per cui se uno non usa utenti amministratori per il lavoro normale (come si dovrebbe fare e come su Unix si fa da sempre) non rischia niente. In ogni caso si tratta di funzioni pensate per funzionalità di debug, e se non ci fossero non sarebbero possibili diversi "sporchi trucchi". Inoltre sotto Vista sono stati introdotti i cosiddetti "processi protetti", che non consentono tutta una serie di operazioni dall'esterno per evitare che la gente metta mano ad applicazioni che lavorano con il DRM. In ogni caso tieni conto che se disponi di diritti sufficienti per effettuare il debugging del kernel non c'è sicurezza che tenga.
b. e c. Devi usare i normali metodi di IPC (http://msdn.microsoft.com/en-us/library/aa365574(VS.85).aspx); tra l'altro un po' di tempo fa si era proprio parlato di memoria condivisa qui sul forum, fai una ricerca (cerca MapViewOfFile).
In ultimo, ti segnalo un articolo (http://blogs.msdn.com/oldnewthing/archive/2006/01/17/513779.aspx) interessante che spiega perché non va bene usare la ReadProcessMemory come metodo di IPC.

XWolverineX
18-12-2008, 20:57
I Memory Mapped File li ho già usati e sono una buona soluzione al problema.

Volendo comunque usare Read e WriteProcessMemory?

oregon
18-12-2008, 21:04
Originariamente inviato da XWolverineX
Volendo comunque usare Read e WriteProcessMemory?

Usare quelle API è abbastanza semplice (c'e' tutto su MSDN ...).

Ma è questo il tuo vero problema oppure è quello di sapere "esattamente" l'indirizzo (o gli indirizzi) dove leggere/scrivere nel processo target?

XWolverineX
18-12-2008, 21:10
Premetto che è una cosa con fini didattici, non voglio fare l'hacker.

Read e WriteProcessMemory le so usare, ma il problema è appunto capire a che indirizzo leggere per prelevare il valore di una data variabile.

oregon
18-12-2008, 21:45
Non puoi ottenere l'indirizzo di una variabile.

Primo perche' possono stare nello stack a runtime, secondo perche' i nomi delle variabili non ci sono piu' nel compilato ...

Il modo con cui utilizzare queste API dipende strettamente da cosa tu voglia fare ...

XWolverineX
18-12-2008, 21:50
Non ho esigenze specifiche, non ho un'idea in mente...



int main()
{
int i;

while(true)
{
cout << i;
}
return i;
}


Vorrei da un altro processo leggere e modificare i senza usare FILES, PIPE, FILEMAPPING

oregon
18-12-2008, 23:07
La variabile i sta nello stack ... non puoi sapere esattamente dove ...

Insomma ... non puoi ...

XWolverineX
18-12-2008, 23:38
Non posso sapere a runtime l'indirizzo della variabile usando & e cercando poi di passarla in qualche modo?

Altrimenti, sapresti suggerire degli utilizzi appropriati?

Loading