Reading memory of other process

Contenu du snippet

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

A voir également

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.