pregunta convertir

Iniciado por thearing, 18 Marzo 2011, 18:07 PM

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

thearing

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!

raul338

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

Cromatico

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:
31 30 30 2F 31 30 30 00 04 00
que en la tabla: 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?

raul338

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)

Cromatico

#4
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...
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

raul338

La verdad no entendi nada :xD , y esa linea de codigo sola mucho no me ayuda

Cromatico

#6
Disculpa xD, aver si puedo explicar mejor...

Te dejo una imagen de lo que obtengo desde el cheat engine, seguramente esta mas claro:


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:
ReadProcessMem phandle, address, valbuffer, 4, 0&

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

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

raul338

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

Cromatico

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?
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

raul338

Si, pondria ByVal a lpNumberOfBytesWritten y ... quisiera saber que tipo de variable le estas pasando a lpBuffer ?

Yo haria asi

Código (vb) [Seleccionar]

Dim bArrayTemp(10) as Byte
Call ReadProcessMem(phandle, address, VarPtr(bArrayTemp(0)), 10, 0&)