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
mmm ya veo pero jamas haces la conversion del texto aqui te dejo mi code que uso para leer en memoria
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
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.
Dim r As Integer
ListBox1.Items.Clear()
For r = Val(txtmin.Text) To Val(txtmax.Text)
ReadMemoryP(r)
Next
¿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.
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.
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.
Le doy un Up por que sigo sin conseguir resultados.