Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 27
  1. #1
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565

    WIN32 - Trasferire contenuti da un processo all'altro

    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.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  2. #2
    Il metodo più semplice per far comunicare due processi, è quello di utilizzare il messaggio WM_COPYDATA.
    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.

  3. #3
    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; 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 interessante che spiega perché non va bene usare la ReadProcessMemory come metodo di IPC.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    I Memory Mapped File li ho già usati e sono una buona soluzione al problema.

    Volendo comunque usare Read e WriteProcessMemory?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    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?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    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.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Non ho esigenze specifiche, non ho un'idea in mente...

    codice:
    int main()
    {
        int i;
       
       while(true)
    {
        cout << i;
    }
    return i;
    }
    Vorrei da un altro processo leggere e modificare i senza usare FILES, PIPE, FILEMAPPING
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    La variabile i sta nello stack ... non puoi sapere esattamente dove ...

    Insomma ... non puoi ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Non posso sapere a runtime l'indirizzo della variabile usando & e cercando poi di passarla in qualche modo?

    Altrimenti, sapresti suggerire degli utilizzi appropriati?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.