Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: thearing en 18 Marzo 2011, 18:07 pm



Título: pregunta convertir
Publicado por: thearing en 18 Marzo 2011, 18:07 pm
Holaaa que tal una pregunta...
Estoy usando el cheat engine para leer un address de memoria de un proceso...
Resulta que es el caption de un label, pude encontrar el pointer (tiene 5 offsets) y tambien leerlo hasta llegar al address dinamico desde vb...

Pero resulta que desde vb, obtengo el value en 4bytes, 2bytes 1byte, y lo que necesito es que lo detecte como el cheat engine cuando ponemos en TYPE: "Text" y lo convierte a texto automaticamente...
Y no se como hacer para convertirlo desde vb directamente!
Alguien puede darme alguna mano?

por ejemplo tengo esto:
En 4bytes, el value que detecta es: "791687217" (en decimal) y en hexadecimal es: "2F303031"
Ahora cuando en el cheat engine pongo en TYPE: Text, el value es: "100/100"

Queria saber si es posible eso desde vb directamente, gracias!


Título: Re: pregunta convertir
Publicado por: raul338 en 18 Marzo 2011, 19:13 pm
Lo obtienes en formato string o long?
Tendrias que tomar cada 2 letras del valor hexadecimal y usar ese valor como ascii para agregarlo a otro string

2F = 47 = 1 en la tabla ASCII :P

Usa las funciones de string: Asc, y Mid


Título: Re: pregunta convertir
Publicado por: Cromatico en 18 Marzo 2011, 23:27 pm
Hola reaul338 gracias por contestar, yo leia desde vb en 4 bytes, pero ahora estuve mirando y si pongo array of byte en el cheat engine, me tira:
Código:
31 30 30 2F 31 30 30 00 04 00
que en la tabla:
Código:
http://www.asciitable.com/
es exactamente "100/100"

Lo que vos me dijiste 2F=47=1 no pude ubicarlo en la tabla, no lo encontre...

Ahora la pregunta es, como hago para leer en array of bytes, en vez de 4 bytes desde vb? Tendria que saber la longitud de la cadena tambien... Alguna idea?


Título: Re: pregunta convertir
Publicado por: raul338 en 18 Marzo 2011, 23:31 pm
Ahh... no no, mala mia, pense cualquier cosa. Mira, Un string esta formado por una cadena de caracteres y que termina en 0

Bajo esa condicion, podes hacer un bucle con RtlMoveMemory a un byte temporal y agregalo a un vector de bytes hasta que el byte temporal sea 0 y de ahi convertir el vector a string usando StrConv

El problema es que si no termina en 0 podes quedarte en bucle infinito (a menos que pongas un limite :xD)


Título: Re: pregunta convertir
Publicado por: Cromatico en 19 Marzo 2011, 00:01 am
Por lo que estuve mirando, los ultimos 3 (por ejem: "00 00 65") no forman parte del texto que yo quiero, asi que podria utilizar el primer null "00" para leer hasta ahi con readprocessmemory...

Igual tengo un problema, no logro leer el array completo...
Código:
ReadProcessMem phandle, address, valbuffer, 4, 0&

