Leer imagen y ejecutar acción si cambia.

Iniciado por Zitox, 8 Marzo 2015, 20:36 PM

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

Zitox

Buenas me acabo de registrar en este foro por que lo veo bueno y activo, soy Zitox

Vengo con una duda, eh visto en varios post de varios foros, sobre una funcion que se llama "ReadProcessMemory" Que seria para leer la memoria de un X programa.
Lo que quiero hacer creo que es eso.

Por ejemplo aca dejo una imagen:
http://fotos.subefotos.com/1409def66bcaf6efd48b1d2bdce10e3fo.jpg

Queria que detectara si el primer numero "400" esta sobre bajo del "400" y si pasa eso lo que haria seria ejecutar "x" accion.
Busque en todos lados sinceramente, pero no entrontre eso.
Encontre GetPixel de todo que tiene que ver con el tema pero no el mismo.

Espero que me puedan ayudar.

Saludos!

Miseryk

Cita de: Zitox en  8 Marzo 2015, 20:36 PM
Buenas me acabo de registrar en este foro por que lo veo bueno y activo, soy Zitox

Vengo con una duda, eh visto en varios post de varios foros, sobre una funcion que se llama "ReadProcessMemory" Que seria para leer la memoria de un X programa.
Lo que quiero hacer creo que es eso.

Por ejemplo aca dejo una imagen:
http://fotos.subefotos.com/1409def66bcaf6efd48b1d2bdce10e3fo.jpg

Queria que detectara si el primer numero "400" esta sobre bajo del "400" y si pasa eso lo que haria seria ejecutar "x" accion.
Busque en todos lados sinceramente, pero no entrontre eso.
Encontre GetPixel de todo que tiene que ver con el tema pero no el mismo.

Espero que me puedan ayudar.

Saludos!

Así es, ReadProcessMemory lee desde una posición de memoria tantos bytes, por lo que mostrás, puede leer desde 2 bytes a 4 bytes, si es un juego como leer la vida me imagino que son 4 bytes.

Código (cpp) [Seleccionar]

BOOL WINAPI ReadProcessMemory(
 _In_   HANDLE hProcess,
 _In_   LPCVOID lpBaseAddress,
 _Out_  LPVOID lpBuffer,
 _In_   SIZE_T nSize,
 _Out_  SIZE_T *lpNumberOfBytesRead
);


handle del proceso, (se le hace un OpenProcess 1ro)
posición Address, (ej: 0x004561A0)
salida, (variable tuya)
bytes a leer, (cantidad, ej: 2&, 4&)
0 (vá casi siempre en cero, es para otra cosa)

PD: ReadProcessMemory es indetectable.
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

Zitox

Muchas gracias por responder.
Yo ahora no estoy en pc que tenga el vb
Pero entiendo el code que me pasaste, cuandoi este en pc lo voy a probar.

Si necesito algo que no entiendo respndo por aca, saludos!

Devuelta, graicas por responder! Y por la onda de explicarme bien!
Zitox!

Zitox

#3
Mira use este code (VB 2010):
Public Class Form1
   Private Declare Function WriteProcessMemory Lib "kernel32" Alias "WriteProcessMemory" (ByVal hprocess As Integer, ByVal Address _
                                                                                          As Integer, ByRef Value As Integer, ByVal Size As Integer, ByRef BytesWritten As Integer) As Integer
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
       Timer1.Enabled = True
   End Sub

   Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
       Try
           Dim name As String = "Tutorial-i386"
           Dim hprocess As Process() = Process.GetProcessesByName(name)
           Dim address As Integer = &H2A4D00
           Dim value As Integer = TextBox1.Text
           LblVida.Text = value
           WriteProcessMemory(hprocess(0).Handle, address, value, 4, 0)
       Catch ex As Exception
       End Try
   End Sub

   Private Sub Timer2_Tick(sender As System.Object, e As System.EventArgs) Handles Timer2.Tick
       Try
           Dim name As String = "Tutorial-i386"
           Dim hprocess As Process() = Process.GetProcessesByName(name)
           Dim address As Integer = &H2A4D00
           Dim value As Integer = TextBox1.Text
           WriteProcessMemory(hprocess(0).Handle, address, value, 4, 0)
       Catch ex As Exception
           MsgBox("Engine for Game")
       End Try
   End Sub
End Class


Y puse en el form, un label de name "LblVida" y un texbox1
Pero lo que hace en el textox1 es modificar el dato donde dice "Health: ***" el *** modifica instantáneamente por que es un timer de intervalo 10



Ahora, yo quiero que en ves de dar/modificar el valor que seria el que yo le coloque al textbox1.text que seria 999, revisa el valor del "Health: ****" se entiende?

