PDA

View Full Version : [ Vb.Net 2008 ] Indirizzi di Memoria - Genymus


Genymus
07-02-2010, 00:15
Salve, ho la necessità di creare un'applicazione che mi consenta di ottenere, leggere e scrive su indirizzi di memoria di un certo programma.
Esempio:
Voglio visualizzare tutti gli indirizzi di memoria utilizzati dal calc.exe, dopodichè li volgio leggere e sucessivamente modificare.
L'applicazione dovrà quindi crearmi una lista dove compaiano gli indirizzi utilizzati, tipo così:
AF23F4
A1321D
22FF00
13F503

Successivamente io prendo una di queste stringhe e le vado a leggere e sucessivamente modificare.
Su un tutorial ho letto che posso utilizzarre le api:
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Integer, ByVal dwProcessId As Integer) As Integer

Public Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Integer, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer

Public Declare Function ReadProcessMemory Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Integer, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer

Il problema è che comunque non riesco ad ottenere la lista degli indirizzi usati.
Oltre a questo non ho capito bene un'altra cosa:
Dopo essermi "attaccato" al processo usando quest'altro pezzo di codice:
Dim ProcessName As Process() = Process.GetProcessesByName("calc")
HProcess = OpenProcess(&H1F0FFF, 0, ProcessName(0).Id)
dovrei utilizzare le seguenti chiamate per leggere e scrivere sulla memoria...
ReadProcessMemory(HProcess, Address, Variable, 4, Nothing)
WriteProcessMemory(HProcess, Address, Value, 4, Nothing)
da quello che ho capito, il 4 sta per i byte, rispettosamente, letti o scritti... cosa significa? Quanti byte posso usare? Sono sempre e solo 4? Cambia se sviluppo l'applicazione a 64 bit al posto di 32?

Grazie

MarcoGG
07-02-2010, 09:59
Scusa, ma : utilità di tutto ciò ?!
A parte che andare a scrivere a casaccio nella memoria occupata da un processo non mi pare molto costruttivo, potrebbe avere risultati indesiderati, produrre crash, e/o non essere proprio consentito...

Nel caso specifico, l'uso esterno di calc da VB.NET è possibile ( e per inciso, superfluo ), senza un approccio così cruento, ad esempio come viene spiegato qui da un Mod di MSDN Forums :
http://social.msdn.microsoft.com/Forums/en/isvvba/thread/e9b2c76c-c96e-46a8-b5cc-d26798e831ae

Genymus
07-02-2010, 16:35
il mio era solo un'esempio, la mia applicazione dovrà andare a modificare gli indirizzi di memoria di altre applicazioni.

gugoXX
07-02-2010, 16:36
il mio era solo un'esempio, la mia applicazione dovrà andare a modificare gli indirizzi di memoria di altre applicazioni.

Ovviamente il sistema operativo non te lo permettera'.

Genymus
07-02-2010, 18:40
Ovviamente il sistema operativo non te lo permettera'.

:eek: Come mai?

gugoXX
07-02-2010, 18:50
:eek: Come mai?

Se il sistema operativo permettesse a qualunque processo (come il tuo) di scrivere quello che vuole sul processo di chiunque altro, sul nostro computer avremmo piu' virus di quelli che gia' ci sono, addirittura piu' virus che programmi.

Potrai usare questo comando su qualunque processo dal tuo iniziato (te stesso o un altro processo figlio del tuo processo), oppure il tuo processo dovra' avere un paio di privilegi su quello target.
Forse con le detours si puo' fare qualcosa, ma tanto... sono destinate a morire (Se non le aggiornano o non le hanno gia' aggiornate).

Genymus
07-02-2010, 21:00
Quindi è una cosa destinata a fallire?
Ma il funzionamento dei trainer e dei debugger non è identificare e modificare i vari indirizzi di memoria?

...Potrai usare questo comando su qualunque processo dal tuo iniziato (te stesso o un altro processo figlio del tuo processo)...
Se avviassi io il programma aprendo il processo, automaticamente non ho il controllo su di esso?

Non è questo il comando?
HProcess = OpenProcess(&H1F0FFF, 0, ProcessName(0).Id)
Ps: Il comando lo ho ripreso dal primo post.

Grazie

gugoXX
07-02-2010, 21:07
Provaci, i pezzi della ricetta sono quelli.
Se funziona sono 2 chiamate ;)

Genymus
08-02-2010, 14:17
ok ci proverò, comunque prima devo trovare gli indirizzi di memoria... proverò facendo il debug dell'applicazione in questione.

Genymus
10-02-2010, 19:13
Non riesco a capire come scansionare la memoria... qualche suggerimento?

fero86
10-02-2010, 20:23
dimentica tutti i post precedenti: la tua é una domanda ben precisa con una risposta altrettanto precisa, che si chiama VirtualQueryEx: http://msdn.microsoft.com/en-us/library/aa366907(VS.85).aspx

buon lavoro ;)

Genymus
10-02-2010, 21:25
ma questa funzione cosa fa? è compatibile con vb.net?
Devo richiamarla dalla Libreria "kernel32.dll" così:
Public Declare Function VirtualQueryEx Lib "kernel32" (ByVal hProcess As Integer, ByVal lpAddress As Integer, ByVal lpBuffer As Integer, ByVal dwLength As Bytes) As Integer
?

Il valore di ritorno cos'è? Un array di indirizzi utilizzati?
Posso scansionare la memoria con questa funzione?

Grazie

fero86
11-02-2010, 00:22
ma questa funzione cosa fa? permette di enumerare le "regioni" che partizionano lo spazio di indirizzamento del processo di cui specifichi l'handle.

i Remarks della documentazione definiscono il concetto di regione: si tratta di una sequenza di pagine contigue di memoria virtuale caratterizzate dalle seguenti caratteristiche:
1) hanno tutte lo stesso stato di allocazione (flags MEM_XXX, a te interessano tutte le regioni tranne quelle in stato MEM_RESERVE e MEM_FREE);
2) a meno che lo stato di allocazione non sia MEM_FREE, tale stato é stato provocato da un'unica chiamata VirtualAlloc(Ex) o simili (questo significa che due regioni contigue con gli stessi flags vengono enumerate indipendentemente se sono state allocate con due diverse chiamate VirtualAlloc(Ex) o simili);
3) hanno tutte lo stesso tipo di accesso (lettura, scrittura, esecuzione, ecc.).



è compatibile con vb.net? boh, dovrebbe; non lo so perché non uso Visual Basic e non uso le API Win32 in .NET.



Il valore di ritorno cos'è? Un array di indirizzi utilizzati? quoto la documentazione: "The return value is the actual number of bytes returned in the information buffer."



Posso scansionare la memoria con questa funzione?

enumerando le regioni che partizionano lo spazio di indirizzamento virtuale del processo puoi costruire l'intera "mappa"* di tale spazio di indirizzamento, che é quello che vuoi fare; le regioni marcate con MEM_RESERVE o MEM_FREE non ti interessano perché sono le pagine non allocate, quindi non é memoria che il programma sta usando, mentre tu vuoi sapere quella che sta usando.

*tale "mappa" ti permette di sapere quali indirizzi sono allocati, quali no, quali sono solo riservati, quali sono usati per memorizzare moduli eseguibili (EXE o DLL), quali sono in realtá memory-mapped files, quali sono leggibili/scrivibili/eseguibili, quali sono in protezione copy-on-write e persino su quali é stato impostato un page guard; direi piu o meno tutto.

Genymus
11-02-2010, 13:24
Bestia... se funziona mi hai salvato la vita:)