Me devuelve
"791687217" o hex("791687217") = "2F303031" (esto es lo mismo que me detecta el cheat engine si pongo 4bytes en TYPE.

Pero si pongo en el cheat engine en TYPE, array of bytes, me detecta:
"31 30 30 2F 31 30 30 00 00 65" (Lenght 10) aunque yo podria cortarlo en el primer "00" eso no importa por ahora

Y el array que tendria que recibir en vb es:
"31 30 30 2F 31 30 30  00 00 65", no entiendo como convertirlo a esto!

Gracias y perdon mi ignorancia :P


Título: Re: pregunta convertir
Publicado por: raul338 en 19 Marzo 2011, 00:09 am
La verdad no entendi nada :xD , y esa linea de codigo sola mucho no me ayuda


Título: Re: pregunta convertir
Publicado por: Cromatico en 19 Marzo 2011, 00:29 am
Disculpa xD, aver si puedo explicar mejor...

Te dejo una imagen de lo que obtengo desde el cheat engine, seguramente esta mas claro:
(http://www.uploadimage.com.ar/images/62279156064044872050.png)

Entonces yo puedo leer correctamente desde vb la segunda y tercera fila, pero lo que intento obtener es el TEXTO, entonces tengo entendido que necesito leer el formato de la 4ta fila, para desp convertirlos a letras... Que es lo que no logro hacer, leer en array of bytes hasta el 00.

XD gracias por ayudarrrme :)

EDIT: Recien me doy cuenta que habia posteado con mi usuario viejo jajajajaj

edit2:
Desde vb si leo en 4bytes:
Código:
ReadProcessMem phandle, address, valbuffer, 4, 0&

obtengo lo de la 2da columna (4bytes decimal)
y si lo convierto de esta manera:

Código:
Private Sub Form_Load()
MsgBox StrReverse(DecimalToString(791687217))
End Sub

Private Function DecimalToString(ByVal Number As Long) As String
    Dim r As Long
    Do While Number > 255
        r = Number Mod 256
        Number = Number \ 256
        DecimalToString = Chr$(r) & DecimalToString
    Loop
    DecimalToString = Chr$(Number) & DecimalToString
End Function

Obtengo la primera parte del texto: "100/" nada mas :S


Título: Re: pregunta convertir
Publicado por: raul338 en 19 Marzo 2011, 01:11 am
Porque si te pones a pensar, son 4 bytes, son 4 caracteres que estas leyendo :P Ponle mas espacio y obtendras todo y mas :xD

Pon por ejemplo, 10 y haces un split(Texto, vbNullChar) y te quedas con la primera parte :P


Título: Re: pregunta convertir
Publicado por: Cromatico en 19 Marzo 2011, 01:42 am
Si fue lo primero que intente pero por mas que el 4 lo cambie por 10, 8 u lo que sea, me sigue leyendo lo mismo :(
Habra que cambiar algo en la declaracion?
Código:
Public Declare Function ReadProcessMem Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByRef lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long


Título: Re: pregunta convertir
Publicado por: raul338 en 19 Marzo 2011, 01:50 am
Si, pondria ByVal a lpNumberOfBytesWritten y ... quisiera saber que tipo de variable le estas pasando a lpBuffer ?

Yo haria asi

Código
  1. Dim bArrayTemp(10) as Byte
  2. Call ReadProcessMem(phandle, address, VarPtr(bArrayTemp(0)), 10, 0&)
  3.  


Título: Re: pregunta convertir
Publicado por: Cromatico en 19 Marzo 2011, 02:06 am
Listo quedo asi:
Código:
Public Declare Function ReadProcessMem Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByRef lpBuffer As Any, ByVal nSize As Long, ByVal lpNumberOfBytesWritten As Long) As Long

Me devuelve algo raro :S

Te dejo todo por las dudas:
X=LONG
Código:
Call Read(&HF227D8, "CaptionVentana", X)

Funcion Read:
Código:
Public Function Read(address As Long, gamewindowtext As String, valbuffer As Long)
Dim hWnd As Long
Dim pid As Long
Dim phandle As Long
hWnd = FindWindow(vbNullString, gamewindowtext)
If (hWnd = 0) Then
Exit Function
End If
GetWindowThreadProcessId hWnd, pid
phandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
If (phandle = 0) Then
Exit Function
End If
Dim bArrayTemp(10) As Byte
Call ReadProcessMem(phandle, address, VarPtr(bArrayTemp(0)), 10, 0&)
X = VarPtr(bArrayTemp(0))
End Function

Estoy poniendo cualquiera quizas pero cada ves que ejecuto me devuelve 2 valores diferentes en X.


Título: Re: pregunta convertir
Publicado por: Cromatico en 19 Marzo 2011, 02:47 am
Ya me funcionooooooooo, muchisimas gracias!!!!


Título: Re: pregunta convertir
Publicado por: raul338 en 19 Marzo 2011, 04:31 am
Con ese codigo lo resolviste?