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 !
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
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#
ese es el problema, la zona de memoria está en la .rdata. Me pregunto si programáticamente se puede hacer esa zona RW
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).