Ultima modifica:
In seguito alla sparizione misteriosa di alcuni post, tra cui quella in rilievo che conteneva il modulo per leggere e scrivere la memoria, ri-inserisco qui il modulo in questione:
(voglio sottolineare che non ho creato io il modulo (anche se l'ho modificato successivamente), ed è lo stesso che era stato prima postato da un altro utente. Io ho solo provveduto a ripostarlo in seguito alla sua misteriosa scomparsa. Non voglio comunque ne +1 ne "Mi piace" per questo.)
EDIT:
Ho preferito migliorare il modulo rendendolo più completo. Ho reso opzionali alcuni parametri e migliorati altri dettagli.
Ho aggiunto anche la spiegazione di ogni funzione e il link alle pagine MSDN.
Ho inoltre documentato il codice affinché i suggerimenti vengano visualizzati con IntelliSense di Visual Studio durante l'utilizzo dei membri del modulo.
MODULO
Come si usa?
[GUIDA] Processi e memoria in Visual Basic .NET (come creare hacks) by SpeedJack (con video-guida)
(voglio sottolineare che non ho creato io il modulo (anche se l'ho modificato successivamente), ed è lo stesso che era stato prima postato da un altro utente. Io ho solo provveduto a ripostarlo in seguito alla sua misteriosa scomparsa. Non voglio comunque ne +1 ne "Mi piace" per questo.)
EDIT:
Ho preferito migliorare il modulo rendendolo più completo. Ho reso opzionali alcuni parametri e migliorati altri dettagli.
Ho aggiunto anche la spiegazione di ogni funzione e il link alle pagine MSDN.
Ho inoltre documentato il codice affinché i suggerimenti vengano visualizzati con IntelliSense di Visual Studio durante l'utilizzo dei membri del modulo.
MODULO
Codice:
'READWRITEMEMORY MODULE by SpeedJack
'www.inforge.net
''' <summary>
''' Modulo per leggere e modificare la memoria.
''' Possiede anche altre funzioni riguardanti
''' le finestre e il cursore di Windows.
''' </summary>
''' <remarks>Imroved, Modeed, commented e documented by SpeedJack.
''' Powered by InForge.Net. <see>http://www.inforge.net</see></remarks>
Module ReadWriteMemory
''' <summary>
''' Processo da aprire. Modificare il nome nel modulo.
''' In certi casi l'estensione non è necessaria.
''' </summary>
''' <remarks>L'array conterrà tutti i processi con quel nome.
''' Solitamente myProcesses(0) contiene il processo desiderato.
''' "nome_processo" è il nome del processo da aprire.
''' <seealso>http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx</seealso></remarks>
Friend myProcesses As Process() = Process.GetProcessesByName("nome_processo")
''' <summary>
''' Enumeratore che contiene i vari diritti di accesso al processo.
''' <see>http://msdn.microsoft.com/en-us/library/ms684880(v=vs.85).aspx</see>
''' </summary>
Friend Enum ProcessAccess
''' <summary>
''' Necessario per terminare un processo usando TerminateProcess.
''' </summary>
''' <remarks>Il metodo TerminateProcess non è presente nel modulo.</remarks>
PROCESS_TERMINATE = &H1
''' <summary>
''' Necessario per creare un thread.
''' </summary>
PROCESS_CREATE_THREAD = &H2
''' <summary>
''' Necessario per eseguire un'operazione nello spazio
''' di memoria di un processo.
''' </summary>
''' <remarks>Si possono usare con esso le funzioni
''' VirtualProtectEx e WriteProcessMemory.</remarks>
PROCESS_VM_OPERATION = &H8
''' <summary>
''' Necessario per leggere la memoria di un processo usando ReadProcessMemory.
''' </summary>
PROCESS_VM_READ = &H10
''' <summary>
''' Necessario per scrivere la memoria di un processo usando WriteProcessMemory.
''' </summary>
PROCESS_VM_WRITE = &H20
''' <summary>
''' Necessario per duplicare un handle usando DuplicateHandle.
''' </summary>
''' <remarks>Il metodo DuplicateHandle non è presente nel modulo.</remarks>
PROCESS_DUP_HANDLE = &H40
''' <summary>
''' Necessario per creare un processo.
''' </summary>
PROCESS_CREATE_PROCESS = &H80
''' <summary>
''' Necessario per impostare i limiti della memoria usando SetProcessWorkingSetSize.
''' </summary>
''' <remarks>Il metodo SetProcessWorkingSetSize non è presente nel modulo.</remarks>
PROCESS_SET_QUOTA = &H100
''' <summary>
''' Necessario per impostare alcune informazioni sul processo,
''' come la sua classe di priorità (vedi SetPriorityClass).
''' </summary>
''' <remarks>Il meotodo SetPriorityClass non è presente nel modulo</remarks>
PROCESS_SET_INFORMATION = &H200
''' <summary>
''' Necessario per recuperare alcune informazioni su un processo,
''' come il suo token, codice di uscita, classe di priorità.
''' </summary>
PROCESS_QUERY_INFORMATION = &H400
''' <summary>
''' Necessario per sospendere o riabilitare un processo.
''' </summary>
PROCESS_SUSPEND_RESUME = &H800
''' <summary>
''' Necessario per recuperare alcune informazioni su un processo.
''' Un handle che ha il diritto di accesso PROCESS_QUERY_INFORMATION
''' possiede anche automaticamente PROCESS_QUERY_LIMITED_INFORMATION.
''' </summary>
''' <remarks>WinServer 2003, WinXP, Win2000 non supportano questo diritto di accesso.</remarks>
PROCESS_QUERY_LIMITED_INFORMATION = &H1000
''' <summary>
''' Accesso completo al processo.
''' </summary>
PROCESS_ALL_ACCESS = &H1F0FFF
''' <summary>
''' Accesso di lettura, scrittura, possibilità di eseguire
''' operazioni e ottenere informazioni.
''' </summary>
''' <remarks>Si tratta della somma tra PROCESS_VM_READ, PROCESS_VM_WRITE,
''' PROCESS_VM_OPERATION e PROCESS_QUERY_INFORMATION.</remarks>
PROCESS_READ_WRITE_QUERY = PROCESS_VM_READ + PROCESS_VM_WRITE + PROCESS_VM_OPERATION + PROCESS_QUERY_INFORMATION
End Enum
''' <summary>
''' Apre un processo locale esistente.
''' <see>http://msdn.microsoft.com/en-us/library/ms684320(v=vs.85).aspx</see>
''' </summary>
''' <param name="dwDesiredAccess">Il diritto di accesso al processo.</param>
''' <param name="bInheritHandle">Se questo valore è TRUE, i processo creati da questo processo erediteranno l'handle.
''' In caso contrario, i processo non erediteranno questo handle.</param>
''' <param name="dwProcessId">L'identificatore del processo locale da aprire.</param>
''' <returns>Se la funzione ha successo, il valore restituito sarà l'handle del processo aperto.
''' Se la funzione fallisce, il valore restituito sarà NULL.</returns>
Friend Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Integer, ByVal dwProcessId As Integer) As Integer
''' <summary>
''' Contiene l'handle del processo dopo che è stato aperto con OpenProcess.
''' </summary>
''' <remarks>L'handle deve essere inserito manualmente in questa variabile.
''' <seealso>http://msdn.microsoft.com/en-us/library/system.intptr(v=VS.100).aspx</seealso>
''' </remarks>
Friend processHandle As IntPtr
'In tutte le funzioni per leggere/scrivere la memoria, viene restituito 0 se l'operazione è fallita.
'In caso di lettura il valore viene messo nel Buffer.
'In caso di scrittura viene scritto il valore del Buffer.
'Funzione per scrivere la memoria. (DISATTIVATE: meglio usare quelle specifiche per tipo, sono più precise. Altrimenti si possono attivare queste due funzioni togliendo l'apice davanti).
'MSDN: http://msdn.microsoft.com/en-us/library/ms681674(v=vs.85).aspx
'Friend Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Integer, ByVal nSize As Integer, Optional ByRef lpNumberOfBytesWritten As Integer = Nothing) As Integer
'Funzione per leggere la memoria:
'MSDN: http://msdn.microsoft.com/en-us/library/ms680553(v=vs.85).aspx
'Friend Declare Function ReadProcessMemory Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Integer, ByVal nSize As Integer, Optional ByRef lpNumberOfBytesWritten As Integer = Nothing) As Integer
''' <summary>
''' Legge un Byte di memoria. Si basa sulla funzione ReadProcessMemory.
''' <see>http://msdn.microsoft.com/en-us/library/ms680553(v=vs.85).aspx</see>
''' </summary>
''' <param name="hProcess">Un handle al processo. L'handle deve avere almeno il diritto di accesso PROCESS_VM_READ.</param>
''' <param name="lpBaseAddress">L'address di base dell'area di memoria da leggere.</param>
''' <param name="lpBuffer">Un puntatore al buffer che riceverà il valore letto dall'address.</param>
''' <param name="nSize">Il numero di bytes che devono essere letti. Default: 1.</param>
''' <param name="lpNumberOfBytesWritten">Un pointer ad una variabile che riceverà il numero di bytes trasferiti nel buffer. Se il valore è NULL, il parametro viene ignorato. Default: Nothing.</param>
''' <returns>Se la funzione ha successo, il valore restituito sarà non-zero.</returns>
Friend Declare Function ReadByte Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Byte, Optional ByVal nSize As Integer = 1, Optional ByRef lpNumberOfBytesWritten As Integer = Nothing) As Integer
''' <summary>
''' Legge 2 Bytes di memoria. Si basa sulla funzione ReadProcessMemory.
''' <see>http://msdn.microsoft.com/en-us/library/ms680553(v=vs.85).aspx</see>
''' </summary>
''' <param name="hProcess">Un handle al processo. L'handle deve avere almeno il diritto di accesso PROCESS_VM_READ.</param>
''' <param name="lpBaseAddress">L'address di base dell'area di memoria da leggere.</param>
''' <param name="lpBuffer">Un puntatore al buffer che riceverà il valore letto dall'address.</param>
''' <param name="nSize">Il numero di bytes che devono essere letti. Default: 2.</param>
''' <param name="lpNumberOfBytesWritten">Un pointer ad una variabile che riceverà il numero di bytes trasferiti nel buffer. Se il valore è NULL, il parametro viene ignorato. Default: Nothing.</param>
''' <returns>Se la funzione ha successo, il valore restituito sarà non-zero.</returns>
Friend Declare Function ReadShort Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Short, Optional ByVal nSize As Integer = 2, Optional ByRef lpNumberOfBytesWritten As Integer = Nothing) As Integer
''' <summary>
''' Legge 4 Bytes di memoria. Si basa sulla funzione ReadProcessMemory.
''' <see>http://msdn.microsoft.com/en-us/library/ms680553(v=vs.85).aspx</see>
''' </summary>
''' <param name="hProcess">Un handle al processo. L'handle deve avere almeno il diritto di accesso PROCESS_VM_READ.</param>
''' <param name="lpBaseAddress">L'address di base dell'area di memoria da leggere.</param>
''' <param name="lpBuffer">Un puntatore al buffer che riceverà il valore letto dall'address.</param>
''' <param name="nSize">Il numero di bytes che devono essere letti. Default: 4.</param>
''' <param name="lpNumberOfBytesWritten">Un pointer ad una variabile che riceverà il numero di bytes trasferiti nel buffer. Se il valore è NULL, il parametro viene ignorato. Default: Nothing.</param>
''' <returns>Se la funzione ha successo, il valore restituito sarà non-zero.</returns>
Friend Declare Function ReadInteger Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Integer, Optional ByVal nSize As Integer = 4, Optional ByRef lpNumberOfBytesWritten As Integer = Nothing) As Integer
''' <summary>
''' Legge 8 Bytes di memoria. Si basa sulla funzione ReadProcessMemory.
''' <see>http://msdn.microsoft.com/en-us/library/ms680553(v=vs.85).aspx</see>
''' </summary>
''' <param name="hProcess">Un handle al processo. L'handle deve avere almeno il diritto di accesso PROCESS_VM_READ.</param>
''' <param name="lpBaseAddress">L'address di base dell'area di memoria da leggere.</param>
''' <param name="lpBuffer">Un puntatore al buffer che riceverà il valore letto dall'address.</param>
''' <param name="nSize">Il numero di bytes che devono essere letti. Default: 8.</param>
''' <param name="lpNumberOfBytesWritten">Un pointer ad una variabile che riceverà il numero di bytes trasferiti nel buffer. Se il valore è NULL, il parametro viene ignorato. Default: Nothing.</param>
''' <returns>Se la funzione ha successo, il valore restituito sarà non-zero.</returns>
Friend Declare Function ReadLong Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Long, Optional ByVal nSize As Integer = 8, Optional ByRef lpNumberOfBytesWritten As Integer = Nothing) As Integer
''' <summary>
''' Legge 4 Bytes di memoria. Si basa sulla funzione ReadProcessMemory.
''' <see>http://msdn.microsoft.com/en-us/library/ms680553(v=vs.85).aspx</see>
''' </summary>
''' <param name="hProcess">Un handle al processo. L'handle deve avere almeno il diritto di accesso PROCESS_VM_READ.</param>
''' <param name="lpBaseAddress">L'address di base dell'area di memoria da leggere.</param>
''' <param name="lpBuffer">Un puntatore al buffer che riceverà il valore letto dall'address.</param>
''' <param name="nSize">Il numero di bytes che devono essere letti. Default: 4.</param>
''' <param name="lpNumberOfBytesWritten">Un pointer ad una variabile che riceverà il numero di bytes trasferiti nel buffer. Se il valore è NULL, il parametro viene ignorato. Default: Nothing.</param>
''' <returns>Se la funzione ha successo, il valore restituito sarà non-zero.</returns>
Friend Declare Function ReadSingle Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Single, Optional ByVal nSize As Integer = 4, Optional ByRef lpNumberOfBytesWritten As Integer = Nothing) As Integer
''' <summary>
''' Legge 8 Bytes di memoria. Si basa sulla funzione ReadProcessMemory.
''' <see>http://msdn.microsoft.com/en-us/library/ms680553(v=vs.85).aspx</see>
''' </summary>
''' <param name="hProcess">Un handle al processo. L'handle deve avere almeno il diritto di accesso PROCESS_VM_READ.</param>
''' <param name="lpBaseAddress">L'address di base dell'area di memoria da leggere.</param>
''' <param name="lpBuffer">Un puntatore al buffer che riceverà il valore letto dall'address.</param>
''' <param name="nSize">Il numero di bytes che devono essere letti. Default: 8.</param>
''' <param name="lpNumberOfBytesWritten">Un pointer ad una variabile che riceverà il numero di bytes trasferiti nel buffer. Se il valore è NULL, il parametro viene ignorato. Default: Nothing.</param>
''' <returns>Se la funzione ha successo, il valore restituito sarà non-zero.</returns>
Friend Declare Function ReadDouble Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Double, Optional ByVal nSize As Integer = 8, Optional ByRef lpNumberOfBytesWritten As Integer = Nothing) As Integer
''' <summary>
''' Legge una stringa in memoria. Si basa sulla funzione ReadProcessMemory.
''' <see>http://msdn.microsoft.com/en-us/library/ms680553(v=vs.85).aspx</see>
''' </summary>
''' <param name="hProcess">Un handle al processo. L'handle deve avere almeno il diritto di accesso PROCESS_VM_READ.</param>
''' <param name="lpBaseAddress">L'address di base dell'area di memoria da leggere.</param>
''' <param name="lpBuffer">Un puntatore al buffer che riceverà il valore letto dall'address.</param>
''' <param name="nSize">Il numero di bytes che devono essere letti.</param>
''' <param name="lpNumberOfBytesWritten">Un pointer ad una variabile che riceverà il numero di bytes trasferiti nel buffer. Se il valore è NULL, il parametro viene ignorato. Default: Nothing.</param>
''' <returns>Se la funzione ha successo, il valore restituito sarà non-zero.</returns>
Friend Declare Function ReadString Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As String, ByVal nSize As Integer, Optional ByRef lpNumberOfBytesWritten As Integer = Nothing) As Integer
''' <summary>
''' Scrive un byte in un'area di memoria di un processo specificato. Si basa sulla funzione WriteProcessMemory.
''' <see>http://msdn.microsoft.com/en-us/library/ms680553(v=vs.85).aspx</see>
''' </summary>
''' <param name="hProcess">Un handle al processo. L'handle deve avere almeno i diritti di accesso PROCESS_VM_WRITE e PROCESS_VM_OPERATION.</param>
''' <param name="lpBaseAddress">L'address di base dell'area di memoria da scrivere.</param>
''' <param name="lpBuffer">Un puntatore al buffer che contiene il valore che deve essere scritto nell'address.</param>
''' <param name="nSize">Il numero di bytes che devono essere scritti. Default: 1.</param>
''' <param name="lpNumberOfBytesWritten">Un pointer ad una variabile che riceverà il numero di bytes scritti nell'area di memoria. Se il valore è NULL, il parametro viene ignorato. Default: Nothing.</param>
''' <returns>Se la funzione ha successo, il valore restituito sarà non-zero.</returns>
Friend Declare Function WriteByte Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Byte, Optional ByVal nSize As Integer = 1, Optional ByRef lpNumberOfBytesWritten As Integer = Nothing) As Integer
''' <summary>
''' Scrive 2 bytes in un'area di memoria di un processo specificato. Si basa sulla funzione WriteProcessMemory.
''' <see>http://msdn.microsoft.com/en-us/library/ms680553(v=vs.85).aspx</see>
''' </summary>
''' <param name="hProcess">Un handle al processo. L'handle deve avere almeno i diritti di accesso PROCESS_VM_WRITE e PROCESS_VM_OPERATION.</param>
''' <param name="lpBaseAddress">L'address di base dell'area di memoria da scrivere.</param>
''' <param name="lpBuffer">Un puntatore al buffer che contiene il valore che deve essere scritto nell'address.</param>
''' <param name="nSize">Il numero di bytes che devono essere scritti. Default: 2.</param>
''' <param name="lpNumberOfBytesWritten">Un pointer ad una variabile che riceverà il numero di bytes scritti nell'area di memoria. Se il valore è NULL, il parametro viene ignorato. Default: Nothing.</param>
''' <returns>Se la funzione ha successo, il valore restituito sarà non-zero.</returns>
Friend Declare Function WriteShort Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Short, Optional ByVal nSize As Integer = 2, Optional ByRef lpNumberOfBytesWritten As Integer = Nothing) As Integer
''' <summary>
''' Scrive 4 bytes in un'area di memoria di un processo specificato. Si basa sulla funzione WriteProcessMemory.
''' <see>http://msdn.microsoft.com/en-us/library/ms680553(v=vs.85).aspx</see>
''' </summary>
''' <param name="hProcess">Un handle al processo. L'handle deve avere almeno i diritti di accesso PROCESS_VM_WRITE e PROCESS_VM_OPERATION.</param>
''' <param name="lpBaseAddress">L'address di base dell'area di memoria da scrivere.</param>
''' <param name="lpBuffer">Un puntatore al buffer che contiene il valore che deve essere scritto nell'address.</param>
''' <param name="nSize">Il numero di bytes che devono essere scritti. Default: 4.</param>
''' <param name="lpNumberOfBytesWritten">Un pointer ad una variabile che riceverà il numero di bytes scritti nell'area di memoria. Se il valore è NULL, il parametro viene ignorato. Default: Nothing.</param>
''' <returns>Se la funzione ha successo, il valore restituito sarà non-zero.</returns>
Friend Declare Function WriteInteger Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Integer, Optional ByVal nSize As Integer = 4, Optional ByRef lpNumberOfBytesWritten As Integer = Nothing) As Integer
''' <summary>
''' Scrive 8 bytes in un'area di memoria di un processo specificato. Si basa sulla funzione WriteProcessMemory.
''' <see>http://msdn.microsoft.com/en-us/library/ms680553(v=vs.85).aspx</see>
''' </summary>
''' <param name="hProcess">Un handle al processo. L'handle deve avere almeno i diritti di accesso PROCESS_VM_WRITE e PROCESS_VM_OPERATION.</param>
''' <param name="lpBaseAddress">L'address di base dell'area di memoria da scrivere.</param>
''' <param name="lpBuffer">Un puntatore al buffer che contiene il valore che deve essere scritto nell'address.</param>
''' <param name="nSize">Il numero di bytes che devono essere scritti. Default: 8.</param>
''' <param name="lpNumberOfBytesWritten">Un pointer ad una variabile che riceverà il numero di bytes scritti nell'area di memoria. Se il valore è NULL, il parametro viene ignorato. Default: Nothing.</param>
''' <returns>Se la funzione ha successo, il valore restituito sarà non-zero.</returns>
Friend Declare Function WriteLong Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Long, Optional ByVal nSize As Integer = 8, Optional ByRef lpNumberOfBytesWritten As Integer = Nothing) As Integer
''' <summary>
''' Scrive 4 bytes in un'area di memoria di un processo specificato. Si basa sulla funzione WriteProcessMemory.
''' <see>http://msdn.microsoft.com/en-us/library/ms680553(v=vs.85).aspx</see>
''' </summary>
''' <param name="hProcess">Un handle al processo. L'handle deve avere almeno i diritti di accesso PROCESS_VM_WRITE e PROCESS_VM_OPERATION.</param>
''' <param name="lpBaseAddress">L'address di base dell'area di memoria da scrivere.</param>
''' <param name="lpBuffer">Un puntatore al buffer che contiene il valore che deve essere scritto nell'address.</param>
''' <param name="nSize">Il numero di bytes che devono essere scritti. Default: 4.</param>
''' <param name="lpNumberOfBytesWritten">Un pointer ad una variabile che riceverà il numero di bytes scritti nell'area di memoria. Se il valore è NULL, il parametro viene ignorato. Default: Nothing.</param>
''' <returns>Se la funzione ha successo, il valore restituito sarà non-zero.</returns>
Friend Declare Function WriteSingle Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Single, Optional ByVal nSize As Integer = 4, Optional ByRef lpNumberOfBytesWritten As Integer = Nothing) As Integer
''' <summary>
''' Scrive 8 bytes in un'area di memoria di un processo specificato. Si basa sulla funzione WriteProcessMemory.
''' <see>http://msdn.microsoft.com/en-us/library/ms680553(v=vs.85).aspx</see>
''' </summary>
''' <param name="hProcess">Un handle al processo. L'handle deve avere almeno i diritti di accesso PROCESS_VM_WRITE e PROCESS_VM_OPERATION.</param>
''' <param name="lpBaseAddress">L'address di base dell'area di memoria da scrivere.</param>
''' <param name="lpBuffer">Un puntatore al buffer che contiene il valore che deve essere scritto nell'address.</param>
''' <param name="nSize">Il numero di bytes che devono essere scritti. Default: 8.</param>
''' <param name="lpNumberOfBytesWritten">Un pointer ad una variabile che riceverà il numero di bytes scritti nell'area di memoria. Se il valore è NULL, il parametro viene ignorato. Default: Nothing.</param>
''' <returns>Se la funzione ha successo, il valore restituito sarà non-zero.</returns>
Friend Declare Function WriteDouble Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Double, Optional ByVal nSize As Integer = 8, Optional ByRef lpNumberOfBytesWritten As Integer = Nothing) As Integer
''' <summary>
''' Scrive una stringa in un'area di memoria di un processo specificato. Si basa sulla funzione WriteProcessMemory.
''' <see>http://msdn.microsoft.com/en-us/library/ms680553(v=vs.85).aspx</see>
''' </summary>
''' <param name="hProcess">Un handle al processo. L'handle deve avere almeno i diritti di accesso PROCESS_VM_WRITE e PROCESS_VM_OPERATION.</param>
''' <param name="lpBaseAddress">L'address di base dell'area di memoria da scrivere.</param>
''' <param name="lpBuffer">Un puntatore al buffer che contiene il valore che deve essere scritto nell'address.</param>
''' <param name="nSize">Il numero di bytes che devono essere scritti.</param>
''' <param name="lpNumberOfBytesWritten">Un pointer ad una variabile che riceverà il numero di bytes scritti nell'area di memoria. Se il valore è NULL, il parametro viene ignorato. Default: Nothing.</param>
''' <returns>Se la funzione ha successo, il valore restituito sarà non-zero.</returns>
Friend Declare Function WriteString Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As String, ByVal nSize As Integer, Optional ByRef lpNumberOfBytesWritten As Integer = Nothing) As Integer
End Module
[GUIDA] Processi e memoria in Visual Basic .NET (come creare hacks) by SpeedJack (con video-guida)