Entiendo que la solucion seria simple Write es Escribir, y read, es leer, pero no encuentro el mismo code para declararlo de Read

Muchisimas Gracias!
Zitox!

Miseryk

#4
Cita de: Zitox en 11 Marzo 2015, 00:15 AM
Mira use este code (VB 2010):
Public Class Form1
   Private Declare Function WriteProcessMemory Lib "kernel32" Alias "WriteProcessMemory" (ByVal hprocess As Integer, ByVal Address _
                                                                                          As Integer, ByRef Value As Integer, ByVal Size As Integer, ByRef BytesWritten As Integer) As Integer
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
       Timer1.Enabled = True
   End Sub

   Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
       Try
           Dim name As String = "Tutorial-i386"
           Dim hprocess As Process() = Process.GetProcessesByName(name)
           Dim address As Integer = &H2A4D00
           Dim value As Integer = TextBox1.Text
           LblVida.Text = value
           WriteProcessMemory(hprocess(0).Handle, address, value, 4, 0)
       Catch ex As Exception
       End Try
   End Sub

   Private Sub Timer2_Tick(sender As System.Object, e As System.EventArgs) Handles Timer2.Tick
       Try
           Dim name As String = "Tutorial-i386"
           Dim hprocess As Process() = Process.GetProcessesByName(name)
           Dim address As Integer = &H2A4D00
           Dim value As Integer = TextBox1.Text
           WriteProcessMemory(hprocess(0).Handle, address, value, 4, 0)
       Catch ex As Exception
           MsgBox("Engine for Game")
       End Try
   End Sub
End Class


Y puse en el form, un label de name "LblVida" y un texbox1
Pero lo que hace en el textox1 es modificar el dato donde dice "Health: ***" el *** modifica instantáneamente por que es un timer de intervalo 10



Ahora, yo quiero que en ves de dar/modificar el valor que seria el que yo le coloque al textbox1.text que seria 999, revisa el valor del "Health: ****" se entiende?

Entiendo que la solucion seria simple Write es Escribir, y read, es leer, pero no encuentro el mismo code para declararlo de Read

Muchisimas Gracias!
Zitox!

No sé como funciona .NET, pero el address es siempre de 4 bytes (long), lo mismo con el valor, integer = 2 bytes, long = 4 bytes

PD: intentá leerlo 1ro.
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

Zitox

Lo pude lograr, con este code
Declare asi:
Public Declare Function ReadProcessMemory Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Integer, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer

Y adapte los timer asi:
Timer1
Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
        Try
            Dim name As String = "Tutorial-i386"
            Dim hprocess As Process() = Process.GetProcessesByName(name)
            Dim Ipbaseaddress As Integer = &H1874D00
            Dim IpBuffer As Integer = TextBox1.Text
            LblVida.Text = value
            ReadProcessMemory(hprocess(0).Handle, Ipbaseaddress, value, 4, 0)
        Catch ex As Exception
        End Try
    End Sub

Timer2
Private Sub Timer2_Tick(sender As System.Object, e As System.EventArgs) Handles Timer2.Tick
        Try
            Dim name As String = "Tutorial-i386"
            Dim hprocess As Process() = Process.GetProcessesByName(name)
            Dim Ipbaseaddress As Integer = &H1874D00
            Dim IpBuffer As Integer = TextBox1.Text
            ReadProcessMemory(hprocess(0).Handle, Ipbaseaddress, value, 4, 0)
        Catch ex As Exception
            MsgBox("Engine for Game")
        End Try
    End Sub
End Class


Para que lo tengan, y depaso tambien lo sepan!
Saludos! Y gracias por toda la ayuda!!

Miseryk

#6
Cuando leés una posición de memoria como por ejemplo:

Código (vb) [Seleccionar]

ReadProcessMemory(hprocess(0).Handle, Ipbaseaddress, value, 4, 0)


Bueno, el Ipbaseaddress lo tenés que saber de antemano, la variable "value" tiene que ser de X cantidad de bytes como el siguiente parámetro, en este caso 4.

Luego vas a obtener los 4 bytes desde esa posición de memoria, con lo cual luego podrías hacer:

Código (vb) [Seleccionar]

TextBox1.Text = value


y listo, verías el valor leído en el textbox, ésto es muy eficiente para leer ciertas regiones de memoria para saber si te modificaron algo o no, como por ejemplo GetTickCount() por un speedhack. (Si está hookeada usualmente hay un JMP o un MOV EAX seguido del JMP EAX)

Edit:
PD: Cada vez que se hace un OpenProcess hay que hacer un CloseHandle, otra cosa, con que abras una vez sóla el proceso ya es suficiente, dejá la variable como global y listo.
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!