• Buscar y reemplazar bytes en runtime (loader)

 #311950  por linkgl
 04 Ago 2011, 21:14
Gracias a m4rty me interesaron hace un rato los loaders, este que hice reemplaza ciertos bytes las veces que lo encuentre o la cantidad de veces que tú le indiques partiendo desde una dirección, es decir si yo quiero rellenar 3 bytes nulos 0x00 0x00 0x00 por NOP's (para que querría hacer eso jejeje) pues uso la funcion y le doy como ultimo parametro un 3:
Código: [ Debe registrarse para ver este enlace ]
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
 
DWORD MassiveReplace(DWORD inicio,LPVOID bytes,LPVOID replace,LPSTR proceso,DWORD tam,DWORD limite)
{
/* 
@Coder->Linkgl
  @Docs:msdn
    @Este código puede ser editado/modificado, respetando los créditos
*/
  //Estructuras necesarias para las API's siguientes
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  //Llenamos las estructuras con 00 para evitar errores
  ZeroMemory(&si, sizeof(si));
  ZeroMemory(&pi, sizeof(pi));
  //Indicamos el tamaño de la estructura
  si.cb = sizeof(si);
  // -->Variables necesarias <--
  DWORD leidos;
  DWORD contador=0;
  char *value;
  // -->Reservamos el espacio necesario en memoria
  // y lo limpiamos <--
  value=(char *)malloc(tam);
  memset(value,0,tam);
  //-->Creamos el proceso
  if(CreateProcess(proceso,"",NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi))
  {
    //-->Bucle para leer los bytes desde la direccion indicada en bloques
    // del tamaño indicado 
    while(ReadProcessMemory(pi.hProcess, (LPVOID)inicio, &value, tam, &leidos))
    {
      //->PRINTF Para debuggear la funcion en caso de error
      //printf("%x -> %s -> %s ->%d\n",inicio,&value,bytes,leidos);
      //memset(value,0,tam+10);
      //getchar(); 
      //->findebug
      //->comparamos ambos punteros
      if(memcmp(bytes,&value,tam)==0)
      {
        //->si son iguales terminamos el proceso en el que trabajamos
        // y retornamos la direccion en memoria donde encontramos los
        // bytes
        if(contador<limite)
        {
          //Reservamos la memoria en esa direccion con un tamaño de la longitud de los bytes
          VirtualProtectEx(pi.hProcess,(LPVOID)inicio,tam,0x40,&leidos);
          //Escribimos los nuevos bytes en la direccion en memoria
          WriteProcessMemory(pi.hProcess,(LPVOID)inicio,replace,tam,&leidos);
          //Incrementamos el contador
          contador++;
        }
      }
      //->Incrementamos la direccion en memoria al siguiente bloque a leer
      inicio++;
      //Sleep(100); si son muchos los bytes a buscar mejor le ponemos un pequeño sleep
    }
    //-->Continuamos el hilo
    ResumeThread(pi.hThread);
   // TerminateProcess(pi.hProcess,0);
    return contador;
  }
  else
  {
    return 0;
  }
}
 
int main()
{
  //->Ejemplo de uso  
  char buscar[4]={0x00,0x00,0x00};
  char reemplazar[4]={0x90,0x90,0x90};
  int posicion=MassiveReplace(0x401000,buscar,reemplazar,"c:\\crackme2.exe",3,3);
  if(posicion!=0)
    printf("Se reemplazaron-> %d bytes",posicion);
  else printf("no se encontro %s en la memoria virtual del programa",buscar);
  getchar();
  return 0;
}
Uso:MassiveReplace(VirtualAddress_inicial,buscar,reemplazar,rutadelprograma,longitud_de_bytes_a_buscar/reemplazar,Cantidad_de_veces_que_se_buscaran_los_bytes);

PD:Jejeje seguro tiene varios errores pero surgió en un momento realmente inesperado

Edito-> Casi lo olvido, retorna la cantidad de veces que se logró reemplazar los bytes si devuelve el numero que le pusiste al ultimo quiere decir que todo salió bien