Código: Seleccionar todo
#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;
}
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