problemas al intentar reemplazar string en la memoria.

Iniciado por Destro-, 26 Noviembre 2011, 17:17 PM

0 Miembros y 2 Visitantes están viendo este tema.

Destro-

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".

naderST

#1
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)

Eternal Idol

En PC las direcciones se anotan en hexadecimal casi siempre, 0x405254 en este caso.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Destro-

#3
Ahora no escribe en la memoria :\.
Error 998 El acceso a la dirección de memoria no es válido.

Gracias :).

Unbr0ken

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.
Cita de: SnowcrashDiscutir con desconocidos por internet es un ejercicio de imbéciles; todos acaban siendo quinceañeros arrogantes con cantidades infinitas de tiempo libre.

NO resuelvo dudas vía MP, para algo está el foro.

Eternal Idol

Tenes que llamar a VirtualProtectEx para darte permisos de escritura.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Unbr0ken

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.
Cita de: SnowcrashDiscutir con desconocidos por internet es un ejercicio de imbéciles; todos acaban siendo quinceañeros arrogantes con cantidades infinitas de tiempo libre.

NO resuelvo dudas vía MP, para algo está el foro.

Destro-


Destro-

#8
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;
}

Eternal Idol

¿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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón