Holas :).
Estoy intentando reemplazar un string de otra aplicacion en memoria pero no logre nada :\.
Me podrian decir los orrores que tiene esto xd.
int main()
{
char data[] = "asd";
DWORD pid;
HANDLE process;
HWND wnd = FindWindow(0, "ventana");
GetWindowThreadProcessId(wnd, &pid);
process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if(process==NULL)
printf("Error abriendo el proceso.\n");
else
printf("Proceso abierto.\n");
if(WriteProcessMemory(process, (LPVOID)00405254, (LPVOID)&data, strlen(data), NULL) == 0)
printf("Error escribiendo memoria.\n");
else
printf("Memoria Escrita.\n");
CloseHandle(process);
system("PAUSE");
return 0;
}
La direccion de memoria la saque con el ida.
.rdata:00405254 00000018 C No hay nuevas verciones
Trank :).
@EDIT
me olvidaba,el ultimo printf lo manda bien,pero en la otra aplicacion el msgbox sigue siendo el mismo "No hay nuevas verciones".
Un detalle la dirección que encontraste es decimal u octal? Porque cuando llamas a WriteProcessMemory le estas pasando una dirección en octal OJO, si es decimal quita todos los ceros a la izquierda que tengas.
EDIT:
Estoy casi seguro que tu problema es que estas poniendo la dirección en octal, y de igual manera escribirá en la memoria del proceso solo que en una dirección que no quieres escribir.
WriteProcessMemory(process, (LPVOID)405254, (LPVOID)&data, strlen(data), NULL)
En PC las direcciones se anotan en hexadecimal casi siempre, 0x405254 en este caso.
Ahora no escribe en la memoria :\.
Error 998 El acceso a la dirección de memoria no es válido.
Gracias :).
Copia la dirección que estás intentando escribir, busca algún debugger o programa para mostrar la memoria de un proceso y dirígete a esa parte, entonces mira las banderas de acceso y revisa si tiene datos esa dirección.
Tenes que llamar a VirtualProtectEx para darte permisos de escritura.
Cita de: Eternal Idol en 27 Noviembre 2011, 11:40 AM
Tenes que llamar a VirtualProtectEx para darte permisos de escritura.
Que directo tío xDDDDDDDDDDDDDDDDD.
ok,en un rato pruebo y les cuento,gracias :).
we,no lo pudo hacer ;(.
esto es lo ultim que probe (probe como 20 cosas mas u.u).
int main()
{
char data[] = "asd";
DWORD pid;
HANDLE process;
HWND wnd = FindWindow(0, "ventana");
GetWindowThreadProcessId(wnd, &pid);
process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if(process==NULL)
printf("[-] Error abriendo proceso.\n");
else
printf("[+] Proceso abierto.\n");
VirtualProtectEx(process, (LPVOID)0x405254, 18, 1|2, 0);
if(WriteProcessMemory(process, (LPVOID)0x405254, (LPVOID)&data, strlen(data), NULL) == 0)
printf("[-] Error escribiendo memoria:%d\n", GetLastError());
else
printf("[+] Memoria Escrita.\n");
CloseHandle(process);
system("PAUSE");
return 0;
}
¿Te fijaste que devuelve VirtualProtectEx? En la MSDN dice expresamente:
lpflOldProtect [out]
A pointer to a variable that receives the previous access protection of the first page in the specified region of pages. If this parameter is NULL or does not point to a valid variable, the function fails.
¿1|2? ¿Que intentabas hacer con esa mascara? ¿PAGE_NOACCESS y PAGE_READONLY? Deberias pasarle PAGE_READWRITE.
Ahora me fijo.Eso de 1|2 fue lo ultimo que probe xd,lo saque de un modulo de amxmodx que escribe/lee datos en la memoria del motor del juego.
@EDIT
Hay anda :),gracias idolo :P.
De nadas ::)