Leer Memoria de un Proceso

Iniciado por nemesysrgs, 18 Noviembre 2010, 07:10 AM

0 Miembros y 1 Visitante están viendo este tema.

nemesysrgs

Tengo este codigo


Public Class Form1
    'API ReadProcessMemory
    Private Shared Function ReadProcessMemory( _
        ByVal hProcess As IntPtr, _
        ByVal lpBaseAddress As IntPtr, _
        ByVal lpBuffer() As Byte, _
        ByVal dwSize As Integer, _
        ByRef lpNumberOfBytesRead As Integer) As Boolean
    End Function

    Private Function FindAddress(ByVal pHandle As IntPtr, ByVal BaseAddress As IntPtr, ByVal StaticPointer As IntPtr, ByVal Offsets() As IntPtr) As IntPtr
        ' Crearemos un buffer de 4 bytes para sistema de32-bit o 8 bytes sobre un sistema de 64-bit .
        Dim tmp(IntPtr.Size - 1) As Byte
        Dim Address As IntPtr = BaseAddress
        ' Checaremos para 32-bit vs 64-bit.
        If IntPtr.Size = 4 Then
            Address = New IntPtr(Address.ToInt32 + StaticPointer.ToInt32)
        Else
            Address = New IntPtr(Address.ToInt64 + StaticPointer.ToInt64)
        End If
        ' Loop de cada Offset hasta encontrar el Address
        For i As Integer = 0 To Offsets.Length - 1
            ReadProcessMemory(pHandle, Address, tmp, IntPtr.Size, 0)
            If IntPtr.Size = 4 Then
                Address = BitConverter.ToInt32(tmp, 0) + Offsets(i).ToInt32()
            Else
                Address = BitConverter.ToInt64(tmp, 0) + Offsets(i).ToInt64()
            End If
        Next
        Return Address
    End Function

    Public Function Obtener_Address()
        Dim p As Process
        For Each p In Process.GetProcesses()
            If Not p Is Nothing Then
                If (LCase(p.ProcessName) = "l2") Then
                    Dim pID As IntPtr = p.Handle
                    Dim base As IntPtr = p.MainModule.BaseAddress
                    ' Colocamos Nuestro Pointer Estatico
                    Dim sptr As IntPtr = &HB5C3320
                    ' Y aqui nuestro Offset segun los necesarios
                    Dim offsets() As IntPtr = {&HF4, &H14, &H308, &HC4, &H0}
                    Dim addr As IntPtr = FindAddress(pID, base, sptr, offsets)
                    Dim f As String
                    f = addr.ToString
                    Return f
                    Exit Function
                End If
            End If
        Next
        Return ("Error")
        ' Obtendremos el Handle y el BaseAddress de nuestro proceso
    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MsgBox(Obtener_Address())
    End Sub
End Class


Lo que quiero hacer es obtener el nombre del personaje para el juego Lineage 2 (Interlude) pero siempre me devielve 0, alguno tiene una idea de que es lo que esta pasando.- Muchas gracias

.mokk.

mmm ya veo pero jamas haces la conversion del texto aqui te dejo mi code que uso para leer en memoria
Código (vb.net) [Seleccionar]
Imports System
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.ComponentModel
Imports System.Windows.Forms.Application

Module ReadMemory
    <DllImport("kernel32.dll", SetLastError:=True)> Private Function ReadProcessMemory _
(ByVal hProcess As IntPtr, ByVal lpBaseAddress As IntPtr, ByRef lpBuffer As Byte, _
ByVal iSize As Integer, ByRef lpNumberOfBytesRead As Integer) As Boolean
    End Function


    Public Sub ReadMemoryP(ByVal address As Integer)
        Try
     
Dim process0 as string = "calc" 'process0 is the name of pocess

            Dim prox As Process() = Process.GetProcessesByName("process0")
            MsgBox(GetTextinMemory(prox(0).Handle, address, 16) & GetTextinMemory(prox(0).Handle, address + 32, 16))
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub


    Private Function GetTextinMemory(ByVal ProcessHandle As IntPtr, ByVal MemoryAddress As IntPtr, ByVal CharsToRead As Integer, Optional ByVal IsUnicode As Boolean = True) As String
        Dim ReturnValue As String = vbNullString
        Dim StringBuffer() As Byte
        If IsUnicode Then
            ReDim StringBuffer(CharsToRead * 2 - 1)
        Else
            ReDim StringBuffer(CharsToRead - 1)
        End If
        Try
            'Dim p As Process() = Process.GetProcessesByName(process0)
            If ReadProcessMemory(ProcessHandle, MemoryAddress, StringBuffer(0), StringBuffer.Length, Nothing) Then
                If IsUnicode Then
                    ReturnValue = System.Text.Encoding.ASCII.GetString(StringBuffer)
                Else
                    ReturnValue = System.Text.Encoding.Default.GetString(StringBuffer)
                End If
            End If

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        Return ReturnValue
    End Function
End Module

nemesysrgs

#2
Estoy probando este codigo pero me devuelve una "j", quizas este usando mal la direccion de memoria.

Estuve usando Cheat Engine para identificar la direccion de memoria donde se guarda el nombre del personaje, en este caso "santirompebolas"






use varias direcciones, incluso use este codigo para hacer un escaneo de la memoria, con saltos de 16 y 24 y de 1 a 1 pero no logro localizar el nombre.

       Dim r As Integer
       ListBox1.Items.Clear()
       For r = Val(txtmin.Text) To Val(txtmax.Text)
           ReadMemoryP(r)
       Next



nemesysrgs

#3
¿Alguno tiene una idea?
Puede alguno orientarme para obtener el puntero a la memoria y como manejarlo (tambien los offsets y demas)

Quizas en otro lenguaje funcione mejor que en vb, si alguno tiene un ejemplo estaria bueno para probar.

.mokk.

Nose si contigo sea igual, pero conmigo siempre al ejecutar el juego u programa que deceaba leer camabiaba el addres y el puntero que usaba ya no era el correcto, por lo que al principio para ver que funcionara bien lo que hacia dejaba el programa abierto, luego veia bn el addres y eso para leer y luego ya veia y si leia bn ya  luego reiniciaba el programa y si ya no leia eso ya era problema del programa que cambiaba el addres.

nemesysrgs

Claro, es igual, fijate en una de las imagenes aparece "Pointercount=78" para llegar a ese numero tuve que ejecutar la aplicacion alrededor de 200 veces bajado de 3 a 20 punteros por cada ejecucion.

Mi problema es que: o no sé buscar el puntero, o estoy utilizando mal el codigo que me dio .mokk., o ambas 2, en este caso quisiera saber si estoy buscandolo mal el puntero y si lo estoy haciendo mal, entonces como lo tendria que hacer.

nemesysrgs

Le doy un Up por que sigo sin conseguir resultados.