Hola chicos/as como estais?
Bueno el caso es que tengo un codigo que mapea una libreria DLL,,que es este:
const long addres = 0X3DE00;
HANDLE Archivo = CreateFile("Libreria.DLL",GENERIC_READ+GENERIC_WRITE....
int size = GetFileSize(Archivo,0);
HANDLE MAPA = CreateFileMapping(Archivo,0,PAGE_READWRITE,0,size,0);
HANDLE View = MapViewOfFile(MAPA,FILE_MAP_ALL_ACCESS,0,0,0);
asta alli bien,pero ahora necesito escribir un texto (char) en la direccion expuesta mas arriba la de la constante,es decir esa direccion esta dentro de la libreria,la busque con WinHex,busque en google i me encontre con la funcion memcpy,la probe pero nada,y creo que no la se utilizar bien esa funcion :S
yo probe conesto:
ptr = &View+addres;
*ptr = "Hola";
pero nada :'( soy tonta o pasa algo,alguna sugerencia?
un beso(K)
WriteFile() (http://msdn.microsoft.com/en-us/library/aa365747(VS.85).aspx) + SetFilePointer() (http://msdn.microsoft.com/en-us/library/aa365541(VS.85).aspx). O quizás WriteProcessMemory() (http://msdn.microsoft.com/en-us/library/ms681674(VS.85).aspx).
Saludos :P
MapViewOfFile no retorna un HANDLE sino un puntero (LPVOID). Con el ampersand sobre View lo que obtenes es la direccion de memoria de la variable y lo que realmente queres es el valor devuelto por MapViewOfFile, es decir la direccion base del mappeo hecho en memoria.
memcpy (http://www.cplusplus.com/reference/clibrary/cstring/memcpy/).
osea enteindo que MapViewOfFile ya devuelve una direcion de memoria?? :S
Probe asin:
View = MapViewOfFile(MAPA,FILE_MAP_ALL_ACCESS,0,0,0);
memcpy(View,mensa,sizeof(mensa));
i si que me escribe en el DLL pero sale mal ya que no tiene una direccion de memoria exacta a escribir:S
que boba soy :(
Si, devuelve un puntero, siempre consulta la MSDN: MapViewOfFile (http://msdn.microsoft.com/en-us/library/aa366761(VS.85).aspx).
Tenes que declarar otro puntero para usar el offset pero no con &View (por lo que explique antes) sino con View.
No entiendo muy bien asin?
ptr = View;
??
como indico la direccion a escribir alli?
probe con esto:
ptr = View+Direccion;
pero no funciono por cierto el ptr es de tipo VOID
(K)
repasate los punteros.
ptr = View, para eso directamente declara View por ejemplo void *View ahi tienes siempre tu base.
Si, algo asi:
char *ptr = (char*)View + Direccion;
Hola bueno el code me quedo asina alfinal:
#include <C:\Dev-Cpp\All.h>
using namespace std;
int main(void)
{
const long addres = 0X3DE00;
char Mensa[]="jeje";
HANDLE Archivo = CreateFile("Mensa.dll",0,GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTING,0);
int size = GetFileSize(Archivo,0);
HANDLE MAPA = CreateFileMapping(Archivo,0,PAGE_READWRITE,0,size,0);
void* View = MapViewOfFile(MAPA,FILE_MAP_ALL_ACCESS,0,0,0);
char *ptr = (char*)View+addres;
memcpy(ptr,Mensa,sizeof(Mensa));
return 0;
}
pero nada,no me modifica la dll, :(
Tenes que depurar tus programas, ya el CreateFile esta mal. Comproba los parametros (busca esta funcion en la MSDN para mayor precision):
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
He tenias razon,el CreateFile estaba mal,admas ya me funciono ya esta conseguido,un saludo Eternal (K) yy gracias a todos tambien
De nada.