LeerPointers/Punteros con VB.NET

Iniciado por igustin10, 16 Diciembre 2015, 21:27 PM

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

igustin10

Que tal amigos como va?

Estoy desarrollando una aplicacion que varia segun otra. Lo que quiero preguntarles hoy es  como puedo hacer para leer ciertos pointer (punteros) de una aplicacion en VB.NET.

Quiero mostrar el value (valor) de un puntero (que lleva a un address) en una de las labels de mi proyecto.

Muchas Gracias a todos por la ayuda!!  ;-) ::) :D

kub0x

Buenas.

Entiendo de lo que hablas, y no tendrías ningún problema con la clase Marshal para extraer el valor. Estaría bien que nos dejaras el fragmento de código para acomodarlo y dejarlo como pides.

Saludos.
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


igustin10

kub0x antes que nada gracias por tomar un poco tiempo y leer el post y responder.

Ahora me voy  a poner a ver como quedaria con la clase Marshal (no lo conocia, me estoy fijado aca de que se trata: https://msdn.microsoft.com/es-es/library/system.runtime.interopservices.marshal(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1).

Lo que habia intendado yo pero veo que esta mal es:
Dim pointervalue As Integer
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        pointervalue = WriteDMAInteger("Proceso", &HAddress, {&H1, &H2, &H3}, Value, 5)
        Label1.Text = pointervalue




kub0x

#3
CitarTe explico como es lo que quiero hacer:
Tengo este Pointer: "Proceso"+001913B8 - Offset0: 104 - Offset1: bdc - Offset2: 60
Y quiero mostrarlo en una label del proyecto.
Como podria lograrlo? Estuve investigando lo de clase Marshal pero no lo entendi muy bien.

Quieres representar los datos de un puntero a una dirección que reside en otro proceso. Cuando veas un puntero de la forma "Proceso" + Dirección (0x...) lo que tienes realmente es la dirección base del proceso (base address) + la dirección. Por ejemplo: "Firefox" + 0x456A será la base address de firefox digamos 0x400000 quedaría 0x400000 + 0x456A.

En .NET es sencillo coger la base address de un proceso cualquiera (mientras tengas los mismos permisos que el proceso al que se abrirá el HANDLE):

Código (csharp) [Seleccionar]

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool ReadProcessMemory(
IntPtr hProcess,
IntPtr lpBaseAddress,
[Out] byte[] lpBuffer,
int dwSize,
out IntPtr lpNumberOfBytesRead);

public static void Main (string[] args)
{
Process proc = Process.GetProcessesByName ("Firefox")[0];
IntPtr ptr = 0xDEADBEEF + proc.MainModule.BaseAddress;
IntPtr prochandle = proc.Handle;
byte[] bytes = new byte[40];
                       IntPtr readbytes = new IntPtr();
ReadProcessMemory (prochandle, ptr, bytes, bytes.Length, out readbytes);
                       string data = Encoding.ASCII.GetString(bytes);
               }


En data tendrías el valor del puntero leído. Cambia 0xDEADBEEF y Firefox por la dirección del puntero y por el nombre del proceso. Cambia el 40 de byte[] bytes=new byte[40] por la longitud que quieres leer del puntero. Si todo va bien debería salirte.

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


igustin10

Perfecto! Entendi el codigo, muchisimas gracias.

Mas claro que el agua jaja. Ahora voy a INTENTAR pasarlo a Visual Basic porque la verdad se muy poco de C.

MUCHAS GRACIAS kub0x!
Salu2, Igustin

igustin10

Usando un codigo que es ReadWriteMemory.vb (pongo abajo la parte que uso):

Public Function ReadDMAInteger(ByVal Process As String, ByVal Address As Integer, ByVal Offsets As Integer(), ByVal Level As Integer, Optional ByVal nsize As Integer = 4) As Integer
        Try
            Dim lvl As Integer = Address
            For i As Integer = 1 To Level
                lvl = ReadInteger(Process, lvl, nsize) + Offsets(i - 1)
            Next
            Dim vBuffer As Integer
            vBuffer = ReadInteger(Process, lvl, nsize)
            Return vBuffer
        Catch ex As Exception

        End Try
    End Function[font=Verdana][/font]



Lo que he tratado de hacer es:

Dim pointer As Integer = ReadDMAInteger("Proceso", &HBaseAddress+Address, Offsets, Level:=1)

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Label2.Text = pointer
    End Sub


Ya reemplaze los datos pero me dice que es 0.

Alguna ultima ayuda? Ya casi lo saco  :-\ :-\

kub0x

En este caso utilizas la función casera ReadInteger, estaría bien que la postearas para ver como manejas la lectura de memoria del proceso destino. Sin eso me temo que no puedo ayudarte. El code que te dejé también es funcional, podrías partir del mismo eso sí, tendrías que pasarlo a VB.NET.

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate