Extraño error con WriteProcessMemory

Iniciado por arfgh, 3 Julio 2016, 20:43 PM

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

arfgh

Hola amigos.

tengo un problema muy extraño usando la api WriteProcessMemory
Resulta que en mi programa uso esa api un montón de veces sin problema  de ningún tipo, pero ahora por alguna extraña razón y con un offset determinado lee pero no escribe.

Declare Function WriteProcessSingle Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Long, ByVal lpBaseAddress As Any,
ByRef lpBuffer As Single, ByVal nSize As Long, ByRef lpNumberOfBytesWritten As Long) As Boolean

   dim datos as single
   ret = ReadProcessMemory(handle, offset, datos, 4, written)
   datos = datos * 2 / 0,0025683
   ret = WriteProcessMemorySingle(handle, offset, datos, 4, written)
   Debug.Print ret, written



resutado del debug: false, 0 No ha escrito los datos.
No entiendo el por qué de este problema.

comentaros que he intentado usar el getlasterror de esta manera:


   buffer = Space(200)
   Debug.Print FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0&, GetLastError, SUBLANG_DEFAULT, buffer, 200, 0&)


y el resultado ha sido '.46', no sé si sería posible obtener algún string respecto a ese lasterror.....

Deciros que el handle es correcto, etc etc. Si he cometido un error pues estoy ciego y no lo veo. No obstante el proceso lo he abierto de esta forma:


       CreateProcess vbNullString, app.path & "\test.exe " & Command & commandline, _
           ByVal 0&, ByVal 0&, 1&, CREATE_SUSPENDED, ByVal 0&, revolt, sInfo, pInfo


también comentarios que he intentado abrir el proceso de esta forma, con el mismo resultado de no poder escribir en ese offset:


OpenProcess(PROCESS_ALL_ACCESS, False, pid)


Ayuda !

Eleкtro

Llama a la función Win32 GetLastError sin intentar formatear el mensaje para mostrarnos que código de error exacto te indica, '.46' no es nada válido.

PD: No utilizo VB6, lo tengo más que oxidado, pero al menos podría ayudarte con el significado del código de error Win32 que estés obteniendo.

Saludos








BloodSharp

Cita de: arfgh en  3 Julio 2016, 20:43 PM
Hola amigos.

tengo un problema muy extraño usando la api WriteProcessMemory
Resulta que en mi programa uso esa api un montón de veces sin problema  de ningún tipo, pero ahora por alguna extraña razón y con un offset determinado lee pero no escribe.

dim datos as single
ret = ReadProcessMemory(handle, offset, datos, 4, written)
datos = datos * 2 / 0,0025683
ret = WriteProcessMemorySingle(handle, offset, datos, 4, written)
Debug.Print ret, written


resutado del debug: false, 0 No ha escrito los datos.
No entiendo el por qué de este problema.
Ayuda !

¿Verificaste que la/s página/s de la memoria virtual que estás editando tenga permisos de escritura? Porque según tu código no lo hacés...


B#



arfgh

ese es el problema, la zona de memoria está en la .rdata. Me pregunto si programáticamente se puede hacer esa zona RW

MCKSys Argentina

Cita de: arfgh en  9 Julio 2016, 11:53 AM
ese es el problema, la zona de memoria está en la .rdata. Me pregunto si programáticamente se puede hacer esa zona RW

A la API WriteProcessMemory no le importa si la sección de memoria tiene o no permisos de escritura. Sólo le importa que el handle sea válido para escribir y que la memoria a escribir esté mapeada.

Saludos!

EDIT: Para ver dónde te falla, abre tu programa con Olly y pon un BP en la API. Luego de ejecutar la misma, Olly mostrará el valor de GetLastError (lo hace siempre).
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."