Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: nemesysrgs en 18 Noviembre 2010, 07:10 am



Título: Leer Memoria de un Proceso
Publicado por: nemesysrgs en 18 Noviembre 2010, 07:10 am
Tengo este codigo

Código:
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


Título: Re: Leer Memoria de un Proceso
Publicado por: .mokk. en 18 Noviembre 2010, 18:16 pm
mmm ya veo pero jamas haces la conversion del texto aqui te dejo mi code que uso para leer en memoria
Código
  1. Imports System
  2. Imports System.Text
  3. Imports System.Runtime.InteropServices
  4. Imports System.ComponentModel
  5. Imports System.Windows.Forms.Application
  6.  
  7. Module ReadMemory
  8.    <DllImport("kernel32.dll", SetLastError:=True)> Private Function ReadProcessMemory _
  9. (ByVal hProcess As IntPtr, ByVal lpBaseAddress As IntPtr, ByRef lpBuffer As Byte, _
  10. ByVal iSize As Integer, ByRef lpNumberOfBytesRead As Integer) As Boolean
  11.    End Function
  12.  
  13.  
  14.    Public Sub ReadMemoryP(ByVal address As Integer)
  15.        Try
  16.  
  17. Dim process0 as string = "calc" 'process0 is the name of pocess
  18.  
  19.            Dim prox As Process() = Process.GetProcessesByName("process0")
  20.            MsgBox(GetTextinMemory(prox(0).Handle, address, 16) & GetTextinMemory(prox(0).Handle, address + 32, 16))
  21.        Catch ex As Exception
  22.            MsgBox(ex.Message)
  23.        End Try
  24.    End Sub
  25.  
  26.  
  27.    Private Function GetTextinMemory(ByVal ProcessHandle As IntPtr, ByVal MemoryAddress As IntPtr, ByVal CharsToRead As Integer, Optional ByVal IsUnicode As Boolean = True) As String
  28.        Dim ReturnValue As String = vbNullString
  29.        Dim StringBuffer() As Byte
  30.        If IsUnicode Then
  31.            ReDim StringBuffer(CharsToRead * 2 - 1)
  32.        Else
  33.            ReDim StringBuffer(CharsToRead - 1)
  34.        End If
  35.        Try
  36.            'Dim p As Process() = Process.GetProcessesByName(process0)
  37.            If ReadProcessMemory(ProcessHandle, MemoryAddress, StringBuffer(0), StringBuffer.Length, Nothing) Then
  38.                If IsUnicode Then
  39.                    ReturnValue = System.Text.Encoding.ASCII.GetString(StringBuffer)
  40.                Else
  41.                    ReturnValue = System.Text.Encoding.Default.GetString(StringBuffer)
  42.                End If
  43.            End If
  44.  
  45.        Catch ex As Exception
  46.            MsgBox(ex.Message)
  47.        End Try
  48.        Return ReturnValue
  49.    End Function
  50. End Module
  51.  


Título: Re: Leer Memoria de un Proceso
Publicado por: nemesysrgs en 19 Noviembre 2010, 18:13 pm
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"

(http://img690.imageshack.us/img690/4092/memoriam.jpg)


(http://img705.imageshack.us/img705/4353/pointerjpg.jpg)

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.

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



Título: Re: Leer Memoria de un Proceso
Publicado por: nemesysrgs en 27 Noviembre 2010, 18:13 pm
¿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.


Título: Re: Leer Memoria de un Proceso
Publicado por: .mokk. en 28 Noviembre 2010, 04:02 am
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.


Título: Re: Leer Memoria de un Proceso
Publicado por: nemesysrgs en 28 Noviembre 2010, 17:46 pm
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.


Título: Re: Leer Memoria de un Proceso
Publicado por: nemesysrgs en 30 Noviembre 2010, 05:49 am
Le doy un Up por que sigo sin conseguir resultados.