La lecture de la mémoire de l'autre procès
/ dans l'exécution / très simple
Peut être utilisé pour la réception complet дампа du procès ou / si la structure du fichier / de l'analyse ultérieure de ses métadonnées permet.
Dans l'exemple donné :
- chacun инициализированный le bloc de la mémoire correspond aux sections physiques du fichier
- неинициализированные les blocs - libre межсекционное l'espace.
/ j'utilise jusqu'ici pratiquement de rien sans changer /
Considérablement : seulement sur la lecture
Considérablement : le Traitement des privilèges manque.
Source / Exemple :
<DllImport("kernel32", CallingConvention:=CallingConvention.StdCall _
, CharSet:=CharSet.Auto, SetLastError:=True)> _
Public Shared Function ReadProcessMemory( _
<[In]()> ByVal Handle As [IntPtr] _
, ByVal H1 As [IntPtr] _
, ByVal H2 As [IntPtr] _
, ByVal H3 As Integer _
, <Out()> ByRef H4 As Integer _
) As Boolean
End Function
<DllImport("kernel32")> _
Public Shared Function VirtualQueryEx( _
<[In]()> ByVal Handle As [IntPtr] _
, ByVal H1 As [IntPtr] _
, ByVal H2 As [IntPtr] _
, ByVal H3 As Integer _
) As Integer
End Function
<StructLayout(LayoutKind.Sequential)> _
Public Structure MEMORY_BASIC_INFORMATION
Public BaseAddress _
, [t1], [t2] _
, RegionSize _
, State _
, [t3] _
, Type As Integer
End Structure
Function GetProcessData(ByVal PID As Integer)
'
Dim p As Process _
= Process.GetProcessById(PID)
'
Dim mbi As MEMORY_BASIC_INFORMATION
Dim ptr As IntPtr _
= Marshal.AllocHGlobal(Marshal.SizeOf(mbi)) _
, lpAddress As Integer _
= p.MainModule.BaseAddress _
, Data(0) As Byte
'
Do While lpAddress < p.MainModule.BaseAddress.ToInt32 _
+ p.MainModule.ModuleMemorySize
'
If VirtualQueryEx(p.Handle, lpAddress, ptr, Marshal.SizeOf(mbi)) > 0 Then
'
mbi = Marshal.PtrToStructure(ptr, _
GetType(MEMORY_BASIC_INFORMATION))
'
If (mbi.State = &H1000) And (mbi.Type = &H1000000) _
And (mbi.RegionSize > 0) Then
'
Dim buff As IntPtr _
= Marshal.AllocHGlobal(mbi.RegionSize)
'
If Not (ReadProcessMemory(p.Handle, mbi.BaseAddress _
, buff, mbi.RegionSize, New Integer) = 0) Then
'
Dim Temp(mbi.RegionSize) As Byte
'
Marshal.Copy(buff, Temp, 0, mbi.RegionSize)
'
Dim s = Data.Length - 1
ReDim Preserve Data(Data.Length _
+ Temp.Length _
- 2)
'
Dim Memo1 As New MemoryStream(Data) _
, Memo2 As New MemoryStream(Temp)
Memo1.Seek(s, SeekOrigin.Begin)
Memo2.WriteTo(Memo1)
Memo2.Close()
Memo1.Close()
'
End If
'
Marshal.FreeHGlobal(buff)
'
End If
'
End If
'
lpAddress = mbi.BaseAddress _
+ mbi.RegionSize
'
Loop
'
Marshal.FreeHGlobal(ptr)
'
Return Data
''
End Function
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.